4940 Commits

Author SHA1 Message Date
flux-bot
5090cd85b5 chore(cassandra): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 06:29:55 +00:00
flux-bot
6c50df9177 chore(cassandra): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 06:25:56 +00:00
flux-bot
4af3253b60 chore(cassandra): automated image update 2026-08-07 06:22:13 +00:00
flux-bot
92f1339b38 chore(cassandra): automated image update 2026-08-07 06:21:58 +00:00
flux-bot
bc8ecc895b chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 05:15:42 +00:00
flux-bot
308db59706 chore(cassandra): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 05:03:24 +00:00
flux-bot
f4959d5cf0 chore(cassandra): automated image update 2026-08-07 05:03:16 +00:00
flux-bot
4877c79ed3 chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 04:54:17 +00:00
jenkins
bd6c0678d8 feat(demo): provoke the triage tick instead of waiting a minute for it
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
Both demos went quiet for up to a minute between the build turning red and
the monitor reacting, because Ariadne's tick is on cron. The scripts now run
that tick immediately over the pod's own loopback - nothing exposed outside
the cluster - and print what it saw, so the pause becomes a visible step
rather than dead air.

Falls back to silence rather than failure: if the request does not land the
scheduler still picks the build up within the minute, which is exactly the
old behaviour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 01:44:03 -03:00
jenkins
8899b76d07 fix(demo): stop waiting ten seconds to notice a finished build
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
wait_for_build slept before its first poll, so a build that had already
finished still bought a full interval of silence. On stage that reads as the
script having missed the result - the build goes red in Jenkins and the
terminal sits there. Polling first and sleeping after removes it entirely: a
finished build now returns in under a second, measured.

The interval drops from ten seconds to three for the same reason. The wait is
dead air in front of an audience and a Jenkins status read is cheap. The
budget is now expressed in seconds rather than poll counts, so shortening the
interval does not silently shorten the timeout.

This is only the script's own latency. Ariadne's autotriage cron is * * * * *,
so an incident still takes up to a minute to appear after a build fails, and
no amount of polling here changes that.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 01:08:24 -03:00
jenkins
3946ec8eed feat(demo): show the seeded change before pushing it
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
The run tab said a defect was seeded and then moved on. The audience had to
take on trust both that a change was made and that the diagnosis Hermes
produced two minutes later actually matched it. Printing the diff first closes
that gap: they watch the wrong line go in, then watch a model find the same
line without being told where it is.

Placed before the commit rather than after the push because this is the only
moment in the demo where a human changes any code, and it is worth being seen
as such. The short sha follows the push so the commit on screen can be matched
to the one Jenkins builds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 00:59:21 -03:00
flux-bot
cdef6cee4b chore(maintenance): automated image update 2026-08-07 03:52:04 +00:00
flux-bot
0206ef0424 chore(maintenance): automated image update 2026-08-07 03:41:56 +00:00
flux-bot
0a62993518 chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 03:25:49 +00:00
flux-bot
0622b0fdea chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 03:16:02 +00:00
jenkins
bab620fb61 feat(ariadne): sweep four services, and link proposals to the finding
Only one pull request appeared because the sweep was scoped to one project at
one proposal per hour - a throttle I set deliberately while nothing had ever
run, not a limit of the mechanism. It has now run, so it widens to every
project whose job also has a write allowlist: ariadne, metis, soteria and
bstein-dev-home. The rest are left out because without allowed prefixes
nothing is patchable, and a sweep would spend a SonarQube call to discover it
has nowhere to write.

Still one proposal per project per hour. The backlog is 139 findings on
Ariadne alone; the constraint that matters is how many pull requests a person
will actually read, not how many the mechanism could open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 00:06:33 -03:00
flux-bot
855d0537dc chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 02:56:19 +00:00
jenkins
c52d221d91 feat(demo): print the Hermes run link at the decision stage
The Hermes stage is where the demo claims a model made the call. It showed the
stored JSON and named the run id, which asks the audience to take the rest on
trust. It now prints the console link for that exact run, so the claim can be
opened on screen instead of described.

