Dependency workflows
Detent supports two dependency patterns. Use the one that matches how much of the wait should be visible on the board.
- Keep the issue in
Todo. Add a machine-readable dependency line such asDepends on: #123,Blocked by: owner/repo#123, orDepends on: https://github.com/owner/repo/issues/123. Detent keeps the issue out of dispatch while any referenced blocker is non-terminal, then dispatches it normally after blockers clear. This is the default behavior and needs no extra configuration. - Keep the issue in
Blocked. Enabletracker.dependency_auto_unblockwhen your team wants dependency-waiting issues to sit in a waiting column. Detent only moves issues that have explicitDepends on:orBlocked by:references. When all blockers are terminal, closed, or have a merged linked PR under the configuredreadinessrule, Detent updates the configured GitHub status source totarget_stateand posts an audit comment. Withouttracker.dependency_auto_unblock.enabled: true, aBlockedissue is observed for display but will not be moved back toTodo. Human blockers without explicit dependency references stay blocked. - Queue fixable blockers automatically. Enable
tracker.blocker_auto_promotealongside dependency auto-unblock when a dependency-waiting issue should pull same-repository blockers out of inactive states such asBacklog,Blocked, orHuman Review. Detent promotes only resolved, same-repository blockers to the configuredtarget_state, respects current local agent capacity, and posts an audit comment on the promoted blocker. Agents that move work toBlockedbecause of another tracked issue or pull request must ensure the issue body contains a machine-readableBlocked by:orDepends on:line; Workpad mentions alone are not a durable dependency contract. - Recover explicit PR-maintenance parks. Enable
tracker.blocked_recoveryonly when structured PR-maintenance parks should move work to the configured repair lane. The worker that intentionally creates such a park must setreason_code: merge_conflict,stale_base, ormissing_current_head_ciin its blockeddetent-statusblock; Detent persists that code on the lane entry. Recovery also requires the corresponding PR condition to still hold and a new diff-fingerprint/base-OID pair. Issue descriptions, manual status moves, and other prose do not authorize recovery. Keep this disabled on boards whereBlockedis also used for deliberate operator parking.
Before you dispatch anything, run detent doctor --allow-write-probes after
mutation authorization — it checks config
resolution, the database, the codex binary, GitHub auth mode, configured
tracker access, repository issue/PR access, required write proofs, rate-limit
visibility, git, and the server port. A clean pre-start doctor clears
Detent's direct preflight.
When a running Detent process already owns the configured port,
detent doctor --port 0 --allow-write-probes validates the config, database,
tools, token, and write proofs without treating the live listener as a blocker;
pair it with /health on the actual service before dispatching more work. Do
not dispatch from a failed doctor run unless the only failure is that expected
live-port collision and /health is green. If Detent runs under a systemd user
service, also verify the
service PATH resolves every command used by project hooks and validation gates;
doctor checks Detent's direct dependencies, not repo-specific bootstrap tools.
The onboarding runbook includes the service-context check.
Keep systemd's default KillMode=control-group for the Detent service. Detent
starts each Codex and Claude worker in its own process group without leaving the
service cgroup, so its persisted worker registry can terminate stale process
groups on shutdown or startup while systemd remains the final cleanup backstop.
Do not wrap worker commands in launchers that double-fork or explicitly move
children into another cgroup.