Home / Stories / Slack commands
Story · Conversation Live

Ask in the channel. Get a draft MR, or a skip that sticks.

An engineer mentions the assistant in Slack about a workload that is misbehaving. The assistant finds the manifests that describe the workload. It works out a concrete change and answers in the same thread. If you do not want a proposal, one line in Slack turns "no thanks" into a reviewed annotation in git. Then the same proposal does not come back next week.

Starts fromAn @mention or a direct message in Slack, in plain English.
Looks atThe manifests in your repositories that match the workload, namespace and repository you named.
You getA threaded reply. A draft merge request (MR) with the usual gates. A proposal ping in your proposals channel.
01 · Just ask

Mention the assistant where the conversation already is.

You do not need to learn command syntax. The engineer describes the problem as they would to a colleague. They name the workload, the namespace and what they want the assistant to look at.

The assistant acknowledges within seconds, in the thread. Everyone in the channel can see that it picked up the request.

02 · Understand the request

Pull out the names, not the adjectives.

The assistant reads the request with plain patterns. It makes no extra AI model (LLM) call. It looks for quoted names, phrases like deployment orders-api, namespace hints such as in namespace shop, and cluster or repository hints. It drops filler words ("keeps", "please", "can you").

03 · Find what describes it

Search every repository it is allowed to read.

The assistant matches manifests on namespace first. Then it matches on name, kind and repository. The best matches become the context for the analysis.

A repository in context mode shares what it knows, but never receives an MR. Only repositories in full mode can get a proposal.

04 · Check the live state In development

Optionally, look at the cluster too, read-only.

If you configure tool servers, the analysis can check live cluster state through a bounded tool loop. It can list the pods, read the last termination reason and check the reconcile status. Every tool is read-only. Each request has a hard ceiling on calls.

This path is built and opt-in. By default, the assistant answers from the manifests in git.

05 · Same gates as everything else

A Slack request does not skip the checks.

The assistant drops suggestions below the confidence floor. It does not open a proposal twice if one already exists for the same repository. The diff goes through the same safety guard as scheduled scans. The guard escalates large removals to high risk and holds them for review.

06 · The answer, in the thread

What it found, what it proposes, how risky it is.

The reply lists each proposal with its category and risk. By default, the next scheduled submit opens the draft MR. Slack does not open it directly. So the reply says "draft MR pending review". Teams that want the MR immediately can switch on auto-submit.

If nothing matched, the reply says what the assistant searched. It suggests how to be more specific. The assistant does not invent a change.

07 · The proposal ping

Every new MR is announced where your team looks.

When the assistant opens the draft MR, a card lands in the proposals channel. The card shows the repository, category, risk, which agent produced it, the first lines of the reasoning and a button to the MR. Alert-driven changes go to the alerts channel instead. High-risk proposals can mention a named group.

08 · "Not for this one"

Skip a proposal, and make the decision durable.

Here is a different thread. The assistant proposed monitoring for a batch job that the team is retiring. An allowlisted operator replies skip <MR> monitoring. The assistant builds a one-line change that adds a skip annotation to that resource. It stores the change as its own proposal. After you merge it, that class of proposal stops for that resource, in every future run.

skip-all opts the resource out of everything. The same commands work as /skip comments on the MR itself.

09 · Two more things you can say

Corrections, and a review on request.

The assistant records a message that starts with feedback or wrong for the tuning pass, and acknowledges it. review <MR> asks the reviewer to look at any MR, including MRs that a person wrote In development.

The draft MR from the first thread is below.

# shop-oncall
M
maya 09:41
@gitops-assistant deployment orders-api in namespace shop keeps OOMKilling since the promo started, can you look at its memory limits?
G
gitops-assistant APP · 09:41
Analyzing your request…
request parsing · patterns only, no model call
  • deployment orders-api resource phrase
  • in namespace shop namespace hint
  • memory, limits, oomkilling keywords
  • keeps, since, started, can, you, look stopwords · dropped
  • no cluster or repo hint search all enabled repos
tool loop · read-only · 4 of max 10 calls
→ list_workloads(namespace="shop")
  orders-api  3/3 ready  restarts 14 (6h)
→ describe_object(pod orders-api-7c9f…)
  lastState.terminated.reason: OOMKilled
  limits.memory: 512Mi
→ prometheus_query(max_over_time(working_set[7d]))
  peak 509Mi · p95 431Mi
→ flux_reconcile_health(apps-shop)
  Ready · last applied 2d ago
