Manav.id
Developer · 4 min read

When the approval record is a row in the approver's own database

When the approval record is a row in the approver's own database

An auditor asks for evidence that a change was approved. The evidence is a state field in a ticketing table. Whoever can write to that table can produce the evidence, and the list of who can is longer than anyone expects.

Who can write an approval into your ITSM platform?

More parties than anyone assumes. In ServiceNow and comparable platforms an approval is a row, and rows can be set by a human clicking approve, a platform administrator, an integration service account, a business rule, a REST call, an import set or a delegation rule. Every path produces an identical record.

Key takeaways
  • An approval stored as application state is an assertion by the application, not evidence about a person.
  • The write paths into that state — platform admins, integration accounts, workflow automation, direct API — are numerous and usually uninventoried.
  • Attaching a signature over the rendered change to the ticket makes the record verifiable independently of the platform holding it.

Who can write an approval

Human clicks ApproveinventoriedPlatform admin writes the fieldrarelyIntegration service accountsometimesBusiness rule or workflowrarely — and they accumulateREST call, import set, delegation rulealmost never
Ask an administrator to enumerate these. The list is consistently longer than the organisation assumes.

Ask an ITSM administrator to enumerate everything that can set an approval state to approved. The list is consistently longer than the organisation assumes.

Write pathTypically inventoried?
A human clicking Approve in the interfaceYes
Platform administrators with table-level write accessRarely
Integration service accounts (CI/CD, monitoring, chatops)Sometimes
Workflow automation and business rulesRarely — and they accumulate
Direct REST API calls with a valid tokenRarely
Import sets and bulk data loadsAlmost never
Delegation and out-of-office auto-approval rulesAlmost never

Every row produces a record indistinguishable from the first. The audit log will show which account made the write, and the account is not the same thing as the person.

Three realistic failure modes

  1. Direct state change. Someone with table write access sets the approval, or alters the approver field after the fact. The change proceeds with a clean record.
  2. Integration abuse. A service account exists to update tickets from a pipeline. Its token is broadly scoped because narrowing it was fiddly, and it can approve as easily as comment.
  3. Payload drift. The ticket described change A. The change that executed was A plus something added afterwards. The approval record is accurate about the ticket and wrong about the change.

The third is the most common and the least discussed, because nothing is compromised. The process simply does not bind the approval to the artefact.

What the signature has to cover

Not the ticket. The change.

# Weak — signs a reference. The referent can move.
sign({ "ticket": "CHG0048219", "decision": "approved" })

# Strong — signs the change itself.
sign({
  "ticket":      "CHG0048219",
  "repository":  "platform/payments",
  "commit":      "a3f91c8e2b7d4056891fa2c73e1b9d40",
  "environment": "production",
  "migrations":  ["2026_04_06_add_index", "2026_04_06_backfill"],
  "window":      "2026-04-08T02:00Z/04:00Z",
  "approver":    "[email protected]"
})
# digest recomputed and compared at deploy time

With the commit in the signed statement, a change that drifts after approval produces a digest mismatch at the gate. The deploy stops rather than proceeding under an approval that covered something else.

Keeping the platform, changing the evidence

None of this argues for replacing the ITSM platform. Workflow, routing, CAB scheduling and reporting are what it is for, and it does them well.

The change is narrow: the approval step captures a signature over the rendered change, the receipt is stored on the ticket, and the deployment gate verifies the receipt rather than reading the state field.

ElementStays in the platformMoves to the receipt
Routing and assignmentYes
CAB scheduling and calendarsYes
Reporting and metricsYes
The fact of approvalDisplayedAttested
What was approvedDescribedBound
Who approved itRecorded as an accountSigned by a person

What an auditor gets

A file. It contains the canonical change, the signature, the approver's credential identifier and the verification state of their authenticator. It checks against a published key with no call to the ITSM platform.

This matters because it changes the audit question from "do we trust this platform's integrity controls" to "does this signature verify". The first is an assessment; the second is arithmetic.

Which changes warrant it

Not all of them. A standard pre-approved change to rotate a log level does not need a signature, and requiring one would produce reflexive approval — the exact behaviour that makes approvals worthless.

The last bullet deserves emphasis. Emergency change paths exist precisely to bypass controls under time pressure, which makes them the path an insider uses and the one auditors examine hardest.

Three failure modes, and the quiet one

How approval records fail
ModeWhat it looks like afterwards
Direct state changeA clean record, set by someone with table write access
Integration abuseA broadly scoped service token that can approve as easily as comment
Payload driftAn accurate record of a ticket, and a change that differs from it

The third is the most common and least discussed, because nothing is compromised. The ticket described change A; the change that executed was A plus something added afterwards. The approval is accurate about the ticket and wrong about the change.

Objections and honest limits

“We can lock down write access to the approval table.” Partly. Administrators, integrations and automation all need write access for legitimate reasons, and the list grows. Locking it down helps and produces no evidence.

“This means replacing our ITSM platform.” It does not. Routing, CAB scheduling, calendars and reporting stay exactly where they are. Only the approval artefact changes — a signature over the rendered change, stored on the ticket.

Making the approval artefact testable

  1. Enumerate every write path to the approval state. Including import sets and delegation rules. Write the list down.
  2. Sign the change, not the ticket reference. Repository, commit, environment, migrations, window — not just the ticket number.
  3. Store the receipt on the ticket. So workflow and evidence stay together.
  4. Verify at the deployment gate. Recompute the digest and refuse on mismatch, rather than reading the state field.
  5. Scope it to changes that matter. Production deployments in audit scope, access changes, network boundary changes, retention configuration and emergency changes.

Terms used here

Approval state
A field on a change record. Whoever can write the field can produce the approval, and the audit log shows an account rather than a person.
Payload drift
The gap between the change described in the ticket and the change that executed.
Emergency change
The path that exists to bypass controls under time pressure — therefore the path an insider uses and the one auditors examine hardest.

Frequently asked questions

Can't we lock down write access to the approval table? Partly. Platform administrators, integrations and automation all need write access for legitimate reasons, and the list grows over time. Locking it down helps and does not produce evidence.

Does this replace the ITSM platform? No. Routing, scheduling and reporting stay. Only the approval artefact changes — a signature over the rendered change, stored on the ticket.

What is payload drift? The approval covered the change described in the ticket; the change that executed differed. Nothing is compromised — the approval simply was not bound to the artefact.

Should every change require a signature? No. Reserve it for production deployments in audit scope, access changes, network boundary changes, retention configuration and emergency changes.

Which changes warrant a signature? Production deployments in audit scope, access changes, network boundary changes, retention configuration and emergency changes.

Where this fits in Manav

Manav's receipt sits on the ticket as an attachment and verifies against a published key. The deployment gate checks the signature and recomputes the commit digest, so a change that drifted after approval stops instead of shipping.

See change-control receipts →

Sources and further reading