Workban Guard
Everything Workban Guard checks.
Every rule and detector, straight from the code. Rules check every command and file access before it runs. Detectors check every new line after it is written. On top of that comes what the agent reads.
- 39 rules
- 33 detectors
- 7 rules for reads
- Runs locally
Before it runs
Checks every command and file access. Blocks means the action does not run. Asks means you decide.
File system
fs.rm-catastrophicBlocksDeleting or moving /, home, system directories, the project itself or .git; formatting disks (mkfs, dd of=/dev/…, diskutil erase)fs.rm-outsideAsksDeleting, emptying or overwriting outside the project (temp directories excepted)fs.rm-trackedAsksRecursively deleting directories with tracked files or unknown targets (rm -r, rsync --delete, tar --remove-files)fs.find-deleteAsksfind -delete/find -exec rmoutside artifact directories
Git
git.discard-changesAsksreset --hard/--merge, checkout/restore of files, clean -f, rm -f, stash drop/clear, branch -D/-f/-Mgit.force-pushBlocksForce push or --mirror to protected branches, deleting protected branchesgit.force-push-branchAsksForce push (--force-with-lease too) to other branchesgit.push-deleteAsksDeleting a remote branch,git push --prunegit.push-protectedBlocksDirect push to main/mastergit.no-verifyBlocksBypassing hooks or signing (--no-verify, -n, --no-gpg-sign, HUSKY=0, core.hooksPath)git.amendAskscommit --amendgit.history-rewriteAsksfilter-branch, filter-repo, reflog expire/delete, update-ref -d, gc --prune=nowgit.add-envBlocksgit addof .env, key or credential filesgit.commit-secretsBlocksgit commitwhen the changes contain secrets
Database
db.destructiveAskssupabase db reset/migration down/storage rm, DROP/TRUNCATE/DROP COLUMN, DELETE/UPDATE without WHERE (by file, redirect or pipe too), prisma migrate reset, drizzle-kit push --force, dropdb, flushalldb.remote-destructiveBlocksResetting or deleting a remote database (supabase db reset/migration down --linked, projects delete, backups restore)db.volume-wipeAsksdocker volume rm/prune, compose down -v, compose rm -v, podman system reset, supabase stop --no-backupmigration.edit-appliedAsksChanging or deleting existing migration files,supabase migration squash
Secrets
secrets.read-envBlocksReading or uploading .env, keys, ~/.ssh, ~/.aws/credentials (Read tool, shell, inline code, curl -F/-T, scp)secrets.env-writeAsksWriting or emptying .env filessecrets.write-literalBlocksAn edit that writes a secret literal (API key, token, private key) into codesecrets.printBlocksPrinting secrets: env/printenv without a name, echo $TOKEN, gh auth token, supabase projects api-keys, op read, aws secretsmanager, security -w, kubectl get secret -o yaml …
Packages
deps.not-foundBlocksPackage does not exist on npm or PyPI (hallucinated, "slopsquatting")deps.typosquatAsksName is 1 to 2 characters away from one of the 5000 most popular packagesdeps.too-newAsksFirst version is younger thansupplyChain.minAgeDays(14 days)deps.low-adoptionAsksFewer thansupplyChain.minWeeklyDownloads(500) downloads a week (npm)deps.install-scriptsNotePackage runs scripts on install (preinstall/install/postinstall)deps.deprecatedNotePackage or version is marked deprecated
Deploys and cloud
deploy.anyAsksDeploys and releases: vercel --prod/env add, supabase db push/functions deploy/functions delete/config push, gh pr merge/repo edit --visibility, terraform apply, kubectl apply, npm publish …remote.deleteAsksDeleting in cloud services: aws s3 rm/rb/sync --delete, gsutil/gcloud storage rm, rclone purge/sync/delete, gh secret delete/api -X DELETE, vercel rm/env rm/domains rm, fly apps destroy …container.destructiveAsksdocker/podman system/image/container prune, rm/rmi with a $(…) list, compose down --rmi
System and shell
net.pipe-to-shellAskscurl/wget straight into a shell or an interpretersys.privilegedAskssudo/doas, chmod 777, chown -R outside the projectsys.persistenceAsksWriting to shell startup files, ~/.ssh, LaunchAgents, /etc/sudoers; crontab, launchctl loadshell.unverifiedAsksCannot be checked: eval/source with code created at runtime, unknown output piped into a shell or an interpreter, nested too deep
Self-protection and modes
self.protectBlocksChanges to Workban Guard's config, state and installed plugins;wbg mode/approve/allow/trust/pauseby the agentself.agent-configAsksChanges to Claude or Codex settings (hooks, permissions), to .git/hooks and .git/config,git config core.fsmonitor/sshCommandmode.plan-readonlyBlocksIn plan mode: edits and changing commands (plan files excepted)mode.autopilot-outsideBlocksIn autopilot: writing outside the project (temp excepted)
After every edit
Checks new lines only, not existing code. The agent fixes an Error before it goes on. A Note stays your call.
Security
sec.secret-literalErrorSecret literal in code (API keys, tokens, private keys, service-role JWT, database URL with password)sec.evalErroreval,new Function,vm.runIn…(JS),eval/exec(Python)sec.shell-injectionErrorShell commands from template strings or concatenation,shell: true,shell=True,os.system(f"…")sec.sql-concatErrorSQL from template strings or concatenation instead of parameterssec.xssNotedangerouslySetInnerHTML,innerHTML =,v-html,document.writesec.tls-offErrorTLS verification turned off (rejectUnauthorized: false,verify=False…)sec.cors-wildcardNoteCORS for all origins (*)sec.weak-randomNoteMath.random()for tokens, passwords, IDssec.weak-hashErrorMD5/SHA-1 for passwordssec.cookie-flagsNoteCookie withouthttpOnly/securesec.debug-prodNoteDebug mode in production configurationsec.open-ingressNote0.0.0.0/0or::/0in infrastructure configuration
Supabase
supa.service-role-clientErrorService-role key in client codesupa.rls-missingErrorMigration creates a table withoutENABLE ROW LEVEL SECURITYsupa.get-session-authNotegetSession()for authorization in server or edge code instead ofgetUser()supa.public-bucketNotePublic storage bucket
Personal data
pii.emailNoteEmail address that can belong to a real person, in code or test datapii.ibanNoteIBAN with a valid check digit; well-known sample numbers stay outpii.cardNoteCard number with a valid check digit; well-known test numbers stay out
Code quality
slop.ts-anyErroranyin TypeScript (annotation,as any,<any>,any[])slop.ts-suppressError@ts-ignore,@ts-nocheck,@ts-expect-errorwithout a reasonslop.lint-disableErroreslint-disable,# noqa,# type: ignore,swiftlint:disable,//nolint,@Suppressslop.todo-no-issueNoteTODO/FIXME without an issue reference(#123)slop.placeholderErrorPlaceholder instead of an implementation ("implementation here", "not implemented",todo!())slop.empty-catchErrorEmptycatch,.catch(() => {}),except: passslop.console-logNoteconsole.log/console.debugin production codeslop.commented-codeNoteThree or more commented-out lines of code in a rowslop.test-focusError.only,.skip,fit,xit,@pytest.mark.skip,@Disabledin testsslop.test-tautologyErrorAssertions that always pass (expect(true).toBe(true))slop.test-no-assertNoteTest file with tests but no assertionslop.file-sizeNoteCode file grows past 300 linesslop.kotlin-bangNote!!in Kotlin production codewbg.suppression-addedNoteNewwbg-ignoresuppression (shows up in the review)
After a read
Checks files, command output, web pages and MCP answers. The text has already been read by then, so nothing blocks here: the agent and the user get a note.
Prompt injection
inject.overrideNoteAsks to ignore earlier instructionsinject.personaNoteGives the agent a new role or new system instructionsinject.agent-addressNoteSpeaks to AI agents directly and gives them a taskinject.concealNoteAsks to keep something from the userinject.exfiltrateNoteContains an order to send secrets outinject.role-markerNotePoses as the system or a tool with a chat protocol's control tokensinject.hidden-textNoteHides text in invisible characters or reverses the reading direction
Try it with your next task.
Workban is free. Your workspace is ready in a minute, and the first task appears as soon as your agent gets going. The app itself speaks German for now.