Skip to content

Configuring

.mesthiri/config.scm lives in your repository, so it is reviewed like code and a fork carries a copy. It is s-expressions, read as data.

(mesthiri
  (version 1)

  ;; Who certifies mesthiri's commits. Exactly one operator per repository;
  ;; rotation is a config edit. A DCO sign-off is a person
  ;; asserting where a contribution came from, so it names you, not a bot.
  (operator "Your Name" "you@example.org")

  ;; The two GitHub App IDs. Public configuration — only the private keys
  ;; are secrets.
  (apps (reader 123456) (writer 123457))

  ;; Which agent program mesthiri drives. Not the model — see "Choosing models".
  (agent (backend pi) (version "0.84.4"))

  ;; Where models come from. `endpoint` is the one place the URL is
  ;; written; the sandbox's allowlist is derived from it rather than kept
  ;; in step by hand. (Derived and reported — not enforced yet.)
  (providers
    (main (endpoint "https://api.anthropic.com")
          (secret   ANTHROPIC_API_KEY)      ; your repository secret
          (key-env  ANTHROPIC_API_KEY)))    ; what the agent reads it from

  ;; Your rubric, in your repository. mesthiri does not bring one.
  (rubric "docs/dev/github-issues.md")

  ;; Files no mesthiri change may touch, ever. Checked against the diff
  ;; before a pull request is opened, and again during review.
  (deny-paths ".mesthiri/**"
              ".github/workflows/**"
              "src/auth/**"
              "CODEOWNERS")

  (budgets
    (per-run (tokens 200000) (turns 40) (wall-clock "20m"))
    (per-day (runs 12)))          ; approximate runs-started cap — see "About budgets"

  ;; Minimum repository permission to issue each command.
  (commands (triage    (min-permission triage))
            (implement (min-permission write))
            (review    (min-permission triage))
            (fix       (min-permission write))
            (retro     (min-permission triage)))

  ;; `mode` is off | dry-run | live, and defaults to off. This is what
  ;; install scaffolds: triage thinking out loud, nothing else running.
  (stages
    (triage     (on (or (issue-opened) (issue-reopened)
                        (command "/triage")))
                (mode dry-run))                    ; ← the line to change
    (prioritize (on (schedule "08:00"))            (mode off))
    (code       (on (or (label "ready-to-implement")
                        (command "/implement")))   (mode off)
                (max-tier 0))                      ; raise to 1 when ready
    (review     (on (pull-request-updated))        (mode off))
                ;; only PRs mesthiri opened — built into dispatch, not a predicate
    (fix        (on (command "/fix"))              (mode off))
    (retro      (on (schedule "sunday 06:00"))     (mode off))))

The expressions after on are predicates over the event, drawn from a fixed vocabulary of short forms. A schedule is a whole-hour UTC time, optionally preceded by a weekday — "07:00" every day, "sunday 06:00" once a week. They are interpreted, not evaluated — a config file cannot become a program. The shim carries a single hourly tick and dispatch matches it against these schedules, so changing one is a config edit, not a pull request. This sample is the scaffold contract: install produces it, down to the deny-paths, max-tier 0, budgets and pinned versions.