Sm Github

The GitHub-issues state engine for the machine loop: a pure-JS SM (scrum-master) rule pack that reconciles issue/PR state every tick — re-fires dead dev/rework legs on red CI, dispatches review when a developed PR goes green, and merges approved PRs oldest-first (FIFO) one per tick. State lives in issue/PR labels; the engine is deterministic (no LLM).

Parameters

Configured via customParams in the agent JSON or the project .dmtools/config.js (project values win).

  • repository — target owner/repo the rules reconcile.
  • workflowFile — the runner workflow dispatched for legs (default ai-teammate.yml).
  • removeLabel / removeLabels — label(s) stripped from the issue after the rule fires (idempotency).
  • localTeammate — run the target config’s action in-process instead of dispatching a workflow.
  • branchPrefix — PR head-branch prefix linking PRs to gh-<n> issues (default ai/gh-).
  • maxWorkflows — global dispatch cap per tick (default 1).
  • dryRun — log the plan without acting.

Labels

The machine’s state lives in labels; two are owner-facing semantics worth knowing:

  • blocked — human hold: the item is invisible to EVERY rule (all legs) until a human removes the label.
  • validation_failed — sticky guest park (owner 2026-09-27, live: fa#923 — a guest PR cycled arm→CI red→silent-update→re-arm every tick, holding the validate-armed limit-1 slot hostage). The silent-update action sets it on a GUEST PR whose current head has red checks; while it is set the PR is excluded from the validate-armed arm queue and NO validation CI is dispatched for it at all. It is removed only when the head’s last committer is NOT sm-silent-update — i.e. an author push; the SM’s own silent-update merges never clear it. Machine-authored PRs never carry the label (their heads are pushed by the machine; they re-enter validation on a new head as usual).

Human doc: agents/docs/agents/sm_github.md

Attributes

AttributeValue
JobJSRunner
Configsm_github.json
ContextId—
outputType—
skipAIProcessingfalse

Actions

LLM step

  • outputType: none

Generated by js/agentDocGenerator.js