Skip to content

v0.1.0

Choose a tag to compare

@eyelock eyelock released this 05 Oct 05:20
· 66 commits to develop since this release
3aac2c8

ynf 0.1.0

The first release of ynf, your named factory: the outer loop around agent runs. ynf watches tickets and pull requests, decides what to do with each one, runs an agent (through ynh) or a command in containment on a fresh checkout, proposes the change as a draft pull request, and follows it through CI and review. A human always merges. What keeps going wrong is remembered in ynm.

Docs: https://eyelock.github.io/ynf/, with two tutorial tracks: ynf on its own, and the factory with ynh, ynm and ynf together.

What's in it

The loop

  • Work items with a durable state machine, and a pure decider: every decision is recorded and ynf replay recomputes it, under the recorded lanes or a changed lanes file.
  • Lanes in versioned YAML with CEL guards. A configuration repository's lanes lie under each repository's own, merged key by key. ynf lanes validate --repo checks a repository's lanes merged as ynf would.
  • One claim at a time: leases with heartbeats and fencing, over SQLite or S3. A crashed run is restarted, not resumed.
  • Stop conditions: yield floors, pausing a lane with a reason, and ynf stats per lane.

Starting work

  • From a search (sweep, serve), a GitHub webhook (serve --listen), a CI event (handle, with --lane), or by instruction: ynf start <ticket> or ynf start --prompt … --label ….
  • Trackers besides GitHub, through their MCP server, such as JIRA. ynf calls the tools itself, with no model.
  • GitHub.com and GitHub Enterprise Server as forges, with host-qualified item keys.

Running it

  • Runners: ynh, for an agent with its harness, sensors and budgets, or any command.
  • A lane may pin the agent's model (run.ynh.model) and effort (run.ynh.effort), tighten its budgets and scope its sensors. It never loosens or redefines them.
  • Executors: docker, with an egress proxy and an allow list; process, attended only; and inline, inside the factory image under the job runner's containment.
  • Each run gets a self-contained checkout, so git works inside the container.
  • --auto-approve only inside containment.

Seeing what happened

  • Every run records the model, effort, turns, tokens (input, output and cache reads), cost, the cap that bound it, and the harness version.
  • ynf stats breaks every lane down by model and effort.
  • Failure signatures name what failed: the sensor, the budget cap, the CI check that diverged from the loop's sensors. Each occurrence is written to ynm, tagged occurrence, locally or over HTTP to a hosted ynm with a machine token.
  • ynf doctor, forges, trackers, ticket and harness check a factory before it's relied on.

The factory image
ghcr.io/eyelock/ynf-factory:0.1.0, for amd64 and arm64: ynh 0.10.0's image with ynf and ynm 0.3.0. Build your harness on it with ynh image … --base, and run it as a job (Run the factory image).

Install

brew install eyelock/tap/ynf

ynf pairs with ynh 0.10.0 and ynm 0.3.0. Both are optional: ynf detects them, and runs commands without them.