Bulwark

Safer-by-default scaffolding for agent-generated codebases.

Bulwark is a checklist of protections a software project should have, and a program that runs every week to confirm each one is still switched on and still doing its job. It reports the result in plain sentences, with a count of what it examined.


Switching a safeguard on is easy. Knowing it is still on, a month later, is the hard part.

A typical project has a dozen or more protections: a lock on the main branch so nothing lands without review, a rule that new packages wait a few days before install, a scanner for leaked passwords, checks that stop tests being quietly skipped. Each one was switched on by somebody, once.

Each one can also be switched off with a one-line change, or can keep running while no longer checking anything — a folder gets renamed and the scanner's file pattern stops matching; a credential expires and a tool falls back to a mode that inspects nothing. In most cases the tool still reports success.

With coding agents doing much of the work, these changes happen more often and with less review. An agent told to "make the build pass" can fix the problem or loosen the check, and loosening is easier. Bulwark is the part of the setup that notices.


What Bulwark does

Checks every protection, weekly, in one page.

The checklist

Thirty-five one-sentence conditions — the main branch is protected, new packages wait three days, no test was skipped since last week.

The checker

One small program, nothing to install. It reads the project and the platform settings and reports pass or fail for each condition.

The count

Every line says how much was examined. A tool that ran but inspected nothing is a failure, not a pass.

The schedule

You pick how often it runs. Bulwark confirms it actually ran, so a dead schedule is a failure too.

A report, as it appears
The default branch is protected · 1 review requiredpass
Lint checked every source file · 1,348 of 1,348pass
New packages wait three days · 212 packagespass
The secret scanner ran this week · no run in 7 daysfail
No new skipped tests · 4 skipped, 4 last weekpass

One sentence, one verdict, one number per line. The whole report reads in under a minute.


Twelve weeks, one repository

Eight ordinary incidents. Two very different outcomes.

Each incident below happens to the same project. On the left, the project has its protections switched on and nobody re-checking them. On the right, the same project runs Bulwark every week. Each incident is marked as an accident or a deliberate shortcut.

Without Bulwark · unnoticed0
With Bulwark · caught0
Week 1Accident

An agent installs a package that was published yesterday.

A small utility, one day old. Packages this new are the ones most often found to be hijacked, and nobody has had time to notice.

Without Bulwark

The install succeeds. The package runs on every developer's machine and in production.

Installed, unnoticed
With Bulwark

The package manager is set to refuse versions younger than three days, and Bulwark confirms that setting is in force every week.

Refused at installthree-day wait in force · 212 packages checked
Week 2Accident

A folder is renamed, and the code checker stops seeing it.

The rule that finds dangerous code is tied to the old folder name. It still runs and still reports zero warnings — over nineteen fewer files.

Without Bulwark

Zero warnings, every week. The nineteen files are never checked again.

Reads as clean
With Bulwark

Bulwark counts the source files in the repository and compares that number with the files the checker reported reading.

Caught the same week1,329 checked of 1,348 · the 19 missing files named
Week 3Deliberate

A failing test is marked "skip" so the build goes green.

Under deadline, one word is added to one test. The test no longer runs, and the build passes.

Without Bulwark

The build is green. The bug that test was catching ships to customers.

Shipped
With Bulwark

The number of skipped tests is recorded and may not go up. Bulwark re-counts and names the file.

Caught in review4,934 tests · 5 skipped, was 4
Week 5Accident

Branch protection is switched off for a quick fix and never switched back on.

An administrator lifts the lock on the main branch to push a hotfix directly, then moves on to the next thing.

Without Bulwark

The lock stays off. From now on, any change can land without anyone reviewing it.

Off indefinitely
With Bulwark

Bulwark asks the hosting platform directly whether the branch is protected and how many reviews it requires.

Caught on the next runprotection absent · 1 review required, 0 enforced
Week 6Deliberate

A build step is pointed at a moving version instead of a fixed one.

A third-party build action is referenced by a name its publisher can later point anywhere. Whatever it points at tomorrow runs with the project's credentials.

Without Bulwark

Nothing changes today. If the publisher is ever compromised, the project runs their code.

Exposed
With Bulwark

Every build action must be pinned to an exact version. Bulwark reads every workflow file and names any that is not.

Caught in review8 workflows · 40 actions · 1 unpinned, named
Week 8Accident

The password scanner stops running.

A build workflow is reorganised and the scanning step is dropped. The dashboard shows no leaked credentials — exactly what it showed when the scanner was working.

Without Bulwark

"No findings" and "did not run" look identical. Nobody notices for months.

Silence, read as safety
With Bulwark

Bulwark looks for a scan result each week, not for an absence of findings. No result is a failure.

Caught the same weekno scanner run in 7 days · last result 9 days old
Week 10Deliberate

The coding agent's permissions are widened to "allow everything".

To stop it asking for approval, one rule in its settings is changed to permit any command. It can now delete, publish or send whatever it is told to — including by text it reads from the internet.

Without Bulwark

The rule stays. It is undone only if somebody happens to open that settings file.

Unbounded
With Bulwark

Bulwark reads the agent's permission rules the way it reads any other setting, and flags any rule that allows an unrestricted shell.

Caught in review129 rules read · 1 unbounded, named
Week 12Accident

The weekly safety check itself stops running.

A scheduled job dies quietly — an expired credential, a renamed file. Nothing fails, because nothing runs. The last green result stays on the dashboard.

Without Bulwark

Everyone remembers the check as passing. It has not run in weeks.

Remembered as green
With Bulwark

One condition reads the platform's record of runs and compares the gap with the schedule you chose. A missing run is a failure.

Caught by the first person to looklast run 9 days ago · schedule is 7
After twelve weeks, without
8

problems in the codebase. None known. Every dashboard green.

After twelve weeks, with
8

problems found, each within a week, each with the number that shows the check really ran.


What you get

Six things Bulwark gives a project.

A weekly one-page report

Thirty-five sentences, each with pass or fail and a count. Readable by anyone on the team, technical or not.

Coverage of every protection, not just the code

Repository settings, build pipelines, dependency installs, test suites, secret scanning and the coding agent's own permissions are all on the list.

No cost and no dependencies

One program, running on the tools your project already has. No subscription, no vendor account, and nothing added to your supply chain.

A safe first run

The first run measures and blocks nothing. Enforcement is switched on afterwards, one area at a time, from what the measurement showed.

A single, visible way to make exceptions

Every exception is a dated entry in one file, with a reason and one of four types. Adding one shows up in code review. There is no other bypass.

Rules that cannot be edited from inside the project

Every threshold comes from a fixed, versioned copy of the checklist. Nothing the project itself contains can lower a floor.


What it is not

Three things Bulwark does not do.

It does not certify a project as safe. It reports the specific problems it knows how to find, and where it found them. It never reports that there are no others.

It does not install protections. Existing tools do that. Bulwark confirms they are still on and still checking something.

It does not replace review. It puts the right facts in front of a reviewer each week; a person still decides what to do about them.