NFTBan Development Methodology: Evidence-Driven Security Engineering #1168
itcmsgr
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
NFTBan started as a single-purpose Linux intrusion-prevention tool. It has grown into a broader Linux security and enforcement project built around nftables, a Go daemon (
nftband), package-native deployment as DEB and RPM, multiple detection sources, operational health reporting, and release evidence bound to specific commits.That growth changed what "done" has to mean.
This post describes the development methodology that follows from that sentence, and the roadmap it produces.
Why the development process changed
As the test and CI surface got stronger, it began exposing assumptions that older checks did not measure. None of these were exotic. All of them were the ordinary result of validation catching up with a codebase:
These findings did not mean validation was failing. They meant previously unmeasured behaviour was becoming visible.
The new methodology
1. One product source authority
Remote
mainis the authoritative product source. Branches start from clean, currentmain. Historical archives and statistics branches are explicitly classified as non-product authorities — they exist, they are useful, and they are not a source that product changes may be taken from.2. Exact-commit validation
Evidence binds to an exact commit. If the commit changes, the evidence does not carry forward. A validation result is a statement about one specific tree, not about a branch name.
3. PR green does not mean every path executed
Distinct validation planes are tracked separately:
mainA path that did not run is recorded as untested, not as passed. A skipped job is an absence of evidence.
4. Human approval for protected release gates
Automation may prepare and dispatch work. Protected execution requires deliberate human approval. The record retains the exact commit, the requesting actor, the approving actor, the approval time, and the gate result.
5. Package-native proof
Real package transitions are validated independently for DEB and RPM:
6. Failure paths are first-class
Negative controls, injected failure cases, recovery verification, rollback evidence, and proof that a test exercised what it claims to exercise. The standing rule:
A test that passes because the failure was never injected has measured nothing.
7. One authority for each operational fact
Each of the following has a single authority that produces it:
The goal is consolidation, not more status systems. Adding a second reporter for an existing fact is the problem being solved, not the solution.
The roadmap
Current phase
This is the work in v1.228.0, published on 27 July 2026. Its central change is at the package boundary: a package manager reports success when the payload unpacks, not when the installer succeeds. The DEB and RPM post-install paths now emit a machine-readable result that distinguishes a verified installation from a transaction that merely completed, and freshness is evaluated before the recorded state value — a stored result from an earlier transaction is not accepted as evidence about the current one.
The release notes also record what was not proven, in the same place as what was: a pre-transition boundary case that remains unverified, and an SELinux-enforcing validation gap on one packaging family. Recording the unproven alongside the proven is the point of the methodology described above.
Next authority phases
Parallel maintenance work
Low-risk maintenance will not be mixed into changes that touch firewall semantics, update-state authority, package scriptlets, runtime mode resolution, or shared security decisions. Those changes are separated so that a small fix cannot ride along with a security-relevant one.
Why this may look slower
Authority work has a wide validation surface. A single change to how a fact is produced has to hold across:
That is the cost of establishing an authority once. The return is reuse: the next feature that needs the same fact inherits the proof surface instead of rebuilding it. That is the intended payoff — less rework per change in the same area, and failure modes that are already characterised before the change lands.
What users should expect
To be plain about the objective: it is not an empty open register. An active security project always carries maintenance, compatibility and hardening work, and a register that reaches zero usually means the register stopped being honest. The meaningful measure is different:
Human responsibility remains central
AI-assisted tools are used in this project. They help with code review, investigation, documentation, and hypothesis generation.
They are not the release authority.
Security-impacting changes still require measured evidence, human review, exact-commit gates, package-native validation, and explicit release approval. A protected gate requires an explicit human approval, and that approval is recorded.
See
AI_ASSISTED_DEVELOPMENT.mdandGOVERNANCE.mdfor the current policy.Thanks
Thank you to everyone running NFTBan, filing issues, and reporting behaviour that did not match the documentation. A report that contradicts the documentation is how an unmeasured path becomes a measured one.
All reactions