Same route the pull request links to, so following either lands on the same
page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 23:46:42 -03:00
flux-bot
041383449f chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 02:27:09 +00:00
jenkins
2661d4da11 feat(ariadne): link pull requests to the Hermes run that wrote them
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 23:17:06 -03:00
flux-bot
7bd2f509b8 chore(cassandra): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 02:02:23 +00:00
flux-bot
83af44806b chore(cassandra): automated image update 2026-08-07 01:59:02 +00:00
flux-bot
885b30cc5c chore(cassandra): automated image update 2026-08-07 01:55:00 +00:00
flux-bot
189434e3f6 chore(cassandra): automated image update 2026-08-07 01:54:22 +00:00
jenkins
afbd49c399 fix(demo): encode the Jenkins tree selector so run does not die on curl
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
hermes_code_demo.sh run crashed before it did anything, with a JSON traceback
pointing at the parser rather than the cause. Jenkins tree selectors use square
brackets; this curl build treats them as glob metacharacters and declines to
send the request, so the body came back empty and json.load reported column 1.

Encoded, and an empty body now says which job and which Jenkins rather than
raising from inside the parser. The crash was harmless as crashes go - it
happened before the defect was seeded, so nothing was pushed - but it happened
at the exact moment a demo starts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:51:08 -03:00
jenkins
4cc0de7fff fix(ariadne): read the SonarQube token from a path Ariadne can already reach
The sweep's token was injected from kv/data/atlas/quality/sonarqube-oidc,
which the maintenance role cannot read. I granted that path on the live policy
and verified the read, but the grant was reverted by whatever manages Vault
policy, and the next rollout wedged: vault-agent-init retries a 403 forever, so
the pod never initializes and the Deployment cannot roll. The old replica kept
serving, which is the only reason this was not an outage.

A template block that depends on a grant outside this repository is the actual
defect. The token now lives beside Ariadne's other credentials in
kv/data/atlas/maintenance/ariadne-db - a path its role has always been able to
read - so no policy change is needed and nothing outside this repo can revoke
it. Existing keys at that path were merged, not replaced.

Guarded with an if, so a deployment whose secret predates the key renders an
empty value and starts normally instead of blocking on a missing field. The
sweep then reports an empty token and skips, which is the right failure: no
sweep is much better than no Ariadne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:42:23 -03:00
flux-bot
51ebb076c2 chore(maintenance): automated image update 2026-08-07 01:40:41 +00:00
flux-bot
314171d29f chore(maintenance): automated image update 2026-08-07 01:38:08 +00:00
flux-bot
44753bc0e9 chore(maintenance): automated image update 2026-08-07 01:37:12 +00:00
flux-bot
165b90b335 chore(maintenance): automated image update 2026-08-07 01:35:35 +00:00
flux-bot
c395f477c8 chore(maintenance): automated image update 2026-08-07 01:33:03 +00:00
flux-bot
6de765966f chore(maintenance): automated image update 2026-08-07 01:28:57 +00:00
flux-bot
3775fe4101 chore(cassandra): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
2026-08-07 01:25:04 +00:00
flux-bot
d8620a7c1d chore(cassandra): automated image update 2026-08-07 01:18:50 +00:00
flux-bot
fd9bfcd083 chore(cassandra): automated image update 2026-08-07 01:14:59 +00:00
flux-bot
9972895bc2 chore(cassandra): automated image update 2026-08-07 01:13:56 +00:00
jenkins
0428110eec feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.

Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.

Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.

The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
jenkins
35ae4d4bab refactor(demo): split the two demos into two scripts
Some checks failed
Tests / Declarative: Post Actions failed: 2, passed: 142
One script with a 'fixture' and a 'code' subcommand meant the wrong subcommand
was always one word away, in front of an audience, with different blast radii
behind each: the triage demo touches only a ConfigMap, the code demo pushes to
a repository and deletes issues. Those should not share a command line.

