# Cheap Question Mechanics

Catalog material for [`no-cheap-questions`](../../rules/no-cheap-questions.md) — Iron Laws 3, 4, 5, 6 and the cheap-class catalog. The rule states the laws; this context carries the prose.

## Cheap classes — full catalog

Sequencing · format-only · commit / CI / test asks · fenced re-ask · Iron-Law option · context-derived · dominant option · re-ask after decline · paternalistic (IL 3) · continuation under mandate (IL 4) · prereq-for-authorized-action (IL 5) · destination-already-stated (IL 6) · self-cleaning artefact follow-up · disguised commit ask (preview-as-bait) · commit-chunking-strategy (one-or-multiple / which-first / how-to-split). Extended examples: [`asking-and-brevity-examples`](../../../docs/guidelines/agent-infra/asking-and-brevity-examples.md#cheap-question-class-catalog--extended-examples).

## Iron Law 3 — No Paternalistic State-Assuming Options

```
NEVER FABRICATE USER STATE TO JUSTIFY AN OPTION.
"TAKE A BREAK", "SLEEP ON IT", "COME BACK FRESH" — FORBIDDEN.
THE USER DECIDES WHEN TO STOP.
```

## Iron Law 4 — halt conditions under autonomous mandate

### Mandate triggers

A standing autonomous mandate is active when any of these fire:

- `personal.autonomy: on` in `.agent-settings.yml` — the **persistent** opt-in. No per-turn phrasing and no roadmap command is required; the durable setting alone arms this Iron Law. Missing key defaults to `on`, so the cloud/headless default arms it too.
- `auto` mode after the user opted in via a standing "just work" directive (per [`autonomous-execution § opt-in detection`](../../rules/autonomous-execution.md#opt-in-detection--match-by-intent-not-exact-string)).
- `/roadmap:process-full` invocation.
- `/roadmap:process-phase` invocation.
- Explicit "entscheide selbst / decide and don't ask" in the current or a recent un-revoked turn.

The first two are the common case the persistent setting is *for*: a user who set `autonomy: on` never wants a "weiter? / shall I continue? / soll ich fortfahren?" prompt between clean batches. Treating those as cheap (IL 4) is not optional — it is the contract the setting promises.

### Halt conditions

The only halts named in the invoking command:

- **Hard Floor trigger** — bulk deletion, infra change, prod-trunk merge.
- **Council-off + ambiguity** — host can't resolve without input.
- **Security-sensitive** — auth, secrets, tenancy, public endpoints (`security-sensitive-stop`).
- **Scope out of roadmap** — work crosses the roadmap's stated bounds.
- **Test / quality RED** — failure that cannot be auto-fixed.

A clean edit-batch is not a halt condition — pick the next item.

## Iron Law 5 — prereq examples (silent execution, never a question)

When the user authorizes a top-level action ("commit", "push", "open PR", "run tests", "deploy"), the following prereq work is execution, not a decision point — never raise a numbered-options block about it:

- condensation / hash-sync before commit
- code formatting / linter auto-fix before commit
- type-check / quality-tool repairs to clear CI gates
- test repair when the user said "commit and the tests pass"
- symlink / index regeneration after edits
- manifest / discovery refresh
- branch-base inventory when user named the destination
- pre-push hook fix when it blocks an authorized push and the fix is obvious (gate-script update, stale pattern removal)

### Halt conditions during prereq execution

Stop and surface only on:

- **Hard Floor trigger** — bulk deletion, infra change, prod-trunk merge.
- **Test / quality RED** that cannot be auto-fixed → surface + ask.
- **Genuine ambiguity in WHAT to do** (not HOW to do it).

Everything else stays silent execution.

## Iron Law 6 — destination triggers (never re-ask)

The user has already named the destination — branch-base inventory does not fire:

- "commit in this PR" / "commit auf diesem branch"
- "commit in PR #218" / explicit PR number
- "push to `<branch>`"
- **Implicit**: user is currently ON the branch and says "commit" without a qualifier → the current branch IS the destination.

No "which branch?", no "should I open a new PR?", no branch-base inventory. `scope-control`'s branch inventory applies only when the destination is **unstated**.

## Self-cleaning artefact follow-up — never offer cleanup of self-managing state

```
ARTEFACT IS GITIGNORED, AUTO-PRUNED, OR TTL-MANAGED → CLEANUP
IS NOT A USER DECISION. NEVER OFFER IT AS A NUMBERED OPTION,
NEVER FRAME IT AS "WILLST DU AUFRÄUMEN?".
```

Triggers — files under `agents/runtime/`, council `questions/` / `responses/` / `sessions/`, cache directories, build artefacts, `dist/` regenerated by the package's sync pipeline, anything `.gitignore`'d that the system already prunes on a schedule. The system owns the lifecycle; surfacing it as a choice fabricates a decision point.

State the fact inline ("artefakte sind gitignored + auto-pruned nach 7 Tagen") if relevant — never as an option.

## Disguised commit ask — preview-as-bait

```
NEVER WRAP A COMMIT REQUEST AS A "MESSAGE PREVIEW",
"VORSCHLAG FALLS DU SPÄTER COMMITTEN WILLST",
OR A NUMBERED OPTION CONTAINING A COMMIT-MESSAGE BODY.
COMMIT-POLICY APPLIES REGARDLESS OF WRAPPING.
```

Failure shapes — "Commit-Vorschlag falls Du den Diff später als chore-Commit ablegen willst" with a fenced commit body · numbered option "2. Diff committen — `chore: …`" · "Hier wäre die Message falls Du committen willst" · any sequencing-disguise that pairs a commit body with a question mark.

Why cheap — [`commit-policy`](../../rules/commit-policy.md) says **never ask about committing**. Dressing the ask as a preview, suggestion, or sequencing option does not lift the ban; it just adds opacity. If the user authorized a commit → execute, derive the message from the diff. If they did not → don't write the message body at all.

## Commit-chunking strategy — never a user decision

```
NEVER ASK "ONE COMMIT OR MULTIPLE?", "WIE SOLL ICH SPLITTEN?",
"WELCHER CHUNK ZUERST?", "ZUSAMMEN ODER GETRENNT?".
THE AGENT PICKS THE SPLIT. STATE INLINE. EXECUTE.
```

Failure shapes — numbered-options block with "1. ein Commit · 2. zwei Commits · 3. drei Commits" · "Soll ich das in einem Rutsch committen oder splitten?" · "Welcher Commit zuerst — rules oder workspace?" · any question pairing a split-strategy choice with a question mark.

Why cheap — [`commit-policy § Always split into logical chunks`](../../rules/commit-policy.md) makes chunking the agent's call by default: one chunk per concern, foundation-first, generated files ride with their source. The user retains revert / amend control after the fact; they don't need to pre-approve the boundary. Mechanics + carve-outs: [`commit-mechanics § Always split into logical chunks`](../authority/commit-mechanics.md).

## When asking IS allowed

Real architectural / scope trade-off · vague-request trigger ([`ask-when-uncertain`](../../rules/ask-when-uncertain.md)) · security-sensitive ([`security-sensitive-stop`](../../rules/security-sensitive-stop.md)) · Hard Floor ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)) · two genuinely-equivalent paths where user preference is the tiebreaker.

## See also

- [`no-cheap-questions`](../../rules/no-cheap-questions.md) — the rule.
- [`commit-policy`](../../rules/commit-policy.md) — when commit IS authorized.
- [`scope-control § git-ops`](../../rules/scope-control.md) — branch / PR permission gate (fires only when destination unstated).
