Local 27B dispatch lanes¶
ARGUS-1616 adds a dispatch-time lane for small Argus board tasks that are
safe to try on the local 27B runner before spending Claude subscription
budget. The lane is intentionally narrow: it is for Argus tasks whose
declared file_scope is docs-only or docs plus *_lint_test.go files.
Classification rule¶
Dispatch does not infer this lane from task prose. A task is classified into
hub-build-local only when all of these are true:
project=argus,owner=hub-agent,type=task, andkindis empty orbuild.file_scopeis nonempty.- Every declared path matches the same docs-plus-lint shape used by
cmd/ci-fast-path:docs/**, root/project Markdown outsideinternal/andcmd/,.env.example,.gitignore, or a Go file whose basename ends_lint_test.go.
Anything else, including an undeclared scope, internal/** Markdown embedded
into the hub binary, a non-lint Go file, go.mod, go.sum, workflows, or a
migration, stays on the normal hub-build lane. This chooses false
negatives over false positives: a missed local opportunity costs money, while
a false local classification can spend a small model on production-code work
it is not meant to plan.
Backend policy¶
The lane key is the skill name, hub-build-local. That keeps three data
surfaces aligned:
lane_policies.lane, read byResolveLaneBackend.agent_runs.skill, stamped on the dispatched run./sitrep.jsonlane_models[].lane, used for the baseline.
Migration 0278_lane_policy_hub_build_local.sql seeds:
| Lane | Backend | Model | Fallback |
|---|---|---|---|
hub-build-local |
opencode |
local-30b |
claude after 3 consecutive local failures |
The passive hub dispatcher resolves this lane before enqueueing. A classified
task therefore gets an agent_runs row with skill=hub-build-local,
backend=opencode, and model=local-30b without using
POST /projects/argus/dispatch {"backend":"opencode"}.
Baseline snapshot¶
Source: live GET /sitrep.json lane_models, queried at
2026-08-23T16:56:03Z. The rollup window is the hub's current
sitrepLaneModelWindow.
| Lane | Backend | Model | Runs | Pass rate | Median wall time |
|---|---|---|---|---|---|
hub-build |
claude |
claude-sonnet-5 |
197 | 91.9% | 17.4 min |
hub-build |
codex |
6 | 50.0% | 5.8 min | |
hub-build |
opencode |
local-30b |
1 | 100.0% | 3.6 sec |
tdarr-monitor |
codex |
87 | 96.6% | 4.9 min | |
hub-build-local |
opencode |
local-30b |
0 | n/a | n/a |
tdarr-monitor |
opencode |
local-30b |
0 | n/a | n/a |
This is not yet a statistically useful local-27B baseline. The acceptance bar
for calling the baseline ready is at least 12 completed tdarr-monitor
ticks and 5 completed hub-build-local docs/lint tasks on
backend=opencode, model=local-30b, with gauntlet results and wall times
recorded in agent_runs. Until those rows exist in /sitrep.json, compare
local results against the current Claude hub-build median of about 16-19
minutes, not against the one existing opencode outlier.