Beacon awake & unattended

Interactive ticket trace

One service-desk ticket, followed stage by stage through the autonomous request lifecycle on the service-desk architecture page — from the moment it lands in ServiceNow to the moment it closes, including the single human decision in the middle.

What this is: a worked example. It takes the request-lifecycle diagram from the architecture page and runs one concrete ticket down it, showing what each actor does, which messages cross the bus, why the risk tier lands where it does, and what gets written to the append-only log at every step. Step through it with the controls below, or just scroll — every stage is on this page. What this isn't: a live system. INC0104729 is a fabricated ticket. This box runs no ServiceNow tenant, no orchestrator, and no directory — the trace is illustrative, not a recording.

The ticket

A platform engineer, Dana Morgan (CORP\dmorgan), changed their own password through the self-service portal at 14:01. A tablet they own still had the old password cached and retried it on a loop; by 14:02 the account was locked out. Dana opens a ticket. Their account is a member of Server Operators, a protected group — which, as we'll see at stage 4, is what pushes an otherwise routine unlock across the approval line.

ServiceNow · INC0104729
INC0104729
New
2026-08-27 14:04:31
Can't log in after I changed my own password — account keeps locking
Dana Morgan, Platform Engineering
Identity & Access
P3 — Moderate

Walk it through

Eight stages. Each one names the actor, shows the artifact it produced, and appends to the log at the bottom of this card. Use Previous / Next, click a stage on the rail, or press the left/right arrow keys.

Stage 1 of 8 · ServiceNow → orchestrator

Intake & classification

The Incident lands in the orchestrator's queue, exactly as it would for a human tier-1 tech. The orchestrator reads the short description and the caller record, classifies the ticket (Incident · identity domain · P3), resolves the affected principal to CORP\dmorgan, and opens a trace_id that every message about this ticket will carry. No system has been touched yet — this stage only reads.

Orchestrator · classification of INC0104729
TypeIncident (not a Request or Change — something that worked has stopped working)
DomainIdentity & AD → routed to the identity agent
PrincipalCORP\dmorgan · Dana Morgan · Platform Engineering
Tracetrc_a17f2c90 opened; all further messages carry it
Stage 2 of 8 · identity agent · Tier 0, read-only

Enrichment

The identity agent gathers state. Reading directory attributes and event logs is read-only, so it runs unattended at Tier 0 with nothing to approve. It pulls the account, the lockout policy, and the last few authentication events, and correlates them.

agent.identity — read result
account:          CORP\dmorgan
lockoutTime:      2026-08-27T14:02:07Z   (locked)
badPwdCount:      7
lockoutThreshold: 5 in 15 min           (policy)
lockoutDuration:  30 min                (policy)
pwdLastSet:       2026-08-27T14:01:12Z   (self-service change, ~1 min before lockout)
lastGoodAuth:     14:01:20  device LT-4471  (registered to dmorgan)
badPwdSource:     14:01:33-14:02:07  device TB-2290  (registered to dmorgan)
groupMembership:  Server Operators, Platform-Eng, All-Staff
mfaState:         enrolled, healthy

The pattern reads as a cached credential, not an attack: the bad passwords all came from one device the user owns, seconds after a successful password change, with no geo-anomaly and MFA intact.

Stage 3 of 8 · identity agent → orchestrator

Draft a plan

The identity agent turns that state into a concrete plan with a paired rollback and hands it back to the orchestrator as a proposal message on the bus. Domain agents propose; they never decide. The envelope fields (trace_id, causation_id, sig, and the rest) are defined on the agent-to-agent protocol page; the type-specific body is below.

proposal — payload
"type": "proposal",
"ticket_id": "INC0104729",
"from": "agent.identity",
"to": "orchestrator",
"payload": {
  "plan_id": "PLAN-3",
  "steps": [
    "unlock CORP\\dmorgan on the nearest writable domain controller",
    "set 'user must change password at next logon'",
    "verify: account unlocked AND test bind succeeds AND badPwdCount == 0"
  ],
  "rollback": "re-lock the account, page identity on-call, attach this trace",
  "blast_radius": { "principals": 1, "systems": 1 },
  "reversible": true,
  "notes": "principal is in a protected group (Server Operators)"
}
Stage 4 of 8 · orchestrator

Risk-tier decision

The orchestrator scores the plan. Blast radius is tiny and the rollback is clean, which by itself would land at Tier 1 (auto-execute, logged). But the plan mutates a directory object, and the principal sits in a protected group — and policy sets a floor of Tier 2 for any mutating action on a protected-group member, regardless of blast radius. So it lands at Tier 2: one human approval, and a mandatory dry-run.

