aws-samples / aws-samples/sample-autonomous-cloud-coding-agents

fix(agent): is_verify_command_inert misses mise's "unknown command" output — INERT build-gating warning never fires

Open Beginner friendly
#749 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
143
Forks
46
Avg merge
3d 9h
Merged PRs (30d)
20

Description

### Component

Agent (Python runtime)

### Describe the bug

`is_verify_command_inert()` (`agent/src/post_hooks.py:77-99`) fails to recognise mise's actual "task does not exist" phrasing, so a repository with **no `mise.toml` at all** is never classified as inert.

The most damaging consequence is not the wrong `build_passed`/`lint_passed` value — it is that the operator-facing warning at `agent/src/repo.py:517-526` never fires:

```python
if not config.build_command and is_verify_command_inert(result.returncode, result.stderr):
build_gate_inert = True
notes.append(
"⚠️ Build-regression gating is INERT: no runnable `mise run build` task ..."
)
```

Because the detector returns `False`, that note is never appended. A repo onboarded with no `pipeline.buildCommand` and no `mise.toml` therefore gets **build-regression gating silently disabled with no warning to anyone** — precisely the failure mode the warning exists to prevent.

### Expected behavior

`mise run build` / `mise run lint` in a repo with no `mise.toml` should be detected as inert, so that:

1. `build_gate_inert` / lint-inert is set,
2. the "⚠️ Build-regression gating is INERT" note is appended and surfaced on the PR, and
3. `build_passed` / `lint_passed` reflect inert-treated-as-passing rather than a bogus red.

### Current behavior

The detector returns `False`, no inert warning is emitted, and `lint_passed` is persisted as `false` on every task against such a repo.

### Reproduction steps

In any checkout with no `mise.toml` (e.g. a clone of `aws-samples/sample-semantic-layer-structured`):

```console
$ mise run lint; echo "EXIT=$?"
mise ERROR unknown command: lint

Did you mean:
mise install-into
mise plugin-list
mise ERROR Version: 2026.8.4 macos-arm64
EXIT=1
```

Then feed that verbatim to the detector:

```console
$ python3 -c "
import sys; sys.path.insert(0,'agent/src')
from post_hooks import is_verify_command_inert
print(is_verify_command_inert(1, 'mise ERROR unknown command: lint'))"
False
```

The heuristics check exit `127`, `"no tasks defined"`, `"no task named"`, `"mise"` + `"not found"`, and `"command not found"`. Real mise emits **`unknown command`** with exit **1**, matching none of them.

Observed in practice on task `01KZS7NFB480DGF2A6FZ5N3CZD` and `01KZS86KNZPVK8FZXX757ADZ8S` (both `lint_passed=false`, no inert note on the PR).

### Possible solution

Add mise's real phrasing to the heuristic list in `is_verify_command_inert`:

```python
or "unknown command" in s
```

Worth reviewing the full set of mise task-missing messages across versions rather than adding one string, and adding a regression test that feeds the verbatim stderr above. Note the mise version string is included in that stderr, so a test fixture should not match on version.

Related: the same detector is used for the post-agent gate in `agent/src/post_hooks.py` and for the lint inert path, so build and lint inert handling are both affected by the single missed match.

Contributor guide

Open the contributing guide

Research direction

Start in agent/src/post_hooks.py at is_verify_command_inert() and reproduce the verbatim mise stderr from the issue. Check the related handling in agent/src/repo.py where the inert warning is appended, then add a regression test covering the exit code and stderr; done means build and lint inert cases surface the warning and avoid false failures.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.