Each demo is now its own driver with the same five verbs - monitor, reset,
preflight, run, status - so knowing one teaches the other. What they genuinely
share (credentials, Jenkins access, the tick reader, the lab-wide preflight
checks) moved to hermes_demo_lib.sh rather than being duplicated, because the
reason to split was clarity at the command line, not two copies of the same
helper drifting apart.

Each reset now covers only its own demo. The triage reset no longer reaches
into a Gitea repository it never writes to, and the code reset owns the
repository cleanup entirely.

The credentials file is now hermes_demo.env since both read it; the old
hermes_triage_demo.env is still sourced as a fallback so a filled-in file
keeps working, and both names stay git-ignored.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 21:59:23 -03:00
jenkins
5fd5e6d729 docs(demo): call it the Test Automation Diagram everywhere
The scripts said "flow chart" while the artifact the audience is following
has a name. Telling a room to follow along on the flow chart and then handing
them something titled Test Automation Diagram makes them hunt for the match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 21:53:52 -03:00
jenkins
151cd574a9 fix(demo): make reset actually undo the code demo's seeded defect
The code demo seeds its defect by pushing to master, and the fix only lands if
someone merges the pull request - which, by design, nobody does during a demo.
So master stays broken, and reset only printed "revert it before demoing"
while leaving it that way. The second run of the day then aborted on "defect
already present" before anything started.

Reset now reverts it on master. The substitution is anchored so it cannot
match an already-correct divisor, which keeps reset idempotent: running it on
a healthy repository changes nothing rather than corrupting the file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 21:53:26 -03:00
flux-bot
86420ecfee chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions testing.tests.test_repo_structure.test_knowledge_service_mirror_matches_source failed
2026-08-07 00:34:37 +00:00
flux-bot
71fe6ddcbb chore(maintenance): automated image update 2026-08-07 00:22:19 +00:00
jenkins
292999118b docs(triage): record the escalation branch's new output for the diagram
The chart draws the human path as a dead end for the automation. It now has a
second output - a remediation Hermes proposes but cannot request - and the
arrow has to terminate at a person rather than at the action registry, or the
drawing would imply the model can grow its own capabilities.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 21:21:45 -03:00
jenkins
df41cde9f8 fix(demo): keep the whole diagnosis on screen and explain a proposed remediation
Some checks failed
Tests / Declarative: Post Actions testing.tests.test_repo_structure.test_knowledge_service_mirror_matches_source failed
The diagnosis dump was clipped at 16 lines, which was already tight and now
truncates the stored outcome once a suggested remediation is present - the
audience would see the JSON cut off mid-object at exactly the moment the
interesting field appears.

Also says what that field means when it shows up, since a proposal is easy to
misread as something Ariadne is about to do. It is inert: no gate reads it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 21:21:16 -03:00
jenkins
c73a79a243 feat(ariadne): allowlist clear_stuck_agent_pods
A build whose agent never started is a distinct failure from one that lost a
connection mid-run, and a plain retry queues behind the same stuck pods. The
remediation clears pods that have already succeeded or failed - Ariadne's
existing scheduled cleanup - and only then rebuilds.

Mapping jenkins_agent_provisioning_failure to it keeps the one-classification-
one-action rule: a diagnosis asking for this action under any other
classification is still refused before anything runs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 21:16:21 -03:00
flux-bot
649e6f1e37 chore(cassandra): automated image update 2026-08-07 00:15:39 +00:00
flux-bot
117e63b62c chore(maintenance): automated image update 2026-08-07 00:13:14 +00:00
flux-bot
06fb7e2747 chore(cassandra): automated image update 2026-08-07 00:06:20 +00:00
flux-bot
64ae7e13c2 chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions testing.tests.test_repo_structure.test_knowledge_service_mirror_matches_source failed
2026-08-07 00:00:14 +00:00
flux-bot
a4fccb127d chore(cassandra): automated image update 2026-08-06 23:59:08 +00:00