---
title: "Agent Smith promotion-run audit feed (admin console)."
method: GET
path: "/smith/promotion-runs"
tags: ["Dojo"]
---

# Agent Smith promotion-run audit feed (admin console).

`GET /smith/promotion-runs`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/smith/promotion-runs`
- Auth: HTTP bearer

Returns the raw promotion-gate audit trail (newest first) for the /admin/agent-smith Promotion-runs table: one row per candidate evaluation with the gate's per-check verdicts (novelty / efficacy(ci_pass) / scope) plus the measured efficacy, confidence, containment, the range breaches/trials, and whether it promoted (and to which technique). tactic/surface/cell_key/evo_version are flattened from the candidate; the raw attack prompt is NOT surfaced. `?scenario=` filters; `?limit=` (default 50, max 200) pages. Fail-soft → empty runs on a control-plane outage. Admin-only. MNE-1314.

## Query parameters

- `scenario` string
- `limit` integer

## Response `200`

The flattened promotion-run audit feed.

- object
  - `runs` object[], required
    - `id` string, required
    - `scenario_id` string, nullable
    - `tactic` string, nullable
    - `surface` string, nullable
    - `cell_key` string, nullable
    - `evo_version` integer, nullable
    - `novelty_pass` boolean, required
    - `novelty_score` number, nullable
    - `breaches` integer, nullable: Range breaches (the repurposed reproductions count).
    - `trials` integer, nullable
    - `ci_pass` boolean, required: Efficacy gate passed (post-MNE-951 meaning).
    - `scope_pass` boolean, required
    - `efficacy` number, nullable
    - `confidence` number, nullable
    - `containment_rate` number, nullable
    - `promoted` boolean, required
    - `technique_id` string, nullable
    - `created_at` string, nullable

## Other responses

- `401`: Authentication required
- `403`: Forbidden
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.

---

[API](https://skmtc.dev/mnemom/apis/mnemom-api.md) · [All operations](https://skmtc.dev/mnemom/apis/mnemom-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mnemom/apis/mnemom-api/revisions/274b7a6ea182?raw)
