A revoked model credential made every dispatch fail at the first model call,
and eve's built-in GitHub handlers echoed the provider's own words back into
the originating thread: "Model provider API error: Authentication Fails, Your
api key: ****53a6...". The failure is an operator problem, not a reply, so it
repeated in full on every mention in every conversation.
`lib/failure-policy.ts` now decides what a channel may say when a turn or
session fails. A deployment fault — an unusable credential, an unpaid gateway
account, or a model the account cannot reach — posts nothing and leaves a
redacted one-line summary in the runtime log. Every other failure posts one
generic sentence plus eve's correlation id, never the upstream provider's text.
Both chat channels route their `turn.failed` and `session.failed` events
through it. The GitHub channel is where the leak showed, because it had no
event overrides at all; `turn.started` stays eve's, since it owns the
repository checkout. The Discord mentions channel already posted fixed prose
and now suppresses deployment faults too, so a dead credential stops
repeating itself there as well.
Closes the noise half of #77.
A revoked model credential fails every dispatch at the first model call, and eve's built-in GitHub failure handlers echoed the provider's own words into the originating thread —
Model provider API error: Authentication Fails, Your api key: ****53a6 is .... The failure is an operator problem, not a reply, and it repeated in full on every mention in every conversation.lib/failure-policy.tsnow decides what a channel may say when a turn or session fails:code,details.name,details.statusCode,details.upstreamType, and the correlation id — never the raw message.Both chat channels route
turn.failedandsession.failedthrough it. The GitHub channel is where the leak showed, because it had no event overrides at all;turn.startedstays eve's own handler, since it owns the repository checkout. The Discord mentions channel already posted fixed prose and now suppresses deployment faults too.node --test lib/*.test.ts(176 tests),tsc --noEmit, andpnpm build:eveall pass.