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 leaves a comment on one of the assistant's merge requests: the probe it proposed points at the wrong port. That comment is collected within minutes, answered in the thread, and becomes evidence for a change to the instructions that produced the MR, proposed as a merge request of its own. The next run is then checked against what you said.

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

The assistant proposes a readiness probe.

orders-api has no readiness probe, so the assistant proposes one on the container port, 8080. Reasonable from the manifest alone. Wrong for this service: the health endpoint is served by a sidecar 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. No template, no form. Closing an MR without merging is a signal too, and closing it with a reason is the strongest one.

A thumbs-down reaction on its own is not read; write a sentence.

03 · Collected within minutes

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, and stores each with the proposal it belongs to. No model call happens here.

It polls every 5 minutes while people are actively commenting and backs off to every 2 hours when things are quiet. The assistant's own comments are excluded, so it 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 in the thread straight away and confirms again when the work is done.

Only people on an allowlist can trigger them.

05 · Nothing goes unanswered

A queue of what still needs a reply.

Unanswered feedback is sorted into skip directives, acknowledgements ("thanks", "LGTM") and substantive comments. Substantive ones get a written answer in the thread: the root cause and what changes. Today that answer is written with a maintainer in the loop and posted by the assistant, which can also retitle the MR and marks the feedback as answered.

06 · Tune the instructions In development

A weekly pass turns feedback into a prompt change.

Once enough feedback has accumulated for one agent, a weekly analysis reads it against that agent's current prompt and proposes a specific wording change, as a low-risk draft MR against your installation's prompt configuration. Closed-with-a-reason items weigh most, and the operator's own words are quoted in the rationale.

This pass is built and held dormant while its threshold is calibrated; today the same changes are made by hand from the answered-feedback queue.

07 · Check the next run

Did the feedback actually land?

After the next full run, the team operating the assistant matches each comment to the new proposal for the same workload and judges it: fixed, recurs, partial or not re-emitted. A fix that quietly introduced a new mistake is flagged too.

Prompts are reloaded before every model call, so once a merged prompt change is deployed it applies to the next proposal, with no restart.

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 and held dormant while its threshold is calibrated. The title, labels and section headings are the ones 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 probe targeted the main container's port while the health route is served by a sidecar. One reviewer closed an MR with the 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. The change makes the probe follow the container that serves the health route, and requires the description to say which one was chosen.

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 deployed, the prompt file is picked up on the next model call; no restart.
  • Probe proposals for sidecar-pattern services name the sidecar's port and say why.
  • The next run's feedback check marks the four items above as fixed, recurs or partial.
Rollback

Revert this MR. The previous wording is restored 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 edges. These are the ones it has.

Prompt changes are MRsTuning never edits a prompt in place. It opens a draft MR that a person reviews and merges, and a revert undoes it.
Feedback is data, not instructionsComment text is wrapped as untrusted input. A comment that says "ignore your rules and…" is analysed as feedback, not obeyed.
It does not learn from itselfThe assistant's own comments, acknowledgements and review notes are excluded from the feedback it analyses.
A threshold before any changeNo prompt change is proposed until enough items have accumulated for that agent, so one grumpy comment does not rewrite a prompt.
Commands are allowlisted/reprompt and /skip only act for listed users, and each trigger is acted on once.
Checked, not assumedEach comment is re-checked by people against the next run. "Fixed" is a verdict about the new proposal, not about the commit that intended to fix it.

Where this stands.

Live
  • Collection of MR and issue comments, Slack corrections and closed proposals, within minutes
  • /reprompt and /skip with immediate acknowledgement
  • Triage of unanswered feedback, and root-cause replies posted by the assistant 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, held dormant)
Roadmap
  • Standing instructions from comments promoted into your POLICY.md
← Previous storyYour policy, honoured