Verification phase contract
Homeboy’s verification surface is deliberately split into isolated primitive commands that can be composed by higher-level workflows.
Primitive phases
The shared phase vocabulary is:
syntax— parser-level validation such asphp -l,rustc --emit=metadata, or equivalentlint— static lint findings from PHPCS, ESLint, clippy, rustfmt, etc.typecheck— type/system checks such as PHPStan,tsc --noEmit, orcargo checkaudit— Homeboy structural analysis such as duplicates, orphaned tests, and code smellstest— behavioral test harness execution such as PHPUnit, cargo test, or npm test
These phases are a contract, not a requirement that one command runs all of
them. homeboy test runs only the test phase. homeboy lint runs only the
lint phase. homeboy audit runs only the audit phase. A composed command
or CI wrapper can run the phases in canonical order when it needs a full check.
Exit codes
Every primitive command uses the same exit code convention:
0: clean1: findings, lint violations, audit findings, or test failures2or higher: infrastructure failure such as missing dependencies, harness bootstrap failure, or runtime crash
This distinction matters because code findings should fail CI differently from broken tooling. Composed workflows can stop early on infrastructure failures and still report normal findings as actionable code work.
Structured output
Primitive command output should include a phase report:
{
"phase": {
"phase": "test",
"status": "failed",
"exit_code": 1,
"summary": "test phase reported 2 failure(s) out of 120 test(s)"
},
"failure": {
"phase": "test",
"category": "findings",
"summary": "2 test failure(s) detected"
}
}status is one of:
passedfailederrorskippednot-run
failure.category is one of:
findingsinfrastructure
The core Rust contract lives in src/core/extension/runner_contract.rs:
VerificationPhasePhaseStatusPhaseFailureCategoryPhaseReportPhaseFailure
Composition
Composed workflows should treat primitive commands as independent inputs:
syntax -> optional primitive / extension runner
lint -> homeboy lint
typecheck -> optional primitive / extension runner
audit -> homeboy audit
test -> homeboy testThis keeps each command debuggable on its own while giving CI, future check
commands, and rig workflows one stable shape to aggregate.