no write verbs exist in this tool set
Suggestionraise memory limit
Confidence≥ floor ✓
Dedupno open twin ✓
Diff safetyrisk re-graded
proposal · stored as pending
title:    Raise orders-api memory limit 512Mi → 768Mi
category: resources   risk: low
source:   slack_command
diffs:    1 file, +2 −2
# shop-oncall · thread
M
maya 09:41
…can you look at its memory limits?
G
gitops-assistant APP · 09:43
✅ Analysis complete — 1 proposal(s) generated:
📊 🟢 Raise orders-api memory limit 512Mi → 768Mi (platform-prod) — draft MR pending review
M
maya 09:44
perfect, thanks 🙏
👀 2
# platform-proposals
G
gitops-assistant APP · 10:00
📊 New GitOps Proposal
Repositoryplatform-prod
CategoryResources
Risk🟢 Low
Sourceslack_command
Raise orders-api memory limit 512Mi → 768Mi
Seven-day peak working set is 509Mi against a 512Mi limit; 14 OOM restarts in 6h. Raises the limit to 768Mi and the request to 512Mi…
View Merge Request
opened by the next scheduled submit · draft, never auto-merged
# platform-proposals · thread
G
gitops-assistant APP
📋 New GitOps Proposal · Add ServiceMonitor for legacy-batch
J
jonas 10:12
@gitops-assistant skip platform-prod!57 monitoring — legacy-batch is being retired next quarter
G
gitops-assistant APP · 10:12
🔇 Skip recorded for platform-prod!57 — an annotation-add change adding monitoring to Deployment/legacy-batch is stored as proposal 3f2a…. The review gates then decide draft MR vs NEEDS_REVIEW.
apps/batch/legacy-batch/deployment.yaml
  metadata:
    name: legacy-batch
+   annotations:
+     gitops-assistant/skip: monitoring
direct message · gitops-assistant
M
maya
wrong: the probe proposals keep ignoring that our sidecar serves /healthz on 8081
G
gitops-assistant APP
Feedback recorded. It will be reviewed in the next tuning run.
in development
J
jonas
review platform-prod!61
G
gitops-assistant APP
Review posted on platform-prod!61: approve, quality 88/100, 1 concern.
Open review

The merge request the thread produced.

This example is illustrative. The names and numbers are invented. A proposal that starts in Slack is a normal draft MR. It has the same labels and gates as one from a scheduled scan. It carries the original request as evidence.

Draft

Raise orders-api memory limit 512Mi → 768Mi

from gitops-ai/raise-orders-api-memory-limit into main · 1 file · +2 −2
category:resourcessource:slack_commandrisk:lowxrev::LGTM
OverviewEvidenceChangesRequest
Summary

Requested in Slack: "deployment orders-api in namespace shop keeps OOMKilling since the promo started, can you look at its memory limits?"

This MR raises the memory limit of orders-api from 512Mi to 768Mi. It raises the request from 384Mi to 512Mi. The scheduler then reserves what the pod actually uses at peak.

Risk

Low. The change touches resources only, in one Deployment. It changes no selector, port or image. Three replicas restart one at a time.

After merge, expect
  • A rolling restart of orders-api, three pods.
  • No new OOMKilled terminations over the next 24 hours.
SignalValue
Memory limit (git)512Mi
Peak working set, 7 days509Mi
p95 working set, 7 days431Mi
Restarts, last 6 hours14, all OOMKilled

Matched manifests: apps/shop/orders-api/deployment.yaml (changed), hpa.yaml and the chart values in app-repo (context only, not changed).

        resources:
          requests:
            cpu: 250m
-           memory: 384Mi
+           memory: 512Mi
          limits:
-           memory: 512Mi
+           memory: 768Mi
Evidence
On-demand Slack request: deployment orders-api in namespace shop keeps OOMKilling since the promo started, can you look at its memory limits?

If you do not want this change, comment /skip on this MR, or write skip <MR> in Slack. The assistant then prepares a skip annotation for this Deployment instead.

R
independent reviewer second opinion, no pipeline context

The diff touches only the resources block of one Deployment. The new request fits under the seven-day peak with headroom. The limit is not below the request. LGTM.

What keeps it honest.

A chat interface makes it easy to ask for things. These rules stop it from becoming a way around review.

Draft MRs onlyA Slack request never changes the cluster and never merges anything. It produces a draft MR. Someone on your team reviews it like any other MR.
Same gates, same risk gradingThe confidence floor, the duplicate check and the diff safety guard all apply. The assistant escalates a diff that removes most of a file to high risk and holds it for review.
Skips are an allowlistOnly people on the trigger allowlist can skip. Anyone else gets a polite refusal. It names the setting that an admin would change.
Skips live in gitA skip becomes a one-line annotation MR. So you can review the decision, see it in the manifest, and keep it after a database reset. If you repeat the command in the same thread, nothing happens twice.
Context repos stay read-onlyRepositories that you mark as context inform the answer. They can never be the target of an MR.
Says when it found nothingIf nothing matches, the reply explains what the assistant searched. It does not guess a change.

Where this stands.

Live
  • @mention and DM requests, with answers in the thread
  • Proposal pings in the proposals and alerts channels
  • skip / skip-all from Slack, and /skip on MRs
  • feedback / wrong corrections recorded for tuning
In development
  • Read-only live cluster checks during a Slack request (built, opt-in)
  • review <MR> from Slack, through the on-demand reviewer
Roadmap
  • The assistant shows standing instructions from chat or MRs ("never propose X in this repository") as candidates for your POLICY.md
← Previous storyCluster state & Flux failures