cd /news/ai-agents/land-using-determinstic-methods-for-… · home › topics › ai-agents › article
[ARTICLE · art-166737] src=useland.dev ↗ pub= topic=ai-agents verified=true sentiment=· neutral

Land: Using Determinstic methods for faster CI and merging

Land launched a merge gate that sits between coding agents and the main branch, merging agent-pushed GitHub branches and rerunning only the tests a change could affect, with results returned as a commit status. Land selects tests through deterministic bookkeeping — recording which functions each test executes and comparing that against the functions a change touched — rather than AI guessing, so the same change always gets the same tests. The tool runs only affected tests for Python, Go, Ruby (RSpec with a committed Gemfile.lock) and TypeScript/JavaScript (vitest, node --test or mocha), while Jest, Rust, other Ruby, Java and Kotlin, PHP, C#, and C or C++ run the full suite on every change; users pay only for changes Land puts on main, refused pushes are free, and there is no free tier.

read3 min views1 publishedNov 10, 2026

You are meant to do something bigger.

land is the gate between your coding agents and main. Your agent pushes a branch to GitHub. land merges it with main, reruns only the tests the change could affect, and moves main if they pass. The answer comes back as a status on the commit. See how it saves time →

land picks tests by plain bookkeeping, not an AI guess. It records which functions each test actually runs and compares that with the functions your change touched, so the same change always gets the same tests.

curl -fsSL https://useland.dev/install | sh
land login

land login signs you in with GitHub in your browser, once per machine. On an SSH machine it prints a link instead, and you type the code the page shows. Then pick a plan on the dashboard; land checks nothing until you do.

Set up #

Install the land CLI and sign in

On the machine your agents run on. It signs you in with GitHub and installs the land skill for Claude Code and Codex.

curl -fsSL https://useland.dev/install | sh

Add the repository, once

In the repository. --dry-run shows what would upload: committed files only, no history, never .env. land finds the tests, installs the dependencies, and records which tests already fail.

Languages: Python, Go, Ruby (RSpec with a committed Gemfile.lock), and TypeScript/JavaScript (vitest, node --test or mocha) run only the tests a change can affect. Jest, Rust, other Ruby, Java and Kotlin (Maven or Gradle), PHP, C#, and C or C++ (CMake or make) run the whole suite on every change for now. Pass --test '<command>' if land picks the wrong one.

land add --dry-run
land add

Tell your agents where finished work goes

Add these lines to the repository's CLAUDE.md (AGENTS.md for Codex and others).

When work is done, run `land merge  --onto main`. land merges it with main and runs the tests it could affect.
It prints JSON: `landed`, and `refused` with the failing tests. Fix a refusal and run it again.
Then push the commit it gives you: `git push origin :main`.
Never edit, skip or delete a test to get work through.

CI and cloud agents #

Where there's no browser to sign in, make a token on your dashboard for the repositories it may use and set it as LAND_TOKEN. land merge then works in a fresh checkout with no login. A token can't add repositories or change a test command, and you can revoke it any time.

LAND_TOKEN=$LAND_TOKEN land merge "$BRANCH" --onto main

Reading a verdict #

$ land merge sub/api sub/ledger --onto main
{ "landed": ["sub/api"],
  "refused": [{ "who": "sub/ledger", "why": "tests_failed",
                "failing": ["tests/test_ledger.py::test_reverse"],
                "assert": "assert 110 == 90",
                "repro": { "commit": "071366837c", "run": "python -m pytest tests/test_ledger.py::test_reverse" },
                "hitBy": null }],
  "guarding": "3/3", "removed_tests": 0, "newly_skipped": 0,
  "github": { "push": "git push origin 8364fb3…:main" } }
why what your agent does
tests_failed Fix the code those tests use, run land merge again
conflict Resolve the named functions on main, run land merge again
tests_changed Revert the test edits
unknown_base Start the branch from the main you added
no_change Nothing to do; main already has it
conflict_with_main Rebase onto the target, resolve, merge again
"dirty" Commit the subagent's work in that worktree, merge again
"state": "running" Run the same land merge again to wait for the result

Pricing #

You pay only for changes land puts on main. Refused pushes are free. There is no free tier, so pick a plan after you sign in.

── more in #ai-agents 4 stories · sorted by recency
── more on @land 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/land-using-determins…] indexed:0 read:3min 2026-11-10 · —