nextv2.0.0
Configuration

intake.yaml

Every field in intake.yaml: autonomous pickup from beads, and cron schedules.

intake.yaml controls what files work without anyone typing kraft item create: auto-intake, the autonomous pickup from beads, and schedules.

config/intake.yaml
enabled: false
interval_s: 300
repos: []              # empty means every enabled repo in repos.yaml
priority_ceiling: 2    # P0 and P1 are left for a person; P2 and higher numbers are picked up
schedules: []          # cron-fired work items; see below
FieldTypeDefaultMeaning
enabledbooleanfalseTurns autonomous pickup on.
interval_sinteger300Seconds between polls.
reposlist[]Repo paths to poll. Empty means every enabled repo in repos.yaml.
priority_ceilinginteger2Issues with a priority number below this (P0, P1) are left for a person. P2 and higher numbers start unattended.
scheduleslist[]Cron entries that file a paused work item each. The fields are in Inbound triggers.

max_concurrent is not a field of this file. It is in policy.yaml and limits how many items run at once, whichever way they were started. Before 2.0, max_concurrent was set here. A file that still has it loads, the key is ignored, and kraft admin doctor names the move.

What pickup does

When enabled is true, Kraft polls bd ready, the ready list of the optional beads issue tracker, for each repo in repos (or every enabled repo when repos is empty). It files each ready issue that passes the checks below as a work item, and starts it.

Kraft passes over a ready issue when:

  • It has no integer priority.
  • Its bead id already has a work item.
  • It is an epic.
  • Its priority number is below priority_ceiling (P0 and P1 at the default).
  • The max_concurrent slots, which every active item takes, are full. A slot promised to a queued item counts as taken.
  • The daily dollar cap in policy.yaml is reached.
  • Worktrees are over storage.worktrees.limit, because every pick-up is a new worktree. The poll records storage and files nothing.
  • It cannot be filed or started: the chain has no gate, there is no valid chain or library, or filing fails. The poll records this as invalid_config.

An item it starts behaves like this:

  • Unlike an item you file by hand, it does not land paused.
  • It goes through the same intake checks, and no gate is skipped.
  • It runs to its first gate and stops there and waits for you, exactly as a typed-in item does.
  • Kraft refuses to auto-start a chain that has no gate at all.

Edit and reload

You can edit the file by hand or in Settings › Auto-intake. Settings applies a change without a restart. A hand edit is picked up by kraft admin reload (or Reload in the header's apply chip), which also replaces the poller.

When the file does not load

A mistyped key, or a cron the scheduler cannot run (such as minute 61), stops intake.yaml from loading. At server start, auto-intake is then off and no schedule fires. A triggers entry left in policy.yaml still fires.

WhereWhat you see
Settings › Auto-intakeThe problem, on the field or schedule that holds it. The screen will not publish it.
kraft admin reloadRefuses the file and exits 1. The auto-intake and schedules that were running keep running. /api/health reads degraded, with intake_off false.
A server starting on the fileRuns with auto-intake off and none of its schedules. /api/health reads degraded, with intake_off true.
kraft admin doctorThe health row fails, and names the file.

/api/health gives the reason under invalid_intake.

Copyright © 2026