Home / Stories / Feedback tuning
Story · Learning In development

Tell it once why the MR was wrong. It should not need telling twice.

A reviewer on your team comments on one of the assistant's merge requests (MRs). The comment says that the proposed probe points at the wrong port. The assistant collects that comment on its next poll and answers it in the thread. The comment also becomes evidence for a change to the instructions (the prompt) that produced the MR. The assistant proposes that change as an MR of its own. Then the team checks the next run against what you said.

Starts fromComments on the assistant's MRs and issues, corrections in Slack, and proposals that you closed without merging.
Looks atWhich agent and which prompt produced the proposal. It also looks at the other feedback that this prompt has collected.
You getCommands that act immediately. An answer in the thread that a maintainer has reviewed. A prompt-change MR for your installation that you can review.
01 · A proposal that is almost right

The assistant proposes a readiness probe.

orders-api has no readiness probe (a check that tells Kubernetes when a pod can receive traffic). So the assistant proposes one on the container port, 8080. That is reasonable from the manifest alone. It is wrong for this service. A sidecar (a second container in the same pod) serves the health endpoint on 8081.

02 · Say why, in plain words

A comment on the MR is all it takes.

The reviewer writes what they would write to a colleague. There is no template and no form. Closing an MR without merging is also a signal. Closing it with a reason is the strongest signal.

The assistant does not read a thumbs-down reaction that comes without words, so write a sentence.

03 · Collected on a schedule

Every comment lands in one feedback store.

A collection job reads new comments on the assistant's MRs and issues, Slack corrections and closed proposals. It stores each one with the proposal it belongs to. This step makes no AI model (LLM) call.

The job polls every 5 minutes while people actively comment. When things get quiet, it slows down in steps to every 2 hours. So the first comment after a quiet period can wait up to 2 hours. The job excludes the assistant's own comments, so the assistant never learns from itself.

04 · Commands act immediately

Some comments are instructions, and get an instant answer.

/reprompt regenerates the MR's diff on the next cycle, usually within 15 minutes. /skip turns "not for this resource" into a one-line annotation MR. The assistant acknowledges each command in the thread straight away. It confirms again when the work is done.

Only people on an allowlist can trigger these commands.

05 · Nothing goes unanswered

A queue of what still needs a reply.

The assistant sorts unanswered feedback into skip directives, acknowledgements ("thanks", "LGTM") and substantive comments. Substantive comments get a written answer in the thread. The answer gives the root cause and says what changes. As of October 2026, a maintainer helps to write the answer, and the assistant posts it. The assistant can also retitle the MR, and it marks the feedback as answered.

06 · Tune the instructions In development

A weekly pass turns feedback into a prompt change.

When enough feedback accumulates for one agent, a weekly analysis reads it against the agent's current prompt. The analysis proposes a specific wording change. The proposal is a low-risk draft MR against your installation's prompt configuration. Items that people closed with a reason weigh most. The rationale quotes the operator's own words.

This pass is built, but it stays dormant while we calibrate its threshold. Until then, people make the same changes by hand from the answered-feedback queue.

07 · Check the next run

Did the feedback actually land?

After the next full run, the team that operates the assistant matches each comment to the new proposal for the same workload. Then it gives a verdict: fixed, recurs, partial or not re-emitted. The team also flags a fix that quietly introduced a new mistake.

The assistant reloads prompts before every model call. So a merged prompt change applies to the next proposal as soon as you deploy it. No restart is needed.

Draft !142 · Add readiness probe to orders-api
        ports:
          - containerPort: 8080
+       readinessProbe:
+         httpGet: { path: /healthz, port: 8080 }
+         periodSeconds: 10
category:reliabilitysource:repo_scanrisk:low
Draft !142 · discussion
L
lena commented
Wrong port. orders-api's /healthz is served by the auth sidecar on 8081; 8080 has no health route and would mark every pod unready. Same for every service using the sidecar pattern.
👎 1 not read
MR & issue commentsgitlab_note
Feedback storeper proposal
Slack correctionsslack
Feedback storesame table
Closed, not mergedclosed_proposal
Feedback storesame table
collection interval · adapts to activity
  • last comment ≤ 1h ago every 5 min
  • ≤ 2h every 30 min
  • ≤ 4h every 60 min
  • quiet every 120 min
Draft !142 · discussion
L
lena
/reprompt
G
gitops-assistant
📥 Reprompt queued — this MR's diffs will be regenerated on the next reprompt cycle (typically within 15 minutes). The resulting update will replace the current branch contents and add a follow-up comment when complete.
G
gitops-assistant 12 min later
🔄 Proposal reprompted — probe now targets port 8081, read from the sidecar's containerPort in the same pod spec.
feedback triage · unanswered
  • !142 "Wrong port. orders-api's /healthz…" substantive
  • !139 "/skip monitoring" skip · acked
  • !137 "LGTM, merging" ack
