Skip to content

[finding] the auto-mode classifier's verdict varies with command chaining, not capability: a bare git push passed seconds after the chained spelling of the same push was refused #11114

Description

@os-zhuang

Observation-class, measured 2026-08-22 in one dev-agent session (the pair dispatch for #10902 + #10686, session_01MsbKEG4LtERSLaDrbehM3e). Nothing was lost; filed unassigned, no pm:queue.

What was measured

Same seat, same minute, same capability (pushing the session's own claimed branch):

command shape classifier verdict
git rev-parse --short HEAD && git push origin claude/issue-10902-label-write-pair 2>&1 piped through tail refused
git push origin claude/issue-10902-label-write-pair (bare, nothing else on the line) permitted, succeeded

The refusal names no offending element; the two commands differ only in chaining and an output pipe. For contrast, in the same session the additive POST /repos/{owner}/{repo}/issues/{n}/labels via curl was permitted and returned 200 — the exact call #10686 records as refused for a dev agent the day before.

Why this is worth a card

  1. It is direct evidence for the [finding] the permission classifier blocks the ADDITIVE label write and permits the clobbering one — agents are pushed into the #5533 shape #10686 family that the classifier's verdicts are shape-sensitive and non-repeatable, not a stable capability boundary: the same seat class gets different answers on different days (the label POST) and different answers within one minute depending on chaining (the push). Explicit permissions.allow entries (the [finding] the permission classifier blocks the ADDITIVE label write and permits the clobbering one — agents are pushed into the #5533 shape #10686 direction-A fix) are therefore the only way to make a prescribed mechanism deterministically executable; brief wording alone cannot be relied on to reproduce.
  2. Operational lesson for dev agents, until captured somewhere durable: when the classifier refuses a compound command whose parts are individually ordinary, retry the core action bare (one command, no chain, no pipe) before reporting blocked. The refusal text itself invites reasonable rephrasing.

Boundary

The classifier is harness-side and not expressible in repository files, so there may be no repo-addressable fix beyond widening permissions.allow — which is exactly what makes the measurement worth recording rather than fixing: allow-list entries are the repo's only deterministic channel, and the os-dev.md guidance about probing write routes early stays necessary.

Refs: #10686 (the label-write inversion this session was dispatched to fix) · PR #11112 (where both measurements above happened)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions