{"slug": "land-using-determinstic-methods-for-faster-ci-and-merging", "title": "Land: Using Determinstic methods for faster CI and merging", "summary": "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.", "body_md": "# For God's sake save some time on your merging and CI\n\nYou are meant to do something bigger.\n\nland 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 →](https://useland.dev/how-it-works)\n\nland 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.\n\n```\ncurl -fsSL https://useland.dev/install | sh\nland login\n```\n\n`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.\n\n## Set up\n\n### Install the land CLI and sign in\n\nOn the machine your agents run on. It signs you in with GitHub and installs the land skill for Claude Code and Codex.\n\n```\ncurl -fsSL https://useland.dev/install | sh\n```\n\n### Add the repository, once\n\nIn 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.\n\nLanguages: 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.\n\n```\nland add --dry-run\nland add\n```\n\n### Tell your agents where finished work goes\n\nAdd these lines to the repository's `CLAUDE.md` (`AGENTS.md` for Codex and others).\n\n```\nWhen work is done, run `land merge  --onto main`. land merges it with main and runs the tests it could affect.\nIt prints JSON: `landed`, and `refused` with the failing tests. Fix a refusal and run it again.\nThen push the commit it gives you: `git push origin :main`.\nNever edit, skip or delete a test to get work through.\n```\n\n## CI and cloud agents\n\nWhere there's no browser to sign in, make a token on [your dashboard](https://useland.dev/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.\n\n```\nLAND_TOKEN=$LAND_TOKEN land merge \"$BRANCH\" --onto main\n```\n\n## Reading a verdict\n\n``` bash\n$ land merge sub/api sub/ledger --onto main\n{ \"landed\": [\"sub/api\"],\n  \"refused\": [{ \"who\": \"sub/ledger\", \"why\": \"tests_failed\",\n                \"failing\": [\"tests/test_ledger.py::test_reverse\"],\n                \"assert\": \"assert 110 == 90\",\n                \"repro\": { \"commit\": \"071366837c\", \"run\": \"python -m pytest tests/test_ledger.py::test_reverse\" },\n                \"hitBy\": null }],\n  \"guarding\": \"3/3\", \"removed_tests\": 0, \"newly_skipped\": 0,\n  \"github\": { \"push\": \"git push origin 8364fb3…:main\" } }\n```\n\n| why | what your agent does | \n|---|---|\n| tests_failed | Fix the code those tests use, run land merge again | \n| conflict | Resolve the named functions on main, run land merge again | \n| tests_changed | Revert the test edits | \n| unknown_base | Start the branch from the main you added | \n| no_change | Nothing to do; main already has it | \n| conflict_with_main | Rebase onto the target, resolve, merge again | \n| \"dirty\" | Commit the subagent's work in that worktree, merge again | \n| \"state\": \"running\" | Run the same land merge again to wait for the result | \n\n## Pricing\n\nYou 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.", "url": "https://wpnews.pro/news/land-using-determinstic-methods-for-faster-ci-and-merging", "canonical_source": "https://useland.dev/", "published_at": "2026-11-10 04:25:22+00:00", "updated_at": "2026-11-10 04:52:12.187882+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-tools"], "entities": ["Land", "GitHub", "Claude Code", "Codex", "Python", "Go", "Ruby", "TypeScript"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/land-using-determinstic-methods-for-faster-ci-and-merging", "markdown": "https://wpnews.pro/news/land-using-determinstic-methods-for-faster-ci-and-merging.md", "text": "https://wpnews.pro/news/land-using-determinstic-methods-for-faster-ci-and-merging.txt", "jsonld": "https://wpnews.pro/news/land-using-determinstic-methods-for-faster-ci-and-merging.jsonld"}}