Gates
Gates are automated quality checks that must pass before a WU can be completed. They replace manual code review with consistent, automated enforcement.
Why Gates?
Section titled “Why Gates?”Traditional review:
- Human bottleneck (waiting for reviewers)
- Inconsistent (different reviewers, different standards)
- Slow feedback (review happens after code is written)
Gates:
- Instant (run automatically)
- Consistent (same checks every time)
- Fast feedback (run locally before pushing)
Config-Driven Gates
Section titled “Config-Driven Gates”Define your gate commands in workspace.yaml under software_delivery.gates:
Optional Migration Verification
Section titled “Optional Migration Verification”Projects with manual database deploy steps can add an explicit migration-state verifier:
When migration_verify is configured, pnpm gates and pnpm wu:prep run it only when the
working diff touches schema or migration paths such as db/schema/**, prisma/schema.prisma,
supabase/schema.sql, or migration directories.
Use this for commands that check whether the target database is up to date. Do not use it to run migrations automatically.
This approach works with any language and toolchain.
Automated Test Diff Evidence
Section titled “Automated Test Diff Evidence”wu:prep can enforce an extra proof step: if a WU changes code, it must also touch at least one
automated test file in the same diff. This policy is configured under
software_delivery.gates.tdd_diff_evidence.
Defaults come from software_delivery.methodology.testing:
tddsetssoftware_delivery.gates.tdd_diff_evidence.mode: blocktest-aftersetssoftware_delivery.gates.tdd_diff_evidence.mode: offnonesetssoftware_delivery.gates.tdd_diff_evidence.mode: offapplies_to_typesdefaults tofeatureandbugexempt_pathsdefaults to[]test_file_patternsdefaults to TS/JS globs (**/*.test.{ts,tsx,js,jsx,mjs},**/*.spec.{ts,tsx,js,jsx,mjs},**/__tests__/**,**/*.test-utils.*,**/*.mock.*)code_file_extensionsdefaults to TS/JS extensions (.ts,.tsx,.js,.jsx,.cjs,.mts,.cts)
mode supports block, warn, and off. wu:prep only blocks when the mode is block; teams
that want the policy disabled can set warn or off and still document their intent in config.
Configuring for non-TS/JS toolchains (WU-2905)
Section titled “Configuring for non-TS/JS toolchains (WU-2905)”test_file_patterns and code_file_extensions make the gate language-agnostic. Override either
field to teach the gate which files count as tests vs production code in your workspace. Overrides
replace the defaults — supply only your toolchain’s patterns.
C# (xUnit / NUnit / MSTest):
Python (pytest / unittest):
Go:
Use this gate when you want changed-test evidence for specific WU types or runtime paths. It is not a requirement to force every team into test-first development.
For one-off exceptions, document the reason in the WU notes with:
Native Delivery Review
Section titled “Native Delivery Review”The Software Delivery pack also exposes a native delivery_review gate for completion review. This
capability is public and vendor-agnostic:
- It lives under
software_delivery.gates.delivery_review - It is activated per runtime under
software_delivery.agents.clients.<client>.features.delivery_review - It runs through native gate execution and
wu:prep, not through a vendor-specific skill path - It does not depend on lumenflow-cloud or any hosted control plane
gates.delivery_review controls whether the capability exists for the workspace. Each client
feature block controls whether that runtime opts in and whether wu:prep should auto-run it.
pnpm gates runs delivery_review whenever both the workspace gate and the active client feature
are enabled. pnpm wu:prep runs it only when the same config is enabled and the active client has
auto_run: true.
Delivery Review Output Contract
Section titled “Delivery Review Output Contract”delivery_review produces a stable JSON artifact at
.lumenflow/artifacts/delivery-review/<WU-ID>.json. Hosts and products can consume the result
without assuming a specific vendor runtime.
Verdict behavior:
PASSmeans the review found sufficient delivery evidencePARTIALmeans the review completed with non-blocking uncertainty or lower-severity findingsFAILmeans the review found blocking gaps or risks and gates fail
The native review inspects the current WU spec, changed files, acceptance criteria, and delivery
risks. It is intentionally separate from wu:verify, which keeps its existing lifecycle meaning.
Conditional Commands
Section titled “Conditional Commands”Define pattern-triggered commands alongside your standard gates:
| Field | Type | Required | Description |
|---|---|---|---|
trigger_patterns | string[] | Yes | Glob patterns matched against changed files |
command | string | Yes | Shell command to execute when patterns match |
severity | string | No | error (default, blocks gates), warn, or off (skip) |
guidance | string | No | Actionable text shown when the command fails |
guidance_ref | string | No | File path whose content is appended to guidance |
How it works:
- When
pnpm gatesorwu:prepruns, changed files are compared against each command’strigger_patternsusing glob matching - Only commands with matching patterns execute — unmatched commands are silently skipped
- If a matching command fails with severity
error, gates fail. With severitywarn, a warning is logged but gates continue
Registering via the CLI (Constraint-9 compatible):
workspace.yaml must not be edited by hand. Two sanctioned paths exist:
-
gate:conditional(recommended, per-rule) — mirrorsgate:co-change:The
namefield is how--remove/--editaddress a specific entry. It is optional in the underlying schema (existing unnamed entries continue to work) but required for CLI-managed entries. -
config:set --json-value(escape hatch) — writes the whole array verbatim when you need a shape the flags above don’t cover:
Both paths validate against ConditionalCommandConfigSchema and commit atomically
via micro-worktree.
Using Presets
Section titled “Using Presets”For common languages, use a preset to get sensible defaults:
Available presets: node, python, go, rust, dotnet, java, ruby, php
Path-scoped tests.unit execution is preset-aware. When the active preset supports scoped
execution, wu:prep can use the current WU’s tests.unit entries to narrow the test gate. When a
preset does not support path-scoped execution, such as dotnet, LumenFlow falls back to the
configured default test command for that preset instead of attempting a JavaScript-specific runner.
Preset Defaults
Section titled “Preset Defaults”| Preset | Format | Lint | Typecheck | Test |
|---|---|---|---|---|
node | prettier --check . | eslint . | tsc --noEmit | npm test |
python | ruff format --check . | ruff check . | mypy . | pytest |
go | gofmt -l . | golangci-lint | go vet ./... | go test |
rust | cargo fmt --check | cargo clippy | cargo check | cargo test |
dotnet | dotnet format --verify | dotnet build | - | dotnet test |
java | spotless:check | checkstyle | mvn compile | mvn test |
ruby | rubocop | rubocop | - | rspec |
php | php-cs-fixer | phpstan | - | phpunit |
Running Gates
Section titled “Running Gates”If any gate fails, wu:prep fails and you fix issues in the worktree before completion.
For migration verification failures, the expected fix is:
- Apply the pending migrations using your project’s normal process
- Re-run the configured verification command manually if needed
- Re-run
pnpm wu:prep --id WU-XXX
Gate Flags
Section titled “Gate Flags”| Flag | Description |
|---|---|
--docs-only | Run only docs-related gates (skip format/lint/typecheck/test) |
--full-tests | Force the default incremental/full test flow instead of scoped tests.unit execution |
--full-lint | Run full lint pass instead of scoped lint |
Command Options
Section titled “Command Options”Commands can be strings or objects with options:
Language Examples
Section titled “Language Examples”Node.js / TypeScript
Section titled “Node.js / TypeScript”Python
Section titled “Python”Java / JVM
Section titled “Java / JVM”How Gates Work Under the Hood
Section titled “How Gates Work Under the Hood”Each gate maps to a policy rule in the Software Delivery Pack:
| Gate | Policy ID | Trigger |
|---|---|---|
| Format check | software-delivery.gate.format | on_completion |
| Lint | software-delivery.gate.lint | on_completion |
| Type check | software-delivery.gate.typecheck | on_completion |
| Test | software-delivery.gate.test | on_completion |
When wu:prep or wu:done runs, the kernel evaluates these policies. A deny from any gate makes the completion decision final — the deny-wins invariant applies. The result is recorded in the evidence store for audit.
Gate Behavior
Section titled “Gate Behavior”On Claim
Section titled “On Claim”When you wu:claim:
- Worktree is created
- Gates status is “pending”
During Work
Section titled “During Work”Run pnpm gates frequently:
On Prep and Done
Section titled “On Prep and Done”When you wu:prep:
- Gates run automatically in the worktree
- If any fail, the WU stays
in_progressuntil you fix and rerunwu:prep
When you wu:done:
- The WU merges to main
- The stamp is created
- The worktree is cleaned up
Gate Failures
Section titled “Gate Failures”Fix and retry:
Skip Flags
Section titled “Skip Flags”Skip specific gates when needed:
Or in configuration:
CI Integration
Section titled “CI Integration”Use the LumenFlow Gates GitHub Action:
The action reads your software_delivery.gates.execution config automatically. See GitHub Action docs for details.
Backwards Compatibility
Section titled “Backwards Compatibility”If no software_delivery.gates.execution config is present, LumenFlow falls back to auto-detecting your project type based on files present and uses preset defaults.
Next Steps
Section titled “Next Steps”- Policy Engine — How gates are evaluated as deny-wins policies
- Evidence Store — How gate results are recorded for audit
- Configuration Reference — Full gates schema
- CLI Reference — All gate commands