Follow-up to gather-rule phase scoping. One-shot collection at a phase START
already existed (phase_change dedups per (rule, phase)) and at enrollment END
(on_event + enrollment_complete); the END of a specific phase had no trigger.
New trigger value "phase_exit": fires once when TriggerPhase is LEFT (empty =
every phase transition). Together with phase_change it forms the two one-shot
bookends of a phase.
Agent (GatherRuleExecutor.OnPhaseChanged):
- Exit rules are evaluated BEFORE _currentPhase advances, so both the
TriggerPhase match and the phase-scope gate see the phase being LEFT. A rule
scoped to DeviceSetup therefore fires on its own exit even though the phase
being entered is out of scope.
- A transition into Failed fires the exit rules of the failing phase — the
snapshot at a failure boundary is the point of the trigger.
- Exit of Unknown never fires; a repeated identical phase signal is not a
transition.
- Dedup key "exit:{ruleId}|{phase}" shares _phaseRulesExecuted with the
phase_change keys but stays in a disjoint key space, so an enter-rule and an
exit-rule on the same phase cannot consume each other's slot.
Portal: trigger labels are now "Phase Start" / "Phase End"; the canonical phase
dropdown and the create/save payloads cover both via PHASE_TRIGGERS; the card
renders "entering X" / "leaving X".
No ConfigVersion bump: no new field is transported. Old agents do not know the
value and simply never fire the rule (silent no-op).
Tests: GatherRuleExecutorPhaseExitTests (11) — enter-vs-exit, no refire on
re-entry, empty-triggerPhase, exit-of-Unknown, same-phase-signal, into-Failed,
Complete, scope-against-left-phase, out-of-scope slot preservation, key-space
disjointness, on_change interplay. Build 0 Errors; V2.Core.Tests 1884/1884;
Functions.Tests 3099/3099; vitest 557/557; tsc silent.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.3 KiB
Log
2026-07-20
-
Update: Extended
rules/gather-rule-phase-scoping.mdwith thephase_exittrigger — the closing bookend tophase_change, for one-shot collection when a phase is LEFT (e.g. "state at the end of Account Setup"). Documents the evaluation-before-phase-advance rule (triggerPhase match and scope gate see the phase being left), firing intoFailed, the disjointexit:dedup key space, and why no ConfigVersion bump is needed (no new field — old agents simply never fire the rule). -
Update: Reworked
agent/mdm-reboot-coalescing.mdafter the first real enrollment (session b2e890c1): 2800 records are now aggregated per burst into ONE neutral Info event (rebootUris[]/uriCount/firstRebootUri; watermark persisted at flush so a pre-emit reboot kill loses nothing); the raw event no longer claims a reboot — ANALYZE-ESP-005 is gated on an actually-observedsystem_reboot_detected. Removed the Shell-Coreesp_reboot_coalescingevent entirely: the "RebootCoalescing" token appears in the routineSubcategoryProcessing_Startedbootstrap marker on every enrollment (false positive by construction). Verified 2800 description shape recorded. -
Creation: Added
agent/mdm-reboot-coalescing.md— the agent now attributes the "unexpected mid-ESP reboot + second sign-in" pattern (PMPC research) to the device-assigned policy URIs that forced it: newMdmRebootPolicyTracker(DM-Enterprise EventID 2800, per-URImdm_policy_reboot_requiredevents, cross-restart RecordId watermark), aRebootCoalescingbranch inShellCoreTracker(esp_reboot_coalescing, backfill-emitting by design), and theANALYZE-ESP-005advisory (reassign device → user groups). ConfigVersion 35; event types deliberately distinct fromsystem_reboot_detectedso RebootCount stays uninflated. -
Creation: Added
backend/business-timestamps.md(newbackend/section) — the 2026-07-18 migration reset every row's system Timestamp, exposing that AuditLogs/OpsEvents/Events had (unknowingly) displayed and filtered on it all along; documents theOccurredUtccolumn, the RowKey decoders and RowKey-range date/retention clauses inBusinessTimestamp, the GUID-guard trap, the audit/ops backfill endpoint, and the "system Timestamp is never authoritative" migration rule. -
Creation: Added
rules/gather-rule-phase-scoping.md(newrules/section) — gather rules gainactivePhases(run only during listed phases),activeFromPhase(sticky latch from a phase onwards, never via Failed) andemitMode: "on_change"(canonical-hash result dedup withsuppressedPollsobservability), ConfigVersion 34. Includes the prerequisite backend fix: the custom-rule toggle PUT no longer wipes the stored rule definition (partial-merge inGatherRuleService.UpdateRuleAsync).
2026-07-18
- Creation: Added
agent/endpoint-migration.md— config-channel agent re-home (MigrateToApiBaseUrlonGET agent/config, ConfigVersion 33): backend or per-tenant API-URL moves without DNS indirection (impossible due to mTLS/Flex-TLS). Live-fetch-only with cache strip,AgentEndpointMigrationRulesallowlist validated on both sides, one hop, kill-switch wins. Built as the lesson from the 2026-07-18 WEU→GWC cutover, which hard-cut all in-flight agents.
2026-07-17
- Creation: Added
agent/build-counter-blob.md— agent build numbers now come from a shared public counter blob (buildcounter-v{N}.txt, reserve-before-build with ETag-CAS) so localbuild.ps1and CIbuild-agent.ymlbuilds can never mint the same number. Documents the CI parity fixes (SummaryDialog.exe.config in the ZIP, EXE-vs-manifest version check, hash-oracle update gated on stable cutover) and the Sigstore provenance attestation on CI-built ZIPs.
2026-07-16
- Creation: Added
agent/autopilot-ztd-diagnostics.md— reference for Windows' own ZTD diagnostic surfaces (ModernDeployment Autopilot event IDs incl. 807/809/815/908, theDiagnostics\Autopilotregistry key, deployment-service endpoints, known-issue error-code map with KB fixes). Backs the agent'sZtdEvidencecollector (ztdVerdictonautopilot_profile_missing) and the backend known-issue rules; sources carry a re-check RSS feed.
2026-07-13
-
Removal: Moved
customer-graph-add-on-permissions.mdout of this contributor bundle into the customer documentation repository (reference/optional-graph-permissions.md). It was customer-facing product content and did not belong in the tech-docs bundle; removed the entry fromindex.md. -
Creation: Added
agent/hello-wizard-unskip.md— session 772fe502 fix: theHelloWizardStarteddecision signal (prevention veto + un-skip cure for the policy-disabled Hello shortcut) and the HelloTracker confirmation second read against flip-flopping WHfB CSP values.
2026-07-11
-
Creation: Added the
agent/section — three concept documents on the V2 agent:agent/overview.md(runtime, collectors, telemetry pipeline),agent/decision-engine.md(DecisionCore reducer, signals, A/B/C completion arms, invariants),agent/logs-and-persistence.md(persisted artifacts, signal log vs spool, recovery/replay flow) plusagent/index.md. -
Creation: Converted
docs/into an OKF v0.1 knowledge bundle — added YAML frontmatter toarchitecture.md,mcp-oauth-flow.md, andcustomer-graph-add-on-permissions.md; createdindex.mdand this log.