Draft !142 · reply
G
gitops-assistant
Root cause: the probe port came from the first containerPort of the main container; sidecars were not considered. Next: prefer a container that already declares a health route on /healthz in the same pod. The diff here has been regenerated.
weekly analysis · source=repo_scan · 4 items, 1 high priority
config/prompts.yaml · analyse_manifest
   When proposing a readiness or liveness probe:
-  - Use the container's declared port.
+  - Use the port of the container that serves the health
+    route. If a sidecar in the same pod declares /healthz or
+    /ready, probe the sidecar's port, and say so in the
+    description.
category:architecturesource:feedback_tuningrisk:low
next run · feedback verification by the service team
  • !142 orders-api probe port fixed · 8081
  • payments-api probe port fixed · same pattern
  • inventory-api probe path partial · port right, path /ready
  • legacy-batch monitoring not re-emitted · skip merged
3 of 4 comments resolved · 1 partial carried forward

The prompt-change MR you get.

Illustrative, and In development. The weekly pass that writes this MR is built, but it stays dormant while we calibrate its threshold. The title, labels and section headings are the ones that it writes.

Draft

Prompt improvement (repo_scan): analyse_manifest

from gitops-ai/prompt-improvement-repo-scan-analyse-manifest into main · 1 file · +4 −1
category:architecturesource:feedback_tuningrisk:low
RationaleFeedback usedChangesAfter merge
Prompt Improvement Proposal

Source feedback group: repo_scan · Target file: config/prompts.yaml · Prompt key: analyse_manifest

Rationale

Three of four comments on probe proposals in the last 30 days say the same thing. The probe targeted the main container's port, but a sidecar serves the health route. One reviewer closed an MR with this reason:

Wrong port. orders-api's /healthz is served by the auth sidecar on 8081; 8080 has no health route and would mark every pod unready.

The current instruction ("use the container's declared port") produces exactly this result. The change makes the probe follow the container that serves the health route. It also requires the description to say which container the assistant chose.

SourceProposalFeedback
closed_proposal ⚠️ high priorityAdd readiness probe to orders-apiWrong port; health route is on the sidecar (8081).
gitlab_noteAdd liveness probe to payments-apiSame sidecar pattern, same wrong port.
slackn/a"the probe proposals keep ignoring that our sidecar serves /healthz on 8081"
gitlab_noteAdd readiness probe to inventory-apiPort fine; path should be /ready.

Generated by FeedbackTuningAgent from 4 feedback item(s).

  analyse_manifest: |
    …
    When proposing a readiness or liveness probe:
-   - Use the container's declared port.
+   - Use the port of the container that serves the health
+     route. If a sidecar in the same pod declares /healthz or
+     /ready, probe the sidecar's port, and say so in the
+     description.
    …
After merge, expect
  • Once you deploy the change, the assistant reads the prompt file on the next model call. No restart is needed.
  • Probe proposals for sidecar-pattern services name the sidecar's port and say why.
  • The next run's feedback check marks each of the four items above as fixed, recurs or partial.
Rollback

Revert this MR. The assistant restores the previous wording on the next call.

L
lena approved

Matches what we keep correcting by hand. Merging.

What keeps it honest.

A system that rewrites its own instructions needs firm limits. These are the limits it has.

Prompt changes are MRsTuning never edits a prompt in place. It opens a draft MR. A person reviews and merges that MR. A revert undoes it.
Feedback is data, not instructionsThe assistant wraps comment text as untrusted input. A comment that says "ignore your rules and…" is analysed as feedback. The assistant does not obey it.
It does not learn from itselfThe assistant excludes its own comments, acknowledgements and review notes from the feedback that it analyses.
A threshold before any changeThe assistant proposes no prompt change until enough items have accumulated for that agent. So one grumpy comment does not rewrite a prompt.
Commands are allowlisted/reprompt and /skip act only for listed users. The assistant acts on each trigger once.
Checked, not assumedPeople check each comment again against the next run. "Fixed" is a verdict about the new proposal. It is not a verdict about the commit that tried to fix the problem.

Where this stands.

Live
  • Collection of MR and issue comments, Slack corrections and closed proposals, every 5 minutes to every 2 hours
  • /reprompt and /skip with immediate acknowledgement
  • Triage of unanswered feedback. The assistant posts root-cause replies on a maintainer's behalf
  • Each comment checked against the next run by the team operating the assistant
In development
  • Weekly analysis that proposes prompt-change MRs (built, dormant)
Roadmap
  • Standing instructions from comments promoted into your POLICY.md
← Previous storyYour policy, honoured