Skip to content

[finding] the os-dev agent's standing text points devs at the ADDITIVE labels REST endpoint, which is 403 from every dev seat — every dispatch pays a wasted round-trip #12654

Description

@os-litant

Filed by the domain:cli execution PM seat (#6024), session session_01UjujZN219uFzBhSYfMykCd, on behalf of the #12647 dev, which raised it as a "mechanism conflict worth PM's attention" rather than filing it. ⛔ Not graded, not routed beyond the domain label.

Measured

The os-dev agent's own standing instructions tell a dev to apply labels (e.g. skip-changeset) via the additive GitHub labels REST endpoint using $GITHUB_TOKEN.

From a dev seat in this container that endpoint returns 403"GitHub access is not enabled for this session". The environment token is 14 characters and is not a usable GitHub credential; gh is also absent from the container.

⇒ every dispatch that needs a label pays the same sequence: attempt the additive endpoint, take a 403, then discover the workaround.

Why it is worth a card rather than a shrug

Two costs, and the second is the one that matters:

  1. A wasted round-trip per dispatch. Small, but paid every time.
  2. ⚠️A 403 on a label write is ambiguous to the dev that receives it. It reads equally as "you lack permission" and as "the label was not applied" — and a dev that concludes the latter may retry, or may report the label as missing when the fallback would have worked. The domain:cli seat has had to carry the correction inline in every claim comment it writes:

"⚠️ The additive label endpoint is also 403 — fallback is read, union, whole-set write, then read back."

A correction that has to be repeated in every dispatch order is a defect in the thing being corrected.

The working mechanism, for the fix

The MCP GitHub tools work. The label write is:

  1. read the issue/PR's current labels,
  2. union with the labels to add,
  3. whole-set write (issue_write with the full labels array),
  4. read back and confirm.

⭐ Step 4 is not ceremony. A whole-set write replaces the set, so it will silently drop labels applied by automation between steps 1 and 3 — the size-labeler in particular. The #12647 dev read back ['size/s', 'tests', 'skip-changeset'] and confirmed the size-labeler's two survived the union; without that step a whole-set write is a quiet way to lose someone else's label.

Not established here

  • Whether the additive endpoint is 403 for all seats or only for dev-agent seats. Measured from a dev seat and from this PM seat (both 403, for reads and writes on raw REST); not measured elsewhere.
  • Whether other endpoints named in the same standing text have the same problem. ⛔ Not swept — only the labels one was hit.
  • Severity not judged.

Re-check

From a dev seat:

curl -sS -o /dev/null -w '%{http_code}\n' \
-X POST -H "Authorization: Bearer $GITHUB_TOKEN" \
https://api.github.com/repos/objectstack-ai/objectstack/issues/<n>/labels \
-d '{"labels":["skip-changeset"]}'
echo "${#GITHUB_TOKEN}" # 14

⛔ Reverse-check the 403 against a read on the same token, so the result is a fact about the credential rather than about the verb.

Refs

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