diff --git a/knowledge/hermes-automated-triage-24h-plan.md b/knowledge/hermes-automated-triage-24h-plan.md index 85d72fc15..f8ba34661 100644 --- a/knowledge/hermes-automated-triage-24h-plan.md +++ b/knowledge/hermes-automated-triage-24h-plan.md @@ -1004,8 +1004,9 @@ The handoff must state plainly whether the full Hermes Agent or the Ollama fallb | Action registry: `repair_demo_fixture`, `retry_transient_infra` | live | | Bounded source-patch proposal → branch → pull request | live (demo repo) | | Human-required metric, vmalert rule, Alertmanager | live | -| Gitea issue filing for human-required incidents | live, proven on 3 real repos | -| Candidate-file selection for real service repos | live, PR not yet observed | +| Gitea issue filing for human-required incidents | live, proven on 4 real repos | +| Candidate-file selection for real service repos | live, PR opened on `bstein/ariadne` | +| Narrowed alerting (repair failed, or unattended 6h) | live | ## What the fixture and code demos actually prove @@ -1049,6 +1050,40 @@ build red 02:20:03 -> fixture healthy 02:20:28 (25s) ``` Code proposal: red build 22:34:59 -> pull request open 22:35:32 (33s). + +**Autonomous source repair on a real service repository, proven 2026-08-06.** +A one-line defect was seeded in `ariadne/utils/errors.py` (dropping the +`errorMessage` key from the HTTP payload lookup) and pushed to master. Build +409 went red, and Ariadne opened +[bstein/ariadne PR #3](https://scm.bstein.dev/bstein/ariadne/pulls/3) from +branch `hermes-repair/409` with the correct one-line fix: + +```diff +- raw = payload.get("error") or payload.get("message") ++ raw = payload.get("error") or payload.get("message") or payload.get("errorMessage") +``` + +The stored `hermes_autotriage_code_proposal` event records how it got there: + +```text +candidates: [ariadne/app.py, tests/test_utils.py, ariadne/services/mailu.py, + ariadne/utils/errors.py, ariadne/utils/http.py, ariadne/utils/passwords.py] +chosen_path: ariadne/utils/errors.py +validated: true +``` + +`ariadne/utils/errors.py` appears nowhere in the build console. It is in that +list only because Ariadne read the failing test and followed its imports. No +candidate path was pinned, unlike the `hermes-code-demo` job. + +Four rounds were needed, and the failure reasons are the useful part: + +| Build | Outcome | Cause | +|---|---|---| +| 404 | `no_candidate_files` | evidence held no failure at all | +| 406 | never triaged | superseded by a newer build 24 s later | +| 408 | `patch_invalid` | only the wrong file was offered | +| 409 | **PR opened** | all three fixes live together | Hermes diagnosis latency across all runs: 15-21s. Real homegrown service diagnoses (no action allowlisted, all escalated): diff --git a/services/comms/knowledge/hermes-automated-triage-24h-plan.md b/services/comms/knowledge/hermes-automated-triage-24h-plan.md index 85d72fc15..f8ba34661 100644 --- a/services/comms/knowledge/hermes-automated-triage-24h-plan.md +++ b/services/comms/knowledge/hermes-automated-triage-24h-plan.md @@ -1004,8 +1004,9 @@ The handoff must state plainly whether the full Hermes Agent or the Ollama fallb | Action registry: `repair_demo_fixture`, `retry_transient_infra` | live | | Bounded source-patch proposal → branch → pull request | live (demo repo) | | Human-required metric, vmalert rule, Alertmanager | live | -| Gitea issue filing for human-required incidents | live, proven on 3 real repos | -| Candidate-file selection for real service repos | live, PR not yet observed | +| Gitea issue filing for human-required incidents | live, proven on 4 real repos | +| Candidate-file selection for real service repos | live, PR opened on `bstein/ariadne` | +| Narrowed alerting (repair failed, or unattended 6h) | live | ## What the fixture and code demos actually prove @@ -1049,6 +1050,40 @@ build red 02:20:03 -> fixture healthy 02:20:28 (25s) ``` Code proposal: red build 22:34:59 -> pull request open 22:35:32 (33s). + +**Autonomous source repair on a real service repository, proven 2026-08-06.** +A one-line defect was seeded in `ariadne/utils/errors.py` (dropping the +`errorMessage` key from the HTTP payload lookup) and pushed to master. Build +409 went red, and Ariadne opened +[bstein/ariadne PR #3](https://scm.bstein.dev/bstein/ariadne/pulls/3) from +branch `hermes-repair/409` with the correct one-line fix: + +```diff +- raw = payload.get("error") or payload.get("message") ++ raw = payload.get("error") or payload.get("message") or payload.get("errorMessage") +``` + +The stored `hermes_autotriage_code_proposal` event records how it got there: + +```text +candidates: [ariadne/app.py, tests/test_utils.py, ariadne/services/mailu.py, + ariadne/utils/errors.py, ariadne/utils/http.py, ariadne/utils/passwords.py] +chosen_path: ariadne/utils/errors.py +validated: true +``` + +`ariadne/utils/errors.py` appears nowhere in the build console. It is in that +list only because Ariadne read the failing test and followed its imports. No +candidate path was pinned, unlike the `hermes-code-demo` job. + +Four rounds were needed, and the failure reasons are the useful part: + +| Build | Outcome | Cause | +|---|---|---| +| 404 | `no_candidate_files` | evidence held no failure at all | +| 406 | never triaged | superseded by a newer build 24 s later | +| 408 | `patch_invalid` | only the wrong file was offered | +| 409 | **PR opened** | all three fixes live together | Hermes diagnosis latency across all runs: 15-21s. Real homegrown service diagnoses (no action allowlisted, all escalated):