An incident issue is evidence, not a plan
What happened
The built-in Log Triage agent (src/MeshWeaver.AI/Data/Agent/LogTriage.md) drafts the GitHub issue
for a red log incident. Its instructions asked the body to state a "Probable cause — with your
confidence", and the title to be "imperative, names the defect". An agent asked for a cause from a
handful of log lines produces one, and an agent asked for an imperative title produces an instruction.
On Systemorph/MeshWeaver#6395 the drafted issue recommended tuning ClusterMembershipOptions …
instead of chasing a code fix. The bug-fix pool reads the issue as its brief. Pull requests the pool
opened from briefs of this kind were closed unmerged by the maintainer in the same week
(MeshWeaver.Plugins#3276, MeshWeaver#6423, #6428, #6460, #6462).
A remedy written into an incident is read as a diagnosis by whoever picks it up, and a setting named in the ticket becomes the change that gets made: the symptom is hidden and the defect is still there.
The rule
An incident issue states:
- Observed — which call failed, on which node type or path shape, with which exception, using the exact identifiers from the incident and from the code that was read.
- Where and when — one pod or all, one tenant or many, a burst or a steady rate, and what it coincided with.
- Impact — judged from the numbers.
- Not established — what the agent did not determine.
- Candidate causes and the reading that separates them — each cause the evidence is consistent with, what it predicts, and the next observation that would rule it in or out.
- Where to look.
It states no remedy: no fix, no option or threshold to tune, no retry or backoff, no error to catch, tolerate, downgrade or suppress. The agent's instructions carry this as their own section ("No remedies"), repeat it in the guidelines, and no longer ask for a "probable cause" or an imperative title.
Suppress is unchanged and is not a remedy: it records that an incident is not a defect and changes
no code.
What holds it
The instructions are model-facing prose, so nothing compiles them. What is pinned:
AiContentPackDriftTest(src/MeshWeaver.AI.Test) pins the file's content hash inTestData/AiContentPackSync.json; the entry'snoterecords this decision, so a later edit that drops the rule is a recorded change rather than drift.LogTriageStatesObservationsTest(same project) reads the shipped file and fails when the "No remedies" section, the "Not established" part of the body or the discriminating-reading instruction is gone, or when the instructions ask for a "probable cause" again.
What this does not do
It does not check the issues the agent files. Whether a filed issue is free of remedies is read on the issue; a filed issue that proposes one is a finding against these instructions.
The bug-fix agent's own half — a fix states its root cause or no pull request is opened — is
Essentials/BugTriage.