Your AI Agent Has a Rejection Log. Here's Why It Matters.

Dev.to / 3/21/2026

💬 OpinionDeveloper Stack & InfrastructureIdeas & Deep AnalysisTools & Practical Usage

Key Points

  • AI agents hide certain decisions after interactions, which can lead to opacity and drift, even without malice.
  • The article proposes Covenant.md with three sections (IDENTITY, BOUNDARIES, ACCOUNTABILITY) to codify what the agent can see and how it should behave, including distinguishing observed vs inferred information.
  • It introduces the concept of a rejection log that records withheld observations and the rule driving the decision, enabling audits to catch systemic issues.
  • By surfacing the rejection log and applying an audit workflow, organizations can improve transparency for end users, auditors, and security teams, complementing existing guardrails and prompts.

Every AI agent you use is hiding things from you.

Not maliciously. It's just how they work. Your support agent noticed a billing error but didn't mention it because it wasn't related to the ticket. Your code review bot skipped three auto-generated files and never told you which ones.

Agent drift isn't a bug. It's what happens when a system makes decisions and nobody writes them down.

The gap

We've got guardrails for input/output filtering. We've got AGENTS.md for agent configuration. We've got system prompts for behavior. But system prompts are invisible to the user — there's zero transparency about what the agent chose not to say.

COVENANT.md

It's a single markdown file in your repo. Three required sections:

IDENTITY — Who is this agent? What can it see? What can't it see? And here's the important part: "The repo hasn't been modified since January 8" is an observation. "You haven't focused on this since January 8" is a judgment wearing observation's clothing. Agents need to know the difference.

BOUNDARIES — Hard stops, escalation triggers, and two policies almost no agent has: a repetition policy and a silence policy. The repetition default: if you mentioned it yesterday and nothing changed, don't mention it again. For silence: when a user stops engaging, hold multiple interpretations. Don't just pick one.

ACCOUNTABILITY — Every observation tagged as observed (from data) or inferred (speculation). And the thing I think matters most: the rejection log.

The rejection log

After every interaction, the agent logs what it observed but chose not to surface — and cites the rule that drove the decision.

Say a support agent handles a password reset. It notices a $47 billing error:

## Withheld
- Billing discrepancy: customer charged $47 for downgraded plan
  REASON: Not related to stated issue.
  CONFIDENCE: HIGH that this is a billing error.

## Open Questions
- Is there a policy for proactively surfacing billing errors?

Without the log, nobody knows. With it, a weekly audit catches a systemic downgrade bug.

How it fits

AGENTS.md COVENANT.md Guardrails
Governs Capabilities Conduct Content
Audience Developers End users & auditors Security teams
Analogy Job description Oath of office Metal detector

Try it

github.com/covenantmd/covenant — it's under 200 lines, MIT licensed, four example covenants, and there's a copy-paste template in the README.

Every agent you deploy is already deciding what to surface and what to suppress. Right now those decisions are invisible. That's not a feature — it's just negligence with a friendly interface.

Start with the rejection log. The rest follows.