Oliver Kieselbach ed1c26f98b v2 codex-03: forward-link events to their originating transition + signal
Closes Codex review follow-up #3. Two distinct traceability gaps:

1. DecisionTransition.EmittedEventSequences was always empty. The
   journal record is appended before the effects run, so at
   construction time the Event.Sequence values haven't been assigned
   yet. Populating it later would need a journal-reorder or a sidecar
   mapping file — both more risk than payoff.

2. SessionTraceOrdinal had two independent meanings in the codebase:
   the reducer-step correlation counter (SessionTraceOrdinalProvider)
   shared by a signal and its transition, vs. the transport-cursor on
   TelemetryItem (== TelemetryItemId when session-scoped). The
   backend parser already prefers the inner (payload) value, but the
   shared name was misleading.

Resolution:

- Forward link instead of backward. EnrollmentEvent gets two new
  nullable columns, CausedByTransitionStepIndex and
  CausedBySignalOrdinal, populated in EventTimelineEmitter.Emit from
  currentState.StepIndex and currentState.LastAppliedSignalOrdinal
  (the reducer already has both, zero new plumbing). Nullable so
  legacy events and any future non-reducer emits stay valid.
  Inspector queries "events emitted by step N" = WHERE
  CausedByTransitionStepIndex = N — trivial index scan.

- DecisionTransition.EmittedEventSequences stays on the type for
  journal backward-compat but the XML doc now states explicitly that
  it is always empty and points readers at the new forward link.

- SessionTraceOrdinal XML docs clarified on DecisionSignal,
  DecisionTransition (by extension), and TelemetryItem: reducer-
  correlation counter is authoritative for payload, transport-cursor
  for envelope, backend parser resolves by preferring inner value.
  No code change — the two counters were already independent in
  practice; the name overload was the whole confusion.

- Backend TableStorageService persists both new columns in
  StoreEventAsync + StoreEventsBatchAsync, reads them in
  MapToEnrollmentEvent. Entity setters guarded by HasValue so
  legacy agent uploads don't write null-as-zero.

Tests (+2 in EventTimelineEmitterTests):
  - Emit populates CausedByTransitionStepIndex + CausedBySignalOrdinal
    from a state with StepIndex=7, LastAppliedSignalOrdinal=12.
  - CausedBySignalOrdinal is null when LastAppliedSignalOrdinal=-1
    (fresh initial state sentinel), avoiding a meaningless -1 on the
    wire.

Suites green: DecisionCore 161/161, Agent.V2.Core 645/645 (+2),
Functions 734/734. Build 0 warnings.

Plan: .claude/plans/codex-03-traceability.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 12:00:33 +02:00
2026-04-22 19:36:19 +02:00
2026-03-17 18:24:01 +01:00
2026-03-26 07:02:33 +01:00
2026-04-04 19:17:01 +02:00

Autopilot Monitor

Advanced monitoring and troubleshooting solution for Windows Autopilot deployments. Gain full visibility into every enrollment session with a detailed event timeline, fleet health dashboards, and session reporting. Define custom analysis rules to automatically detect issues and gather rules to collect targeted evidence. Retrieve diagnostics packages on demand, configure agent settings like auto-reboot behavior and automatic timezone adjustment — all managed centrally from the web dashboard.

Private Preview

Autopilot Monitor is currently running as a Private Preview. Visit autopilotmonitor.com to request access and learn more.

Overview

Autopilot Monitor provides real-time tracking, intelligent diagnostics, and automated troubleshooting for Windows Autopilot enrollment processes. It consists of:

  • Bootstrap Script — PowerShell script deployed via Intune that starts monitoring early in the enrollment process
  • Monitoring Agent — Lightweight .NET application that collects telemetry and evidence during enrollment
  • Backend API — Azure Functions-based ingestion and processing pipeline
  • Web Dashboard — Next.js application for real-time monitoring and fleet analytics

Architecture

For detailed information about the system architecture, components, and data flow, see Architecture Documentation.

Documentation

Full documentation is available at autopilotmonitor.com/docs

License

This project uses a split licensing model:

  • MIT License — Agent (src/Agent/) and Shared library (src/Shared/) — unrestricted use on end-user devices
  • AGPL-3.0 — Backend (src/Backend/), Web Dashboard (src/Web/), and MCP Server (src/McpServer/) — server-side components remain open source

See LICENSE for full details.

S
Description
Windows Autopilot & Intune enrollment monitoring: live session timelines, fleet health, diagnostics, and an MCP server for AI-assisted troubleshooting.
Readme AGPL-3.0 60 MiB
Languages
C# 72.7%
TypeScript 25.7%
PowerShell 1%
JavaScript 0.5%