FactorValuePull
Blast radius1 principal, 1 system↓ toward auto
Reversibleyes — re-lock↓ toward auto
Read-onlyno — writes lockoutTime, pwdLastSet↑ needs review
Protected-group memberyes — Server Operators↑ policy floor Tier 2
ResultTier 2 — one approval + dry-run

Tier 0 Tier 1 Tier 2 ← this plan Tier 3

Stage 5 of 8 · orchestrator → human gate

Human approval / arbitration

The plan, the generated dry-run diff, and the enrichment context go to the gate as a single approval.request. A human approves, rejects, or edits the plan. Here the identity on-call analyst checks that the device on the last good sign-in belongs to the user, sees that the change is limited to two attributes, and approves.

Approval gate · INC0104729 · PLAN-3
lockoutTime: 2026-08-27T14:02:07Z lockoutTime: 0 (cleared) pwdLastSet: 0 (must change at next logon)
No other attributes modified. No group membership change. No session revocation.
14:06approval.grant · oncall.analyst.rivera · “device LT-4471 matches last good auth; scope is two attributes; approved”
Approve Reject Edit plan

If a second plan existed for this same incident — say a competing proposal to disable the account pending investigation — this stage would become arbitration: both plans go to the gate side by side as a Tier 3 request and the human picks one. Same gate, different question.

Stage 6 of 8 · orchestrator → identity agent

Execute

The orchestrator releases the approved plan to the identity agent as an execute message. The agent applies exactly the approved steps — no more — against the nearest writable domain controller, and returns a result.

result — payload
"type": "result",
"ticket_id": "INC0104729",
"causation_id": "<the execute message>",
"from": "agent.identity",
"payload": {
  "plan_id": "PLAN-3",
  "target": "CORP-DC-03",
  "applied": ["unlock", "force-change-at-next-logon"],
  "status": "ok",
  "at": "2026-08-27T14:07:41Z"
}
Stage 7 of 8 · identity agent

Verify target state

Applying the change is not the finish line — the plan's own verify step runs before the ticket can close. The identity agent re-reads the account and performs a test bind. All three checks pass.

  • account not locked — lockoutTime = 0
  • test bind for dmorgan from the registered device certificate — succeeds
  • badPwdCount = 0 — the retry loop has stopped

If any check failed, the orchestrator would run rollback R-3 (re-lock, page identity on-call) and loop back to the approval gate with the failure attached — the dashed path on the request-lifecycle diagram on the service-desk architecture page. A failed mutation is never retried without a human.

Stage 8 of 8 · orchestrator → ServiceNow

Close the ticket

The orchestrator writes the outcome back to ServiceNow and closes the Incident. The whole chain — plan, dry-run, approval, action, verification — is attached to the ticket and already in the append-only log. Elapsed wall-clock time from intake to close: 4 minutes 38 seconds, one human decision.

ServiceNow · INC0104729 · Resolved
Resolved
Solved (Automated with approval)
00:04:38
Account CORP\dmorgan unlocked per PLAN-3; approved by oncall.analyst.rivera. User must set a new password at next logon; advise clearing the saved credential on device TB-2290. Verified: account unlocked, test bind OK, badPwdCount 0.
Stage 1 of 8

The append-only log, as of the current stage:

  1. #000114:04:33 · intake · INC0104729 received; classified Incident / identity / P3; trace trc_a17f2c90 opened
  2. #000214:04:41 · enrich · agent.identity read AD for CORP\dmorgan (Tier 0): locked 14:02:07, badPwdCount 7, last good auth 14:01:20 from LT-4471, bad-pwd source TB-2290, member of Server Operators
  3. #000314:04:55 · plan · orchestrator accepted proposal PLAN-3 (unlock + change-at-next-logon + verify); rollback R-3 recorded
  4. #000414:04:56 · tier · PLAN-3 scored Tier 2 (mutating action on a protected-group member; policy floor); routed to approval; dry-run diff generated
  5. #000514:05:02 · gate · approval.request sent to identity on-call with plan, dry-run diff, and enrichment context
  6. #000614:06:12 · gate · approval.grant by oncall.analyst.rivera — “device LT-4471 matches last good auth; scope is two attributes”
  7. #000714:07:41 · execute · agent.identity applied PLAN-3 to CORP-DC-03: unlock + force-change set; result ok
  8. #000814:07:55 · verify · account unlocked, test bind succeeded, badPwdCount 0 — all checks pass
  9. #000914:09:11 · close · INC0104729 resolved (Automated with approval); full chain attached; elapsed 4m38s

How this maps to the other pages