{"slug": "show-hn-agentmachinist-make-your-coding-agent-show-its-work", "title": "Show HN: AgentMachinist: make your coding agent show its work", "summary": "AgentMachinist 0.19.0, released on PyPI, is a controller that takes a development task from intent to a reviewed local change by coordinating coding agents Claude Code, OpenCode, Pi, Codex, or Goose, requiring human approval of the exact Spec commit before implementation and human review before integration. The tool owns commits, Task records, and optional GitHub PR or GitLab MR publication, and never merges remotely or automatically; local integration is an explicit fast-forward into a clean base checkout. The core CLI is tested on macOS and Linux with Python 3.12 to 3.14, while managed background service commands are macOS-only.", "body_md": "AgentMachinist takes a small development Task from intent to a reviewed local change. It coordinates Claude Code, OpenCode, Pi, Codex, or Goose, with human Approval of the exact Spec before implementation and human review before integration. GitHub and GitLab are optional sources of Tasks and destinations for publication.\n\nNew here? Follow [Start here](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/tldr.md) for your first Task, or try it on\nthe disposable [example project](https://github.com/vscarpenter/AgentMachinist/blob/main/examples/first-task/README.md) first.\n\n```\nTask → Spec commit → human Approval → implementation → verification → Review\n                                                                    │\n                                  human review → local integration ◄─┘\n                                  optional GitHub PR / GitLab MR\n```\n\nThe controller owns commits, Task records, and optional publication. Local integration is an explicit fast-forward operation into your clean base checkout. AgentMachinist never merges remotely or automatically.\n\nCurrent release:\n[AgentMachinist 0.19.0 on PyPI](https://pypi.org/project/agentmachinist/0.19.0/).\n\nInstall the controller, then enter the repository you want to work on:\n\n```\nuv tool install agentmachinist\nmachinist --version\n```\n\nYou also need `git` and one supported Harness executable (`claude`, `opencode`,\n`pi`, `codex`, or `goose`). GitHub operations require authenticated [` gh`](https://cli.github.com);\nGitLab operations require authenticated [`glab`](https://docs.gitlab.com/cli/).\nThe core CLI is tested on macOS and Linux with Python 3.12 to 3.14. Managed\nbackground service commands are macOS-only; on Linux, schedule\n`machinist watch --once` with your existing service manager.\n\nStart on a clean named branch with an initial commit and an installed,\nauthenticated Harness. Set your author inside the repository with\n`git config user.name` and `git config user.email`, because the controller\nignores your global Git identity. Replace the example's Python test\ncommand with verification appropriate to your project.\n\n```\ncd your-repository\nmachinist start \"Reject unknown timezone names in parse_timezone with a ValueError\" --test-cmd \"uv run pytest\"\n```\n\nRead the saved Spec and copy the exact Approval command printed by start:\n\n```\nmachinist approve --task T1 --spec-sha <full-spec-commit-sha>\n```\n\nApproval continues implementation, verification, and independent Review. Use status to find the report and candidate, inspect the report and diff, then integrate the reviewed change:\n\n```\nmachinist status T1\n# Read the report and inspect the candidate diff before accepting it.\nmachinist integrate T1\n```\n\nCompletion output explains the next activity and includes a command using your Task or issue ID. Local integration reports completion; publication is an optional follow-up with an explicit forge selection.\n\nFirst start reuses applicable root settings, discovering an installed Harness\nand verification command when those settings are absent. Its local\nsettings and Task records live under `.machinist/runs/local/`, excluded through\nGit's local exclude file. It does not require an origin, labels, a daemon, forge\nauthentication, or hosted workflows. Existing `machinist.yaml` settings remain\navailable. Local orchestration can still use a cloud model; offline inference\nrequires a separately configured local provider.\n\nVerification runs in an isolated committed checkout; dependency folders from\nyour working repository are not copied. Use a self-preparing command such as\n`npm ci && npm test` or `uv run pytest`, with its lockfile committed. A failing\nbaseline stops before the Spec Harness, and `machinist status T1` shows the\nGate's error and log directory. Correct the Gate in\n`.machinist/runs/local/config.yaml` or its dependency setup, then run\n`machinist retry --task T1 --phase spec`. If the committed baseline itself\nneeds a fix, commit it and start a new Task. To try the loop on something\ndisposable first, copy [examples/first-task](https://github.com/vscarpenter/AgentMachinist/blob/main/examples/first-task/README.md).\n\nBefore your first paid run, `machinist rehearse` exercises the whole local\nworkflow with a fake Harness and no model cost. `machinist doctor --local` is an\noptional readiness check using the same configuration resolution as first start or your\nsaved local settings. It checks Git, Harness probes, and verification command\navailability without creating a Task or requiring a forge. Add `--json` for\nstructured output. Add `--run-gates` only to execute project commands in your\ncurrent checkout; this does not prove dependencies are ready in a fresh Workshop.\nPlain `machinist doctor` runs these local checks when no `machinist.yaml`\nexists and its GitHub setup checks otherwise.\n\nYou can publish the same reviewed candidate when collaboration is useful:\n\n```\nmachinist publish T1 --provider gitlab\n# Or: machinist publish T1 --provider github\n```\n\nPublication requires an origin that matches the selected forge and authenticated CLI. It preserves local work on failure and retries the same branch and change request without repeating Harness work or verification. GitLab support includes nested projects and explicitly bound self-managed hosts; it covers issue intake and merge-request publication, not GitLab-hosted Spec automation.\n\nSee the [local workflow guide](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/local-workflow.md) for input files, external\nissues, amendments, recovery, and use by a solo developer or small team.\n\nGitHub issue intake, trusted workflow Approval, draft PRs, independent Review, and the watcher remain available as an optional mode. Set it up once per repository:\n\n```\nmachinist onboard\n# Review, stage, commit, and push the generated setup files, then:\nmachinist doctor --run-gates && machinist watch\n```\n\nThe [GitHub setup guide](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/getting-started.md#github-setup-and-automation)\ncovers which setup files to stage, local and CI Spec generation, SHA-bound\nApproval, Review, and recovery. Managed workflows pin the installed controller\nversion, so run `machinist sync-workflows` after each upgrade.\n\n| Command | Purpose | \n|---|---|\n| `machinist start [<objective>] [--body-file <path>] [--from-issue <url>]` | Save a local Task, generate its Spec, and stop for exact human Approval. | \n| `machinist approve --task <Tn> --spec-sha <sha>` | Approve one local Spec and continue Execute, verification, and Review in the foreground. | \n| `machinist continue <Tn>` | Continue eligible local work or show the next required human action. | \n| `machinist status <Tn> [--json]` | Inspect one local Task and its next action without forge access. | \n| `machinist integrate <Tn>` | Explicitly fast-forward a clean local base to the exact reviewed candidate. | \n| `machinist publish <Tn> --provider github\\|gitlab [--host <host>]` | Publish the reviewed local candidate as a PR or MR with recoverable intent. | \n| `machinist retry --task <Tn> --phase spec\\|execute\\|review [--fresh]` | Explicitly retry a failed local Phase in the foreground. | \n| `machinist retry --task <Tn> --phase execute --fresh --harness <name> [--model <id>]` | Retry once with another installed Harness or model; the choice is not saved. | \n| `machinist amend --task <Tn> --feedback <text>` | Turn feedback on a reviewed candidate into a new Spec that needs fresh Approval. | \n| `machinist init [--yes]` | Create config, spec storage, labels, managed issue form, and workflows; asks setup questions in a terminal ( `--yes` hands-free,`--no-input` skips without auto-enabling test command). | \n| `machinist onboard [--setup-pr] [--yes]` | Run guided setup in place or deliver only managed setup files on a draft PR; `--yes` accepts defaults + detected test command. | \n| `machinist rehearse [--harness]` | Exercise production local Phases, Git, verification, Review, and integration; paid Harness use is opt-in. | \n| `machinist doctor [--run-gates]` | Run read-only setup and workflow-drift diagnostics; single health check that prints the exact fix for any `FAIL` (only run individual`--check` commands if doctor asks). Without`machinist.yaml` , plain`doctor` runs the local readiness checks. | \n| `machinist doctor --local [--run-gates] [--json]` | Optional local readiness, without forge setup or saved state; Gate execution requires `--run-gates` . | \n| `machinist update-check [--json] [--timeout <seconds>]` | Compare the installed release against PyPI, print how to upgrade, and report managed-workflow drift. | \n| `machinist sync-workflows [--check]` | Write or verify config-derived workflows. | \n| `machinist sync-labels --check\\|--apply` | Verify or create the two configured lifecycle labels. | \n| `machinist config validate\\|show\\|schema\\|set` | Validate, inspect, export, or atomically update configuration; without `machinist.yaml` ,`--path` defaults to the saved local settings. | \n| `machinist task template --write\\|--check` | Project or verify the sealed GitHub issue form. | \n| `machinist task new --title <title> [--body-file <path>] [--dispatch]` | Create a structured GitHub issue; preserve drafts on failure and dispatch only after lint passes. | \n| `machinist task lint <issue> [--json]` | Check objective, acceptance criteria, constraints, and verification readiness. | \n| `machinist spec <issue> [--dry-run]` | Preview a Spec, or generate it and open its draft PR. | \n| `machinist spec <issue> --revise` | Regenerate a successful Spec on its existing branch and PR. | \n| `machinist spec <issue> --abandon [--reason <text>]` | Record rejection and close the open draft PR. | \n| `machinist approve [--issue <issue>\\|--pr <pr>]` | Request asynchronous workflow Approval for the current PR head; wait for trusted Evidence before Execute. | \n| `machinist run <issue>` | Implement an approved Spec and run the configured Verification Gates. | \n| `machinist review <issue>` | When legacy Review is enabled, independently review the exact implemented draft and mark it ready. | \n| `machinist amend <issue> --feedback <text>` | Rework a ready PR from explicit feedback after fresh approval. | \n| `machinist cancel <issue> [--reason <text>\\|--clear]` | Cooperatively stop or block an issue's dispatch. | \n| `machinist watch [--once] [--dry-run] [--max-tasks <n>]` | Preview or dispatch eligible tasks continuously or once. | \n| `machinist queue pause\\|resume\\|defer\\|allow\\|show` | Persist operator controls over new watcher dispatches. | \n| `machinist service install\\|start\\|restart\\|stop\\|status\\|logs\\|uninstall` | Manage the repository's macOS launchd watcher; destructive lifecycle actions refuse active Claims unless forced. | \n| `machinist explain <issue> [--json]` | Show effective policy, resolved profiles, attempts, and the exact next action without secrets. | \n| `machinist status [--local\\|--all] [--json]` | With local configuration, default status and `--local` show local Tasks. Otherwise, default status shows the GitHub board and`--local` reads legacy Run Evidence.`--all` shows the registered GitHub portfolio. | \n| `machinist status --watch [--interval <seconds>] [--json]` | Emit changed-only live pipeline snapshots until Ctrl-C. | \n| `machinist runs [--issue <issue>] [--json]` | Read current, historical, orphaned, and corrupt local run records. | \n| `machinist report [--source all\\|legacy\\|local] [--since 30d] [--json] [--otlp-endpoint <url>]` | Aggregate both history namespaces by default; local/all export requires an explicit endpoint. | \n| `machinist retry <issue> [--phase spec\\|execute\\|review]` | Re-enable one failed Task Run. | \n| `machinist retry <issue> --phase execute --run [--resume\\|--fresh]` | Reuse a retained workspace or start a fresh Execute attempt; fresh is the default. | \n| `machinist inspect <issue> [--offline] [--json]` | Show GitHub, workspace, and complete Task Run diagnostics. | \n| `machinist repo add\\|remove\\|list` | Maintain the optional local repository registry. | \n| `machinist clean [--issue <issue>\\|--task <Tn>\\|--all]` | List or remove retained Workshops for GitHub issues and local Tasks. | \n\nUpgrade an existing tool installation with `uv tool upgrade agentmachinist`.\n\n`machinist update-check` compares the installed release against PyPI and\nprints the upgrade command for how this copy was installed (`uv tool`, `pipx`,\n`pip`, or a source checkout). `machinist doctor` reports the same result as a\ndiagnostic row. Set `MACHINIST_NO_UPDATE_CHECK=1` to suppress both probes on\noffline or CI machines.\n\nUpgrading the package is not always the whole upgrade. Managed workflows are\nprojected files: run `machinist sync-workflows`, review the generated changes,\nand commit and merge them into the default branch for hosted workflows to use them.\n`machinist watch` reports local drift at startup and\n`machinist update-check` reports it alongside the release comparison, so you do\nnot have to run `doctor` to find out. The advisory never blocks a command and\nnever appears in `update-check --json`.\n\n1. [Understand the workflow](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/how-it-works.html) : one diagram of your decisions\nand the controller's work. The[Approval policy](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/approval-policy.md) explains what each Approval authorizes.\n2. [Complete your first Task](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/tldr.md) : the short installation-to-integration\nguide. Prefer illustrated instructions? Use the[visual first-run guide](https://agentmachinist.vinny.dev/first-run-guide.html) .\n\nThe [complete documentation index](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/README.md) links every guide, reference,\narchitecture decision, and historical plan. For detailed settings, use the\n[configuration and GitHub reference](https://github.com/vscarpenter/AgentMachinist/blob/main/docs/getting-started.md).\nContributor and release information lives in [CONTRIBUTING.md](https://github.com/vscarpenter/AgentMachinist/blob/main/CONTRIBUTING.md)\nand the [changelog](https://github.com/vscarpenter/AgentMachinist/blob/main/CHANGELOG.md).\n\nThe trust model is deliberately narrower than “the agent cannot use git.” Harness flags, credential reduction, repository postconditions, and push leases reduce risk, but local harnesses still execute with the operating-system access of the user who launched them. Read the trust model before unattended use.\n\nReleases use PyPI Trusted Publishing. Bump `pyproject.toml`, update the\nchangelog, and publish a GitHub Release tagged `v<version>`. The release job\nfirst checks tag/version equality, runs tests and workflow checks, builds both\ndistributions, smoke-tests the installed wheel and sdist through a generated\nfirst-run project, and records SHA-256 hashes. A minimal job\nthen publishes those verified artifacts. Only after publication do separate\njobs attach the distributions and checksum file to the GitHub Release and\nverify that the exact version is visible and installable from PyPI.\n\nMIT — see [LICENSE](https://github.com/vscarpenter/AgentMachinist/blob/main/LICENSE).", "url": "https://wpnews.pro/news/show-hn-agentmachinist-make-your-coding-agent-show-its-work", "canonical_source": "https://github.com/vscarpenter/AgentMachinist", "published_at": "2026-10-03 16:35:51+00:00", "updated_at": "2026-10-03 17:07:00.768051+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "artificial-intelligence"], "entities": ["AgentMachinist", "Claude Code", "OpenCode", "Pi", "Codex", "Goose", "GitHub", "GitLab"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-agentmachinist-make-your-coding-agent-show-its-work", "markdown": "https://wpnews.pro/news/show-hn-agentmachinist-make-your-coding-agent-show-its-work.md", "text": "https://wpnews.pro/news/show-hn-agentmachinist-make-your-coding-agent-show-its-work.txt", "jsonld": "https://wpnews.pro/news/show-hn-agentmachinist-make-your-coding-agent-show-its-work.jsonld"}}