Peios Learn
Products
PePeios pkpekit PvProvium UDUniversal Directory TrTrail Ckclackatoo PrProject WiWispist
Using Peios Security Basics Technical Documentation Source
Using Peios Security Basics Technical Documentation Source
Peios

Peios Events Index

Every event Peios emits, in one place — the KMES envelope, the field groups events share, a page per event type generated from the evman catalogue, a field index, and the registry's watch records, which are not events.

Single-page view · as markdown

1.1 What an Event Is

Peios / Using Peios / Events / Introduction

An event is a record that something happened: an access was checked, a service started, a package was installed, a descriptor was found corrupt. Events are produced by the component that observed the thing, and consumed by whatever is watching — usually eventd, sometimes a tool reading the stream directly.

This book enumerates every event Peios emits, with the fields each one carries. It is a lookup, not an explanation. Where an event's meaning needs the mechanism behind it, the page links to the manual that describes that mechanism.

1.1.1 Where the schemas come from #

Every event type and every field is defined in the evman catalogue: the .evman fragments each component installs in /usr/share/evman/ (PGSS §6.10). The catalogue is the definition, and most of this book is generated from it:

  • §2 describes the groups, the sets of fields that travel together, such as subject.
  • §3 to §15 have a page per event type, one chapter per root: the kernel's kacs, stratafs, lcs, kmes and ntfe (§3 to §7), then peinit, peipkg, eventd, authd, lpsd, timed, netd and trustd (§8 to §15).
  • Appendix A lists every event type in one table, and Appendix B is the field index: every field, its type and values, and every event that carries it.

On a running system, evman <event-type> prints the same definition from the installed fragments (evman).

1.1.2 Two transports, not one #

Most events travel through KMES, the kernel message event stream: a per-CPU ring buffer that the kernel writes into and userspace reads from. Every KMES event is a binary header followed by a MessagePack payload (§1.2).

Two things in this book never travel through KMES:

  • eventd's records about itself (§10) are catalogue events, but eventd writes them straight into its event store and they never touch KMES. They carry no sequence number and no emitter.* stamps.
  • LCS watch records (§16) are not events at all, and are included because an operator looking for "what does Peios tell me" would otherwise miss them. They are binary records read from a key file descriptor: a notification mechanism, not an audit trail, with a format that has nothing in common with a KMES event.

1.1.3 What is not here #

This book does not cover logs or metrics. Both reach eventd by a different path, are stored in different tables, and are not events. The eventd manual covers them.

Nor does it cover the query language for reading events back. That is PSPU §3, with the operator-facing view in the eventd manual.

1.1.4 Checking generated catalogue pages #

The event, group and field-index pages are generated from .evman fragments by PKM's tools/gen-events-book.py. Edit the fragments rather than those pages. --check compares the generated pages without writing; omit it to regenerate. The PKM pre-push hook checks this output when kernel event fragments or the generator change.

The generator reads kernel fragments from its own checkout and userspace fragments from sibling component directories such as peinit/ and eventd/. Keep the component fragments present when regenerating the complete index: an absent userspace fragment is reported and omitted from the output. For the same reason --check skips, naming the missing fragments, unless every userspace fragment is present.

Documentation defaults to a sibling learn/. For a separate worktree:

PKM_LEARN_ROOT=/path/to/docs-worktree python3 tools/gen-events-book.py --check

An invalid explicit path fails. Missing or stale generated pages in the selected documentation checkout fail --check, including a missing events book. A standalone PKM checkout without a documentation companion skips the check. The same path override applies to the pre-push check.

1.2 The Envelope

Peios / Using Peios / Events / Introduction

Every KMES event is a packed binary header followed immediately by its MessagePack payload, delivered as one contiguous byte sequence with no padding anywhere.

The emitter supplies only two things: the event type and the payload. Everything else in the header is stamped by KMES itself, which is what makes the identity fields trustworthy — an emitter cannot forge them.

1.2.1 Fields KMES stamps #

A consumer that exposes header values by name exposes them under these field paths (PGSS §6.4). They are fields like any other, defined in the catalogue and listed in the field index under event and emitter, but they live in the header, and no payload repeats them.

FieldHeader fieldMeaning
event.typetypeThe event type, as the emitter named it.
event.timetimestampWall clock at the moment KMES accepted the event, nanoseconds since the Unix epoch.
event.sequencesequenceThe emitting CPU's per-boot counter. The first event on each CPU gets 1, and the numbers on one ring are contiguous.
event.cpucpu_idThe CPU whose ring buffer holds the event.
event.boot.guid—The boot the record belongs to. Not in the header: the consumer supplies the boot it read the record in.
emitter.classorigin_classThe emission path that wrote the record: 0 userspace, 1 kmes, 2 kacs, 3 lcs, 4 ntfe.
emitter.token.guideffective_token_guidThe effective token of the task that caused the event.
emitter.true-token.guidtrue_token_guidThat task's own token, before any impersonation.
emitter.process.guidprocess_guidThe process the record was written from.

emitter.class is set by the kernel, never by the emitter. A record whose type names a kernel root but whose class is 0 was written by a program, whatever its type says. The class is the path, not the type's root: StrataFS records are written through KACS and carry class 2.

The identity stamps matter for reading this book: several events carry no caller in their payload at all, because the envelope already names one. StrataFS copy-up records are the clearest case — nothing in the payload names a token, and the caller is recovered from the header. A record written outside task context has zero GUIDs, and emitter.stamp-failure in its payload says why.

event_size, header_size and type_len are structural, computed by KMES during construction, and are not exposed as fields.

1.2.2 Layout #

All fields before the event type string sit at fixed offsets. The type string begins at offset 77, with its u16 length at offset 75, so the header is exactly 77 + type_len bytes. The payload runs from header_size to event_size, and the next event begins at event_size from the start of the current one.

All multi-byte header integers are little-endian. The identity GUIDs are opaque 16-byte values.

The full field-by-field layout is normative in PSPK §2, the KMES event stream specification. This summary is enough to walk a stream; it is not enough to implement one.

1.2.3 Ordering #

event.time is captured before event.sequence is assigned, so two events with the same time on the same CPU are ordered by sequence. event.cpu and event.sequence together identify a record within a boot, and with event.boot.guid across boots.

Across CPUs there is no global order. Two events on different CPUs with close timestamps may have been observed in either order.

1.3 Encoding Conventions

Peios / Using Peios / Events / Introduction

Every KMES payload in this book is a MessagePack map with UTF-8 string keys. What may appear in it, and what each value means, is defined by the evman catalogue; the rules below are how the catalogue's definitions become bytes (PGSS §6.4 and §6.5).

1.3.1 The catalogue is the definition #

Every event type and every field is defined once, in a .evman fragment installed in /usr/share/evman/ (PGSS §6.10). An emitter writes no field the catalogue does not define, and this book's event pages and field index are generated from the same fragments.

To read a definition on a running system, use evman: evman kacs.audit.access.checked prints an event type, evman subject.token.sid a field, and evman kacs.audit everything beneath a prefix.

1.3.2 Names #

An event type reads as who wrote it, what it is about, and what happened: <root>.<noun>[.<noun>…].<verb>, all lowercase kebab-case, ending in a past-tense verb. kacs.audit.access.checked and stratafs.file.copied-up are event types (PGSS §6.3).

A field is named for the part it plays, then what it is, then which property of it the value is: subject.token.sid, object.file.path, outcome.success (PGSS §6.4).

1.3.3 A path is nested maps #

A field's path is the chain of keys that leads to its value. Each segment is one map:

subject.token.sid   is   { "subject": { "token": { "sid": <bin> } } }

No key contains a .. A key "subject.token.sid" at the top level of a payload is a different field from subject.token.sid, and not one any consumer looks for.

A path is either a value or a map, never both. access.granted is a value, so nothing is ever defined beneath it, and its variants are its siblings: access.granted-staged, not access.granted.staged.

1.3.4 Absent, not nil #

A field with no value is omitted: the key is not written. An emitter never writes nil, an empty string or zero to mean "none". A field whose event page says when outcome.success == false is simply not in a record that succeeded.

1.3.5 Value representations #

A field's type, given on its event page and in the field index, names its wire form.

TypeWire form
bin.sidbin holding the binary SID.
bin.guidbin, exactly 16 bytes.
bin.acebin holding the binary ACE, copied from the descriptor.
binbin: a digest or other opaque bytes. Shown as hexadecimal.
uint.luiduint.
uint.timeuint, nanoseconds since the Unix epoch.
uint.durationuint, nanoseconds.
uint.bytesuint, a size in bytes.
uint.maskuint, an access mask, decoded against the table for the record's object.kind.
uint.flagsuint, a set of bits the field's definition names.
uint.integrityuint, the integrity RID.
uint.enumuint, where the numbers are fixed by another specification. Rendered by name.
int.errnoint, a negative error number.
boolbool.
str.enumstr, a kebab-case name.
str.pathstr, a path.
str.ipstr, an address in the textual form for its family.
strstr, UTF-8 text.
uint, intuint or int.

A type ending [] is an array of that type. Arrays that describe the same items are parallel: subject.token.group-attributes[i] describes subject.token.groups[i].

Binary SIDs, GUIDs and ACEs are carried as bytes rather than as text because they are compared as bytes. A principal is carried as its SID only, never with its name beside it: a name is resolved when the record is read.

1.3.6 Enumerations are kebab-case words #

An enumeration is a string naming the value — wrong-type, not 2. Each one's values are listed in its definition, or by the event that carries it, together with whether the set is closed. A value of an open enumeration that a consumer does not recognise is a value, not an error.

A uint.enum is used only where the numbers are fixed elsewhere — an impersonation level, an address family, emitter.class — and a consumer shows it by name.

1.3.7 Errors are negative errno #

outcome.errno is the negative error number the operation returned: -13 for EACCES. It is omitted on success. Why an action failed, as a word, is outcome.reason; whether it succeeded at all is outcome.success (PGSS §6.6).

1.4 Reading an Event

Peios / Using Peios / Events / Introduction

Four rules govern every consumer of this stream.

1.4.1 Ignore unknown keys #

Future versions may add fields to an event without changing the existing ones. A consumer that processes the keys it knows and ignores the rest keeps working across upgrades. A consumer that rejects unrecognised keys breaks on the first addition.

1.4.2 Read absence by the field's presence #

A key that is absent means the emitter had no value for it (§1.3) — nothing more. Each event page says when each field is present: required, optional, or when a condition on another field holds. Read absence against that, not as a signal of its own. A field that is optional today may become always present later.

1.4.3 Delivery is best-effort #

KMES is a ring buffer. The kernel writes; keeping up is the subscriber's problem.

  • A subscriber that falls behind loses events. eventd notices and records an eventd.events.lost, which is how a gap becomes visible rather than silent.
  • There is no replay. An event missed is gone. Nothing can ask for it back.
  • Buffers are per-subscriber. One slow reader does not affect another.
  • Order is per-subscriber, not global.

For durable audit, read events from eventd's stores rather than from KMES directly. eventd drains its subscription continuously and persists what it reads; from that point the store is the record, not the ring.

1.4.4 Events are not authenticated #

Events are trusted because they came through KMES, not because they are signed. Nothing in an event carries a signature. What the kernel vouches for is the header: emitter.class says which path wrote a record, and a program can write any event type it likes with class 0 (§1.2).

Cryptographic non-repudiation is a userspace concern applied after events leave the kernel. If a deployment needs it, it is added on the far side of eventd, not here.

1.4.5 Versioning #

Event types are not versioned by a field. Some changes to the catalogue are additive and can arrive in any update: a new event type, a new field, a new value of an open enumeration. A consumer that ignores what it does not know, and treats an unknown value of an open enumeration as a value, keeps working across them.

Renaming an event type or a field, moving a field to another path, changing a field's type, or adding a value to a closed enumeration is not additive. Each needs a new version of the event vocabulary, because every query and descriptor written against the old shape stops matching (PGSS §6.11).

2.1 caller group

Peios / Using Peios / Events / Groups

  • Group: caller
  • Defined in: lcs.evman

The identity LCS records on an audited operation. A deliberate subset of subject — the token's durable GUIDs ride in the event header, and the group SIDs and PIP state that KACS records are absent here.

That absence is a gap rather than a design. Access to a registry key is granted through a group as often as to a user SID directly, so an LCS record cannot answer "which membership let this through" where the equivalent KACS record can. The two subsystems reached the bound on what to serialise independently and landed in different places.

2.1.1 Fields #

FieldTypeMeaning
subject.token.sidbin.sidThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityThe integrity RID of the effective token.
subject.token.iduint.luidThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumThe impersonation level of the effective token.

2.1.2 Carried by #

  • lcs.audit.backup.ended
  • lcs.audit.backup.started
  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.opened
  • lcs.audit.key.tombstoned
  • lcs.audit.restore.ended
  • lcs.audit.restore.started
  • lcs.audit.transaction.committed
  • lcs.audit.value.deleted
  • lcs.audit.value.set

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

2.2 subject group

Peios / Using Peios / Events / Groups

  • Group: subject
  • Defined in: kernel.evman

The security context an operation ran under, carried by every KACS event that has a causing principal. Three components: the effective token, the process it ran in, and the PIP state in force.

The process is the emitter's, under emitter.process, because a kernel access check runs in the caller's own context: the process that acted is the process that wrote the record.

The token and the process are different principals when impersonating. The token is the client's and the process is the server's, so reading the pair as one identity will attribute a client's work to a server or the reverse. subject.token.type is what tells you they have diverged.

The durable GUIDs are not repeated here. emitter.token.guid, emitter.true-token.guid and emitter.process.guid ride in the event header, so they are present on every event whether or not this group is.

Privileges, claims, the restricted-SID list, confinement state and the default DACL are all deliberately absent. Each is unbounded and an event embedding them could grow without limit. Code needing full token state queries the token directly while it still exists; this group is for correlation, not reconstruction.

2.2.1 Fields #

FieldTypeMeaning
subject.token.sidbin.sidThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]The group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]Per-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityThe integrity RID of the effective token.
subject.token.iduint.luidThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumThe impersonation level of the effective token.
subject.token.uiduintThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintThe process ID the record was written from.
emitter.process.namestrThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintThe PIP trust level in force for the access check.

2.2.2 Carried by #

  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • kacs.audit.privilege.used
  • kacs.caap.policy.changed
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • kacs.descriptor.rejected
  • kacs.impersonation.reverted
  • kacs.impersonation.started
  • kacs.mount.policy.changed

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.1 kacs.audit.access.checked

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.audit.access.checked
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: a matching SACL audit ACE, or the token's audit policy; on the AccessCheck syscall a SACL record also needs the caller to hold SeAuditPrivilege, enabled
  • Cardinality: once per matching audit ACE, not once per access

The record that an access check completed, and what it decided. The most common event on the system, and the one most investigations start from.

A daemon's own checks need SeAuditPrivilege. A userspace component that guards its objects with the AccessCheck syscall supplies the descriptor itself, SACL included. Its records are written only if the calling process holds SeAuditPrivilege, enabled, on its effective token, as Windows asks of AccessCheckAndAuditAlarm; without it the check is answered and its SACL records are silently withheld. The privilege is the caller's, not the checked client's. Records the checked token's own audit policy forces are written either way.

It fires against every kind of object KACS protects — files, processes, tokens, sockets and SysV IPC objects — which is why object.kind is required. A process opening another process, or a token adjusting another token, puts an actor and an object of the same kind in one record, so the subject. and object. fields are never interchangeable.

It is silent by default. Nothing is recorded unless an audit ACE in the object's SACL matches, or the calling token's audit policy forces it. An object with no SACL produces no record on any outcome, including denials.

One access can produce several records. The event is per matching audit ACE, so an access matching three ACEs produces three records differing only in trigger.ace.

3.1.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
object.kindstr.enumrequiredWhat sort of thing the operation acted on.
object.file.pathstr.pathwhen object.kind == fileThe absolute path of the file the operation acted on, resolved at the enforcement point.
object.process.piduintwhen object.kind == processThe process ID of the process the operation acted on.
object.process.guidbin.guidwhen object.kind == processThe durable GUID of the process the operation acted on.
object.token.iduint.luidwhen object.kind == tokenThe LUID of the token the operation acted on, for token-open and token-adjust checks.
object.token.guidbin.guidwhen object.kind == tokenThe durable GUID of the token the operation acted on.
access.requesteduint.maskrequiredThe access mask the caller asked for, after generic bits have been mapped to type-specific ones.
access.granteduint.maskrequiredThe mask this check granted.
access.denied-integrityuint.maskoptionalThe requested bits the object's mandatory label withheld — every bit it withheld, for MAXIMUM_ALLOWED. Absent when it withheld none. With access.denied-trust, often the whole explanation of a denial the DACL alone would have allowed.
access.denied-trustuint.maskoptionalThe requested bits the object's process-trust label withheld, read the same way.
outcome.successboolrequiredTrue when every requested bit is in access.granted. A MAXIMUM_ALLOWED request always reports true, because such a request returns whatever is available and cannot fail — so a success rate computed over these records is skewed by them.
trigger.kindstr.enumrequiredWhy an audit record exists at all.
trigger.acebin.acewhen trigger.kind == saclThe exact ACE that caused this record, so a consumer can identify which rule fired.
fields.attestation.userspacebooloptionalSet on every record of the AccessCheck syscall, and on no other. There the descriptor, and with it trigger.ace, is always the caller's, as are any audit context and PIP state it passes.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.2 kacs.audit.descriptor.changed

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.audit.descriptor.changed
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: a change that includes the SACL, always; any other change when the rights it needed overlap the alarm mask on the handle it was made through
  • Cardinality: once per authorised change

The record that a caller changed, or was authorised to change and failed to change, the security descriptor of a file, a token, a process or a System V IPC object. Registry keys have their own record of the same shape, lcs.audit.key.descriptor.changed.

A change to a SACL is always recorded, whatever the old or new descriptor says. Changing a SACL needs ACCESS_SYSTEM_SECURITY, which needs SeSecurityPrivilege; it is rare; and removing one is how an intruder stops being watched. Before this record existed a file's SACL could be removed in silence, because the only audit of a descriptor change was evaluated against the new SACL, which then had nothing in it.

Any other change — the owner, the group, the DACL, the integrity label — is recorded when the rights it needed overlap the alarm mask on the handle it was made through: the rule kacs.audit.handle.used follows. Only a file handle carries such a mask, so for a token, a process or an IPC object only a SACL change is recorded.

The descriptors themselves are not carried, only their SHA-256 digests, lengths and owners. Equal digests mean the change rewrote the descriptor without altering it.

3.2.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
object.kindstr.enumrequiredfile, token, process or ipc.
object.file.pathstr.pathoptionalOn a file, its absolute path, when the handle's path could be resolved.
object.token.iduint.luidwhen object.kind == tokenThe LUID of the token the operation acted on, for token-open and token-adjust checks.
object.token.guidbin.guidwhen object.kind == tokenThe durable GUID of the token the operation acted on.
object.process.guidbin.guidwhen object.kind == processThe durable GUID of the process the operation acted on.
object.ipc.typestr.enumwhen object.kind == ipcWhich kind of System V IPC object the operation acted on: a semaphore set, a shared-memory segment or a message queue.
object.ipc.idintwhen object.kind == ipcThe System V IPC identifier of the object, as semget, shmget or msgget returned it.
object.sd.componentsuint.flagsrequiredThe parts the caller set. A SACL bit means the record was not discretionary: such a change is always recorded.
object.sd.lengthuint.byteswhen outcome.success == trueThe byte length of the object's security descriptor.
object.sd.digestbinwhen outcome.success == trueSHA-256 of the descriptor as written.
object.sd.ownerbin.sidoptionalThe owner of the descriptor written, when it has one.
object.sd.length-previousuint.bytesoptionalThe byte length of the descriptor a change replaced.
object.sd.digest-previousbinoptionalSHA-256 of the descriptor replaced. Absent, with its length and owner, where the object had no stored descriptor to replace.
object.sd.owner-previousbin.sidoptionalThe owner SID a change replaced.
access.requesteduint.maskrequiredThe rights the change needed: WRITE_OWNER, WRITE_DAC, ACCESS_SYSTEM_SECURITY, as the parts set ask.
access.granteduint.maskoptionalWhat the handle the change was made through was opened with. Absent on a change made without one.
access.audit-maskuint.maskoptionalThe alarm mask on that handle.
access.matcheduint.maskoptionalThe part of access.requested the alarm mask matched, on a change made through a handle: zero when only the SACL made the record exist.
outcome.successboolrequiredWhether the new descriptor was written. A refused change — one the caller had no right to make — is not this record; it is the access check's.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.3 kacs.audit.handle.used

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.audit.handle.used
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: the operation's required access overlaps the alarm mask cached on the handle
  • Cardinality: once per operation on the handle

The record of what was done with a handle after it was opened. Where kacs.audit.access.checked records the decision to open something, this records each subsequent use of it.

The mask is configured by SYSTEM_ALARM* ACEs at the access check that opened the handle, and the record is produced afterwards by whatever enforcement point handles the operation. FACS, for file handles, is the only such point today.

The subject is re-read on every operation. A handle outlives the token that opened it, so a process that starts or stops impersonating keeps its handles and every later operation is recorded under the token current at that moment. An investigation assuming the open-time identity will attribute later operations to the wrong principal.

Three masks appear together and are easy to confuse. Read as a sentence: the operation needed access.requested, of which access.matched triggered the audit, against a handle opened with access.granted, and it succeeded or did not.

3.3.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
object.kindstr.enumrequiredAlways file today, because FACS is the only enforcement point.
object.file.pathstr.pathrequiredThe absolute path of the file the operation acted on, resolved at the enforcement point.
operation.namestr.enumrequiredWhich operation was attempted.

Values here (open set): file.access · file.mmap · file.mprotect · file.permission · file.write · file.ioctl · file.lock · file.fcntl · file.truncate · file.fallocate.
access.requesteduint.maskrequiredWhat this operation needs — a read needs FILE_READ_DATA, an mmap with PROT_EXEC needs FILE_EXECUTE.
access.matcheduint.maskrequiredThe subset of the requested access that overlapped an audit mask and therefore caused the record to exist.
access.granteduint.maskrequiredWhat the handle was opened with, not what this operation was granted. An operation can only succeed if access.requested is a subset of it.
access.audit-maskuint.maskrequiredThe full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched.
outcome.successboolrequiredWhether the operation itself was allowed.
outcome.reasonstr.enumwhen outcome.success == falseFrom KACS_FSR_*, excluding DECISION (which names the ordinary path rather than a reason) and AUDIT_EMIT_FAIL (which cannot appear, being the failure of this record's own emission).

Values here (open set): signed-exec · grant-deny · append-deny · unmanaged-sysfs.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.4 kacs.audit.privilege.used

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.audit.privilege.used
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: the token's audit policy, success and failure flavours independently; at a capability or volume gate, also the first use of that gate by the process under its current token, and never a CAP_OPT_NOAUDIT check
  • Cardinality: once per privilege that contributed access; at a gate, once per process, token and gate

The record that a privilege was spent. Purely token-policy driven — no SACL is involved, so there is no trigger to record. operation.name says where it was spent, and the rest of the record follows from it.

access-check is a privilege that contributed access to an access check, with whether that contribution survived. Success there means the privilege worked, not that it fired. This is the field most often misread. A false outcome is not a failed attempt to use a privilege; it is a privilege that fired and was then overridden by a confinement, a CAAP rule, or PIP non-dominance — usually the more interesting of the two records, because it shows a boundary holding. MAXIMUM_ALLOWED requests produce nothing here. Privilege-use auditing short-circuits on them, even though SACL auditing was deliberately changed not to — a probing enumerator therefore trips one and slips the other.

linux-cap is a privilege that satisfied a Linux capability check: KACS answers every capability check with a privilege, and linux.cap names the check. volume-mount is a privilege that satisfied the volume-management gate the mount paths ask instead of CAP_SYS_ADMIN. Each is recorded once per process, token and gate, not once per check: a TCB process makes thousands of CAP_SYS_ADMIN checks a second, and the first answers who used the privilege and for what. The set starts again when the process acts under another token. Only successful uses are recorded, and only those of a user process's own checks: a probe with CAP_OPT_NOAUDIT, a kernel thread's check and a check against another process's credentials record nothing. The record is written as the process returns to user space, so it follows the system call that spent the privilege.

A token can carry either audit policy flavour, both, or neither, and each governs its own outcome independently. The boot SYSTEM token carries PRIVILEGE_USE_SUCCESS, so on a stock machine the records come from SYSTEM and the services that inherit its token.

3.4.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
operation.namestr.enumrequiredWhich operation was attempted.

Values here (open set): access-check · linux-cap · volume-mount.
object.kindstr.enumoptionalOn an access check, the object checked. Absent at a gate, and on a check made through the AccessCheck syscall with no audit context: the kernel does not know what was checked.
object.file.pathstr.pathwhen object.kind == fileThe absolute path of the file the operation acted on, resolved at the enforcement point.
object.process.piduintwhen object.kind == processThe process ID of the process the operation acted on.
object.process.guidbin.guidwhen object.kind == processThe durable GUID of the process the operation acted on.
object.token.iduint.luidwhen object.kind == tokenThe LUID of the token the operation acted on, for token-open and token-adjust checks.
object.token.guidbin.guidwhen object.kind == tokenThe durable GUID of the token the operation acted on.
privilege.namestr.enumrequiredThe privilege a record is about, by its Windows name.
privilege.contributeduint.maskwhen operation.name == access-checkThe access bits this privilege supplied to the check, intersected with what the caller actually asked for.
privilege.survivinguint.maskwhen operation.name == access-checkThe subset of privilege.contributed that reached the final granted mask.
linux.capstr.enumwhen operation.name == linux-capThe Linux capability whose check prompted the record, named as its CAP_* constant with the prefix removed, in kebab case: CAP_NET_ADMIN is net-admin.
access.requesteduint.maskwhen operation.name == access-checkThe whole check's requested mask, not this privilege's share of it.
access.granteduint.maskwhen operation.name == access-checkThe whole check's final granted mask.
outcome.successboolrequiredOn an access check, true when privilege.surviving is non-empty: derived rather than independently decided, and kept so that a single query for failed outcomes works across every event type. At a gate, always true.
fields.attestation.userspacebooloptionalSet on every record of the AccessCheck syscall, and on no other. There the descriptor, and with it trigger.ace, is always the caller's, as are any audit context and PIP state it passes.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.5 kacs.caap.policy.changed

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.caap.policy.changed
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: none — every change a caller holding SeTcbPrivilege makes is recorded
  • Cardinality: once per kacs_set_caap call that passed the privilege gate

The record that a central access policy was installed, replaced or removed. A policy decides access to every object whose SACL names it, alongside that object's own DACL, so one change here can widen or narrow access across the whole system without touching any object.

Only a caller holding SeTcbPrivilege, enabled, may change a policy; a call refused for want of it is not recorded. A call that passed the gate is recorded whether or not it applied: a malformed specification leaves the old policy in force and the record says so.

The record names the policy, not its rules. Compare two records' effects by the access records that follow them.

3.5.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
caap.policy.sidbin.sidrequiredThe SID identifying a central access policy.
operation.namestr.enumrequiredset installs a policy, or replaces the one of the same SID whole; remove takes it away, after which objects naming it are decided by the recovery policy.

Values here (closed set): set · remove.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.6 kacs.caap.sacl.skipped

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.caap.sacl.skipped
  • Defined in: kacs.evman
  • Tier: standard
  • Gating: an access check that evaluates a central access policy rule whose SACL cannot be used
  • Cardinality: once per rule whose SACL failed

The record that a central access policy rule's SACL could not be parsed or evaluated, so the audit it asked for was skipped. The access decision is unaffected — a rule's SACL only adds audit records — but the records that rule should have produced for this access do not exist.

This is the only evidence of the missing audit. An administrator who put an audit ACE in a policy rule expects records from every object the policy covers; while the rule's SACL is broken, none arrive, and nothing else says so.

A failure in a rule's staged SACL (caap.phase is staged-sacl) is recorded too. It changes nothing in force, and is the warning that promoting the staged policy would install a SACL that does not work.

3.6.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
object.kindstr.enumrequiredWhat sort of thing the operation acted on.
object.file.pathstr.pathwhen object.kind == fileThe absolute path of the file the operation acted on, resolved at the enforcement point.
object.process.piduintwhen object.kind == processThe process ID of the process the operation acted on.
object.process.guidbin.guidwhen object.kind == processThe durable GUID of the process the operation acted on.
object.token.iduint.luidwhen object.kind == tokenThe LUID of the token the operation acted on, for token-open and token-adjust checks.
object.token.guidbin.guidwhen object.kind == tokenThe durable GUID of the token the operation acted on.
caap.policy.sidbin.sidrequiredThe SID identifying a central access policy.
caap.rule.indexuintrequiredThe zero-based position of a rule within the central access policy named by caap.policy.sid.
caap.phasestr.enumrequiredWhich phase of a central access policy's audit evaluation a CAAP diagnostic describes.
outcome.reasonstr.enumrequiredinvalid-caap-sacl means the SACL would not parse; caap-sacl-evaluation-error means it parsed and evaluating it failed.

Values here (open set): invalid-caap-sacl · caap-sacl-evaluation-error.
access.requesteduint.maskrequiredThe access mask the caller asked for, after generic bits have been mapped to type-specific ones.
access.granteduint.maskrequiredThe effective grant of the check the rule was evaluated in.
access.granted-stageduint.maskrequiredWhat a staged central access policy, not yet in force, would have granted.
fields.attestation.userspacebooloptionalSet on every record of the AccessCheck syscall, and on no other. There the descriptor, and with it trigger.ace, is always the caller's, as are any audit context and PIP state it passes.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.7 kacs.caap.staging.diverged

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.caap.staging.diverged
  • Defined in: kacs.evman
  • Tier: standard
  • Gating: a staged central access policy applies to the object, and its result differs from the effective one
  • Cardinality: once per access check

The record that a staged central access policy would have decided an access differently from the policy in force. The access itself is decided by the effective policy alone; this records what promoting the staged one would change, for this subject and this object.

It is the event to watch while trialling a policy: stage it, let the system run, and read these records to see who would gain or lose access before anyone does. It is silent unless a staged policy exists, so on most systems it never fires.

The difference is not always in the grant. Staged and effective evaluation also differ when the per-object results of an object-type check differ, or when the audit records the two would produce differ, so a record can carry equal access.granted and access.granted-staged.

3.7.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
object.kindstr.enumrequiredWhat sort of thing the operation acted on.
object.file.pathstr.pathwhen object.kind == fileThe absolute path of the file the operation acted on, resolved at the enforcement point.
object.process.piduintwhen object.kind == processThe process ID of the process the operation acted on.
object.process.guidbin.guidwhen object.kind == processThe durable GUID of the process the operation acted on.
object.token.iduint.luidwhen object.kind == tokenThe LUID of the token the operation acted on, for token-open and token-adjust checks.
object.token.guidbin.guidwhen object.kind == tokenThe durable GUID of the token the operation acted on.
access.requesteduint.maskrequiredThe access mask the caller asked for, after generic bits have been mapped to type-specific ones.
access.granteduint.maskrequiredWhat the effective policy granted: the access the caller actually got.
access.granted-stageduint.maskrequiredWhat the staged policy would have granted instead.
fields.attestation.userspacebooloptionalSet on every record of the AccessCheck syscall, and on no other. There the descriptor, and with it trigger.ace, is always the caller's, as are any audit context and PIP state it passes.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.8 kacs.config.value.rejected

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.config.value.rejected
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: none — every rejected table is recorded
  • Cardinality: once per rejected read of the key

The record that KACS read one of its registry-held tables, rejected it, and carried on with what it had. Today that is the port reservation table under Machine\System\Network\TcpIp\PortReservations, read whenever the key changes.

The table is validated whole and is reject-or-keep, never merge: one bad value refuses all of them, and whatever was in force before — the last good table from the registry, or the compiled-in fallback — stays in force. That makes this the only place the divergence is visible: the registry shows what an administrator wrote, and this record shows that KACS is not using it. The same reject-or-keep rule as kmes.config.value.rejected and lcs.config.value.rejected, for a table rather than a single value.

3.8.1 Fields #

FieldTypePresenceMeaning
config.key.pathstrrequiredThe registry key the reported value lives under, in canonical form.
config.namestroptionalThe value at fault, by its registry name: a selector such as tcp:80, or @ for the default reservation. Absent when no single value is at fault.
outcome.reasonstr.enumrequiredempty: the key has no values. too-large: the table exceeds the kernel's bound. malformed: the serialised table broke, which is the kernel's fault rather than a value's. bad-selector: a value's name does not parse as a selector. bad-descriptor: a value's data is not a self-relative security descriptor. duplicate-default: the default reservation is given twice. missing-default: there is no default reservation. overlap: two selectors of the same width cover a port, so the most specific is ambiguous.

Values here (open set): empty · too-large · malformed · bad-selector · bad-descriptor · duplicate-default · missing-default · overlap.
outcome.errnoint.errnorequiredThe error the operation failed with, as a negative errno.
policy.previous-retainedboolrequiredAlways true: a rejected table leaves the one in force in place.
policy.fallbackboolrequiredWhether what stays in force is the compiled-in fallback, because no table from the registry was ever accepted this boot. The fallback lets SYSTEM alone bind a port, so a rejected first table leaves every service that binds a port without one.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.9 kacs.descriptor.rejected

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.descriptor.rejected
  • Defined in: kacs.evman
  • Tier: standard
  • Gating: none — every unreadable stored descriptor is recorded
  • Cardinality: one record per occurrence

The record that KACS read an object's stored security descriptor, found it corrupt, and refused to use it. The object is then treated as having a descriptor nobody can satisfy, so every access to it is denied until the descriptor is replaced by someone allowed to write one.

This is often the only explanation for a sudden, universal denial. A file that everyone could open and nobody now can, with no change to its descriptor anyone remembers making, is usually this: the stored bytes no longer parse, whether from disk corruption, a tool writing the extended attribute directly, or an interrupted write.

KACS records the event once per descriptor read, when the object's descriptor cache is filled, not on every denied access that follows. The subject is whoever's access made KACS read the descriptor: the first to touch the file after it was cached, not whoever corrupted it.

3.9.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
object.kindstr.enumrequiredAlways file today: file descriptors are the only stored descriptors KACS reads this way.
object.file.pathstr.pathoptionalNot carried today. The descriptor is read through an anchor that has no mount, so no absolute path can be resolved at that point.
object.file.inodeuintrequiredThe inode number the object presents.
object.file.deviceuintrequiredWith object.file.inode, what names the file in place of a path: find it with find <mount> -xdev -inum <inode> on the filesystem of that device.
object.sd.lengthuint.bytesrequiredThe length of the stored attribute that failed: 0 when it was empty, and more than 65,535 when it was too long to be a descriptor at all.
outcome.reasonstr.enumrequiredWhy the descriptor was refused. corrupt is the only reason today.

Values here (open set): corrupt.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.10 kacs.impersonation.reverted

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.impersonation.reverted
  • Defined in: kacs.evman
  • Tier: verbose
  • Gating: none — every impersonation that ends is recorded
  • Cardinality: once per impersonation ended

The record that a thread stopped impersonating and acts as its own token again. The subject is the thread's token after the revert; the object is the impersonation token it gave up, which a kacs.impersonation.started record named.

Verbose, because it is bookkeeping. An API that impersonates per request reverts once per request too, and the start already carries the security decision.

Not every end is recorded. A thread that exits while impersonating writes nothing: its credentials are released where no record can be built. And installing a new primary token does not end an impersonation — the impersonation is put back over the new token — so it writes nothing either.

3.10.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
emitter.thread.tiduintrequiredThe thread that wrote the record, where the operation is scoped to a thread rather than to its process.
object.kindstr.enumrequiredAlways token.
object.token.guidbin.guidrequiredThe impersonation token given up.
object.token.sidbin.sidrequiredThe user SID of the token the operation acted on.
operation.namestr.enumrequiredrevert is an explicit kacs_revert; exec the revert every exec performs before the new image runs; replaced the implicit end of one impersonation when the thread starts another.

Values here (open set): revert · exec · replaced.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.11 kacs.impersonation.started

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.impersonation.started
  • Defined in: kacs.evman
  • Tier: standard
  • Gating: none — every impersonation attempt that names a client token is recorded
  • Cardinality: once per attempt

The record that a thread took on, or tried to take on, a client's identity by impersonating its token. The subject is the server — the token that acted, as it stood before the switch — and the object is the client token. Successes and refusals are both recorded.

Impersonation is per thread, so emitter.thread.tid names the thread that changed identity, not emitter.process.pid. Records the thread writes afterwards carry the client's token in their header, until a kacs.impersonation.reverted record ends it.

The level can be lowered without the attempt failing. object.token.impersonation is the level the client token offered, and object.token.impersonation-permitted the level KACS let the server have. Where the second is lower — the server lacked SeImpersonatePrivilege for a different user, or the client's integrity was above the server's — the impersonation succeeded at Identification, which can query the client's identity but not act as it.

The GUID is the installed token's. A lowered level installs a new token, so object.token.guid and object.token.id on a success are that token's, and they match the emitter.token.guid of the thread's later records. Exactly when the level was lowered they differ from the GUID of the token the client handed over.

3.11.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
emitter.thread.tiduintrequiredThe thread that wrote the record, where the operation is scoped to a thread rather than to its process.
object.kindstr.enumrequiredAlways token.
object.token.guidbin.guidrequiredThe durable GUID of the token the operation acted on.
object.token.iduint.luidrequiredThe LUID of the token the operation acted on, for token-open and token-adjust checks.
object.token.sidbin.sidrequiredThe client: whose identity the server took on or asked for.
object.token.typestr.enumrequiredprimary only on a refusal: a primary token cannot be impersonated.
object.token.integrityuint.integrityrequiredThe integrity level of the token the operation acted on, as an integrity RID.
object.token.auth-iduint.luidoptionalAbsent only for a token with no logon session.
object.token.restrictedboolrequiredWhether the token is restricted: whether it carries restricting SIDs that every access check must also satisfy.
object.token.impersonationuint.enumrequiredThe level the client token offered: the level asked for.
object.token.impersonation-permitteduint.enumoptionalThe level the gate allowed. Absent when the attempt was refused before the gate answered.
privilege.namestr.enumoptionalSeImpersonatePrivilege, present when the server impersonated a different user, or across a restriction difference, and needed the privilege to do it at the level asked. The privilege is then marked used.
privilege.heldboolwhen privilege.name == SeImpersonatePrivilegeAlways true where present: a server without the privilege is not refused but lowered to Identification, which impersonation-permitted shows.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.
outcome.reasonstr.enumoptionalOn a refusal, where KACS knows why: the token handed over was a primary token (EINVAL); a restricted server tried to impersonate an unrestricted token of its own user, which would escape its restriction (EPERM); the token handle lacked TOKEN_IMPERSONATE (EACCES); or the identity could not be projected onto the thread's Linux credentials. Absent on a refusal for want of memory.

Values here (open set): primary-token · restriction-escape · no-impersonate-access · projection-failed.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.12 kacs.mount.policy.changed

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.mount.policy.changed
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: none — every change a caller admitted by the volume-management gate makes is recorded
  • Cardinality: once per change

The record that a filesystem's KACS mount policy was set: what happens to an object on it that has no stored descriptor. unmanaged turns access control off for the whole filesystem; deny-missing refuses such objects; the two synthesize policies build a descriptor from the parent and the template the caller supplies.

Setting a policy needs SeManageVolumePrivilege or SeTcbPrivilege. Every other refusal comes before that check, so a record is always of a change made.

The record does not carry the template. A synthesising policy's template descriptor decides what every unlabelled object on the filesystem grants; read it back with kacs_get_mount_policy.

3.12.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
object.mount.fs-typestroptionalThe filesystem's type, when the kernel knows it.
object.mount.policystr.enumrequiredThe KACS mount policy in force, which decides what happens to an object with no stored descriptor.
object.mount.policy-previousstr.enumrequiredThe mount policy a change replaced, beside object.mount.policy, the one it put in force.
object.mount.policy-generationuintrequiredThe generation the change began. Every descriptor cached under an older one is discarded on its next use.
outcome.successboolrequiredAlways true: every refusal is decided before anything changes.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.13 kacs.session.destroyed

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.session.destroyed
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: none — every logon session that ends is recorded
  • Cardinality: one record per occurrence

The record that a logon session ended because its last token went away. KACS destroys a session once no token refers to it, or once the only tokens left are its own linked elevated and filtered pair with nothing else holding them, and writes this record as it does.

A session that never acquired a token ends another way: a holder of SeTcbPrivilege destroys it explicitly with kacs_destroy_empty_logon_session, and the same record is written.

A session whose authentication package name is not valid UTF-8 produces no record. KACS cannot encode the name and skips the event rather than write it, and the session is destroyed regardless.

The record follows the teardown, written by a kernel worker. A session usually ends when a freed credential drops its last token, at a point where the record cannot be built, so KACS queues it and a kernel work item writes it moments later. Its header therefore names that kernel worker rather than the process whose exit or revert ended the session, and it can arrive after records that process wrote later.

3.13.1 Fields #

FieldTypePresenceMeaning
object.session.iduint.luidrequiredThe LUID of the logon session the operation acted on.
object.session.user.sidbin.sidrequiredThe user SID of the principal the logon session belongs to: whose session it is.
object.session.logon-typestr.enumrequiredWhat kind of logon the session represents, from the KACS_LOGON_TYPE_* values in uapi/pkm/token.h.
object.session.auth-packagestrrequiredThe name of the authentication package that established the session, as the creator supplied it.
object.session.logon-timeuint.timerequiredWhen the session was created. KACS keeps it to the second, so the nanosecond value is always a whole number of seconds.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

3.14 kacs.signature.crypto.failed

Peios / Using Peios / Events / Access and Identity Events

  • Event type: kacs.signature.crypto.failed
  • Defined in: kacs.evman
  • Tier: essential
  • Gating: none — recorded whenever the signature machinery cannot run
  • Cardinality: one record per occurrence

The record that the machinery for verifying signed executables cannot run. From then on every signed executable is refused: a signature that cannot be verified fails the exec rather than passing as unsigned.

Recorded at boot when the probe for the ML-DSA-65 transform fails. KACS cannot refuse to start over it — a security module that fails to initialise boots with no protection at all, which is worse — so it reports instead, and the refusal happens at each exec. Without this record, the condition would show only as every process running without an integrity label.

3.14.1 Fields #

FieldTypePresenceMeaning
signature.crypto-stagestr.enumrequiredAlways boot-probe today.
outcome.errnoint.errnorequiredThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

4.1 stratafs.file.copied-up

Peios / Using Peios / Events / Filesystem Events

  • Event type: stratafs.file.copied-up
  • Defined in: stratafs.evman
  • Tier: standard
  • Gating: none — every copy-up is recorded
  • Cardinality: one record per occurrence

The record that StrataFS materialised an object into a writable stratum, successful or not. Copy-up is how a layered mount turns a read-only object into a writable one, so this is the record of a file coming into existence in a place it did not previously exist.

The record is written through KACS, so its emitter.class is kacs.

There is no subject in the payload, and that is not an omission. Copy-up preserves the source object's descriptor, so the resulting file records nothing about who caused it to exist. The actor is identified by the header instead: copy-up runs in the caller's own context, so emitter.token.guid and emitter.process.guid are the caller's.

That identification is currently weaker than it looks. The header carries GUIDs and nothing in the stream binds a GUID to a SID, an image or a process name, so an operator reading these records can group them by actor but cannot say who the actor was.

ENOTDIR from a failed parent materialisation surfaces here, in outcome.errno, rather than as a refusal record. Searching stratafs.mutation.refused for it finds nothing; the record exists under this type with every field present.

4.1.1 Fields #

FieldTypePresenceMeaning
object.file.path-relativestr.pathoptionalAbsent only from a reduced record: when the memory for the full record could not be had, the kernel writes the record without its paths rather than lose it.
source.stratum.indexuintrequiredWhich stratum an object was read from, by index within the mount's stack.
source.stratum.pathstr.pathoptionalAbsent only from a reduced record, with the other paths.
destination.stratum.indexuintrequiredWhich stratum an object was written into, by index within the mount's stack.
destination.stratum.pathstr.pathoptionalAbsent only from a reduced record, with the other paths.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from stratafs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

4.2 stratafs.mutation.refused

Peios / Using Peios / Events / Filesystem Events

  • Event type: stratafs.mutation.refused
  • Defined in: stratafs.evman
  • Tier: standard
  • Gating: none — every arrangement refusal is recorded
  • Cardinality: one record per occurrence

The record that a mutation was refused because of how the mount is arranged, rather than because of an access check. Software writing where it cannot, or an arrangement that does not admit an operation someone expected — a mismatch between intent and configuration that is otherwise visible only as an error returned to a caller who may discard it.

The record is written through KACS, so its emitter.class is kacs.

The refusals that count are one explicit list: EROFS, EXDEV, ENOTDIR, EISDIR, ENOTEMPTY, EEXIST and EINVAL. Call sites cover every mutating path.

EACCES is deliberately absent. A refusal produced by an access check is recorded by the mechanism that performed it, so StrataFS does not duplicate it. Looking here for a permission denial finds nothing — look at kacs.audit.access.checked.

There is one exception, and it is deliberate. A refused deferred deletion is recorded on any non-zero result, including one refused by an access check, because by the time a deferred deletion fails there is nobody left to receive the error. Rollbacks arrive under this type with the same flag set: a create or link whose outer bookkeeping failed and whose lower object could not be removed again, and a failed publication rollback after a copy-up.

Resolution, revalidation and enumeration record nothing at all. They happen on every path operation, reveal nothing the resulting access check does not, and recording them would produce volume out of all proportion to their significance.

4.2.1 Fields #

FieldTypePresenceMeaning
object.file.path-relativestr.pathoptionalAbsent only from a reduced record: when the memory for the full record could not be had, the kernel writes the record without its paths rather than lose it.
operation.namestr.enumrequiredStrataFS names its own operations, and the set is disjoint from the file. names an already-open handle uses.

Values here (open set): copy-file-range · copy-up-publication-rollback · create · create-rollback · fallocate · link · link-rollback · mmap · remap-file-range · removexattr · rename · rmdir · setattr · setxattr · splice-write · supersede · supersede-removal · tmpfile · truncate · unlink · write.
source.stratum.indexuintoptionalAbsent when the refusal was raised before any provider was determined.
source.stratum.pathstr.pathoptionalPresent exactly when source.stratum.index is, except in a reduced record, which carries no paths.
outcome.errnoint.errnorequiredThe error the operation failed with, as a negative errno.
outcome.deferredboolrequiredWhether the refusal was deferred — set on rollbacks and on deferred deletions, which are the records where no caller remained to be told.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from stratafs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.1 lcs.audit.backup.ended

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.backup.ended
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: none — audited unconditionally
  • Cardinality: one record per occurrence

The record that a registry subtree backup finished, successfully or otherwise. Pairs with lcs.audit.backup.started on the same key.

Emission failure here does not affect the result, which has already been determined by the time this is written.

5.1.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.2 lcs.audit.backup.started

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.backup.started
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: none — audited unconditionally
  • Cardinality: one record per occurrence

The record that a registry subtree backup began, emitted before any data is read. Backup is a privilege-gated bulk operation that bypasses per-key access checks entirely, so this trail is the only evidence it happened at all — which is why it is audited whatever the target key's SACL says.

The start record exists so that an operation dying partway still leaves evidence that it began. A start with no matching end is itself the finding.

Emission failure fails the operation with EIO, unlike every other LCS event: an unrecorded bulk read of the configuration store is not permitted to proceed.

5.2.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
operation.fduintrequiredThe descriptor the backup stream was written to.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.3 lcs.audit.key.created

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.key.created
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: a matching SACL audit ACE on the parent key, for KEY_CREATE_SUB_KEY
  • Cardinality: once per key created

The record that a registry key was created. Creating a key checks only KEY_CREATE_SUB_KEY on its parent, so the parent's SACL decides, by the rule lcs.audit.key.opened applies to an open: a success audit ACE on the parent that matches the caller. No handle exists yet to carry an alarm mask.

Only a key that was made is recorded. A create that found the key already there and opened it instead writes nothing here; it is an open, and lcs.audit.key.opened records it if the key's own SACL asks. The record is written once the key exists, so a create whose handle then fails to reach the caller is still recorded, because the key was still made. A transacted create is recorded when staged.

5.3.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key.
object.key.guidbin.guidrequiredThe new key.
object.key.pathstrrequiredThe new key's full path.
object.key.layer.namestroptionalThe layer the key was created in.
object.key.createdboolrequiredAlways true.
object.key.volatileboolrequiredWhether a registry key is volatile, meaning it lives only in memory and does not survive a reboot.
object.key.volatile-requestedboolrequiredEqual to object.key.volatile, since only a key that was made is recorded.
object.key.symlinkboolrequiredWhether a registry key is a symbolic link to another key.
object.sd.lengthuint.bytesrequiredThe new key's descriptor, as built from the parent's inheritable ACEs and the caller's token.
object.sd.ownerbin.sidoptionalThe owner SID on the object's security descriptor.
access.requesteduint.maskrequiredAlways KEY_CREATE_SUB_KEY, the right checked on the parent.
access.granteduint.maskrequiredWhat the parent check granted.
transaction.iduintoptionalThe transaction the operation belonged to, registry or package.
outcome.successboolrequiredAlways true.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.4 lcs.audit.key.deleted

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.key.deleted
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: DELETE overlaps the alarm mask cached on the key handle
  • Cardinality: once per delete through a handle whose mask covers it

The record that a registry key was deleted from a layer through its own handle, or that an attempt failed. The key named is the one deleted, the handle's key, by GUID and full path.

Deleting a layer's metadata key, Machine\System\Registry\Layers\<Name>, deletes the layer itself; the record then also names the layer.

5.4.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
object.key.pathstrrequiredThe resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES.
object.key.layer.namestroptionalThe layer whose entry was deleted.
object.layer.namestroptionalPresent when the delete removed a layer, naming it.
access.requesteduint.maskrequiredAlways DELETE.
access.granteduint.maskrequiredThe access mask in force.
access.matcheduint.maskrequiredThe subset of the requested access that overlapped an audit mask and therefore caused the record to exist.
access.audit-maskuint.maskrequiredThe full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched.
transaction.iduintoptionalThe transaction the operation belonged to, registry or package.
request.timed-outboolwhen outcome.success == falseWhether a request's wait for the source's reply ran out before the reply arrived.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.5 lcs.audit.key.descriptor.changed

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.key.descriptor.changed
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: always when the change includes the SACL; otherwise WRITE_DAC or WRITE_OWNER overlaps the alarm mask cached on the key handle
  • Cardinality: once per descriptor change it covers

The record that a registry key's security descriptor was changed through a key handle, or that an attempt failed.

A change to the SACL is always recorded, whatever the handle's mask. It takes ACCESS_SYSTEM_SECURITY, which only SeSecurityPrivilege grants, such changes are rare, and removing a SACL is exactly how someone hides what follows. It is recorded once the handle's own access check admits it: a caller whose handle lacks ACCESS_SYSTEM_SECURITY is refused before any record, so asking for a SACL change cannot be used to write records. Owner, group and DACL changes follow the handle's mask, as writes do.

Both descriptors are recorded by length, SHA-256 digest and owner, never in full. Whether the SACL was part of the change is object.sd.components.

5.5.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
object.key.pathstrrequiredThe resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES.
object.sd.componentsuint.flagsrequiredThe parts the caller asked to change, its security_info.
object.sd.lengthuint.bytesoptionalThe descriptor as written: the merge of the caller's parts into the old one. Absent when the request failed before the merge.
object.sd.length-previousuint.bytesoptionalAbsent when the request failed before the old descriptor was read.
object.sd.digestbinoptionalPresent with object.sd.length.
object.sd.digest-previousbinoptionalPresent with object.sd.length-previous.
object.sd.ownerbin.sidoptionalPresent with object.sd.length.
object.sd.owner-previousbin.sidoptionalPresent with object.sd.length-previous.
access.requesteduint.maskrequiredThe rights the change needs: WRITE_OWNER for the owner or group, WRITE_DAC for the DACL, ACCESS_SYSTEM_SECURITY for the SACL.
access.granteduint.maskrequiredThe access mask in force.
access.matcheduint.maskrequiredZero when the record exists only because the change included the SACL.
access.audit-maskuint.maskrequiredThe full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched.
transaction.iduintoptionalThe transaction the operation belonged to, registry or package.
request.timed-outboolwhen outcome.success == falseTrue when the source did not answer in time, so the change may have been applied after all.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.6 lcs.audit.key.hidden

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.key.hidden
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: DELETE overlaps the alarm mask cached on the key handle
  • Cardinality: once per hide through a handle whose mask covers it

The record that a registry key was hidden in a layer through its own handle, or that an attempt failed. Hiding writes a marker that masks the key in every lower layer without deleting it there, so to every reader the key is gone; it is gated on DELETE, as deleting is.

5.6.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
object.key.pathstrrequiredThe resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES.
object.key.layer.namestroptionalThe layer the marker was written in.
access.requesteduint.maskrequiredAlways DELETE.
access.granteduint.maskrequiredThe access mask in force.
access.matcheduint.maskrequiredThe subset of the requested access that overlapped an audit mask and therefore caused the record to exist.
access.audit-maskuint.maskrequiredThe full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched.
mutation.sequenceuintoptionalThe sequence number LCS stamped on a registry mutation.
transaction.iduintoptionalThe transaction the operation belonged to, registry or package.
request.timed-outboolwhen outcome.success == falseWhether a request's wait for the source's reply ran out before the reply arrived.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.7 lcs.audit.key.opened

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.key.opened
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: a matching SACL audit ACE on the key
  • Cardinality: once per matching open

The record that a registry key was opened and what access the open received. SACL evaluation follows the KACS AccessCheck algorithm, with the SACL evaluated alongside the DACL rather than separately.

A request of MAXIMUM_ALLOWED alone records nothing. It maps to a desired mask of zero, and the SACL walk tests each audit ACE's mask against that mask, so no ACE matches. The one request shape that asks for everything is the one shape that produces no record — a real hole for anyone auditing key opens, and the same defect KACS's own SACL walk was changed to close.

Emission failure is handled in two halves. If a valid payload cannot be constructed, the open fails with EIO and no key descriptor is published — the audit is a precondition of the access. If a valid payload cannot be retained by KMES, the decision and the descriptor stand, and the loss is accounted as a gap in the stream rather than as a failed open.

5.7.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key. Names the table the access masks decode against.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
access.requesteduint.maskrequiredAfter registry generic mapping, with MAXIMUM_ALLOWED re-added when the caller asked for it.
access.granteduint.maskrequiredForced to zero on a denial, and enforced rather than merely intended — a denied record carrying a non-zero granted mask is rejected as malformed.
outcome.successboolrequiredWhether the open was allowed. Replaces the former decision string, which carried the same two states as words.
trigger.sacl-matchuint.flagsrequiredWhich flavour of audit ACE matched.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.8 lcs.audit.key.tombstoned

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.key.tombstoned
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: KEY_SET_VALUE overlaps the alarm mask cached on the key handle
  • Cardinality: once per blanket tombstone change through a handle whose mask covers it

The record that a key's blanket tombstone was set or cleared in a layer, or that an attempt failed. A blanket tombstone hides every value lower layers hold for the key at once, so setting one is a bulk value change and is gated on KEY_SET_VALUE, as value writes are.

5.8.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
object.key.pathstrrequiredThe resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES.
object.key.layer.namestroptionalThe layer the blanket belongs to.
operation.namestr.enumoptionalWhether the blanket was set or cleared. Absent only when the request failed before it was read.

Values here (closed set): set · clear.
access.requesteduint.maskrequiredAlways KEY_SET_VALUE.
access.granteduint.maskrequiredThe access mask in force.
access.matcheduint.maskrequiredThe subset of the requested access that overlapped an audit mask and therefore caused the record to exist.
access.audit-maskuint.maskrequiredThe full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched.
mutation.sequenceuintoptionalPresent when a blanket was set: clearing one stamps no sequence.
transaction.iduintoptionalThe transaction the operation belonged to, registry or package.
request.timed-outboolwhen outcome.success == falseWhether a request's wait for the source's reply ran out before the reply arrived.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.9 lcs.audit.restore.ended

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.restore.ended
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: none — audited unconditionally
  • Cardinality: one record per occurrence

The record that a registry subtree restore finished, successfully or otherwise. Pairs with lcs.audit.restore.started on the same key.

5.9.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.10 lcs.audit.restore.started

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.restore.started
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: none — audited unconditionally
  • Cardinality: one record per occurrence

The record that a registry subtree restore began, emitted before any state is modified. As with backup, this is a privilege-gated bulk operation that bypasses per-key access checks, and is audited regardless of the target's SACL.

A restore rewrites configuration wholesale, so a start with no matching end means the store may be in a partially rewritten state.

Emission failure fails the operation with EIO.

5.10.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
operation.fduintrequiredThe descriptor the restore stream was read from.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.11 lcs.audit.transaction.committed

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.transaction.committed
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: the transaction staged at least one recorded write
  • Cardinality: once per transaction that staged a recorded write

The record of how a registry transaction ended, written for a transaction that staged at least one write some other record covers. Transacted writes are recorded when they are staged; this says whether they took effect, joined to them on transaction.id.

It is written once, at the end: when REG_IOC_COMMIT leaves the transaction committed or otherwise finished, when it times out, or when its fd is closed without a commit. A commit that fails and leaves the transaction open writes nothing yet.

A commit that timed out may have taken effect. The commit was sent and not answered; transaction.commit-outstanding true says so, and the source may have applied it before the reply was lost.

The subject depends on how it ended. On REG_IOC_COMMIT it is the subject who committed, not who staged the writes. A transaction that ended by timeout or by its fd closing has nobody acting, and names the subject that staged its first recorded write.

5.11.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
transaction.iduintrequiredThe transaction the operation belonged to, registry or package.
transaction.statestr.enumrequiredThe state it ended in: committed on success.
transaction.commit-outstandingboolwhen outcome.success == falseWhether a transaction's commit had been sent to its source and not yet answered.
outcome.successboolrequiredTrue only when the transaction committed.
outcome.errnoint.errnooptionalPresent when a REG_IOC_COMMIT call failed; absent for a transaction that ended without one.
outcome.reasonstr.enumwhen outcome.success == falseaborted when its fd was closed without a commit or a layer it wrote was deleted, timed-out when it passed its deadline, source-error when its source failed or went away.

Values here (open set): aborted · timed-out · source-error.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.12 lcs.audit.value.deleted

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.value.deleted
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: KEY_SET_VALUE overlaps the alarm mask cached on the key handle
  • Cardinality: once per delete through a handle whose mask covers it

The record that a registry value was deleted through a key handle, or that an attempt to delete one failed. Gated, staged and fixed at open exactly as lcs.audit.value.set is.

What was removed is recorded by type, length and SHA-256 digest: the effective value before the delete, read in the transaction's own view when the delete is transacted.

5.12.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
object.key.pathstrrequiredThe resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES.
object.key.layer.namestroptionalThe layer whose entry was deleted. Absent only when the request failed before its layer was read.
object.key.value.namestroptionalAbsent only when the request failed before its name was read.
object.key.value.type-previousuint.enumoptionalAbsent when no value was found to delete.
object.key.value.length-previousuint.bytesoptionalPresent with object.key.value.type-previous.
object.key.value.digest-previousbinoptionalPresent with object.key.value.type-previous.
access.requesteduint.maskrequiredAlways KEY_SET_VALUE.
access.granteduint.maskrequiredThe access mask in force.
access.matcheduint.maskrequiredThe subset of the requested access that overlapped an audit mask and therefore caused the record to exist.
access.audit-maskuint.maskrequiredThe full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched.
transaction.iduintoptionalThe transaction the operation belonged to, registry or package.
request.timed-outboolwhen outcome.success == falseWhether a request's wait for the source's reply ran out before the reply arrived.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.13 lcs.audit.value.set

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.audit.value.set
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: KEY_SET_VALUE overlaps the alarm mask cached on the key handle
  • Cardinality: once per write through a handle whose mask covers it

The record that a registry value was written through a key handle, or that an attempt to write one failed. The key's SYSTEM_ALARM ACEs configure it: the ACEs that match the caller when the key is opened give the handle a continuous-audit mask, and every later write whose right overlaps the mask is recorded, as kacs.audit.handle.used does for files.

The mask is fixed when the key is opened. Removing the alarm ACE does not silence a handle already open, so the write that removes it is still recorded; equally, adding one does not reach handles opened before.

A transacted write is recorded when it is staged, not when it lands. outcome.success then means the source accepted it into the transaction; whether the transaction took effect is the matching lcs.audit.transaction.committed, joined on transaction.id.

A timed-out write may have been applied later. The source is not told to cancel, and when its reply arrives the kernel still applies the write's effects, with nothing recording who made it. Such a record says outcome.success false with request.timed-out true: read it as "may have been applied".

The data itself is never recorded, only its type, length and SHA-256 digest, with the same three for the value it replaced.

5.13.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia callerThe user SID of the effective token the operation ran under.
subject.token.integrityuint.integrityvia callerThe integrity RID of the effective token.
subject.token.iduint.luidvia callerThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia callerThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia callerWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia callerThe impersonation level of the effective token.
object.kindstr.enumrequiredAlways key.
object.key.guidbin.guidrequiredThe registry key an operation acted on.
object.key.pathstrrequiredThe resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES.
object.key.layer.namestroptionalThe layer written, base when the caller named none. Absent only when the request failed before its layer was read.
object.key.value.namestroptionalAbsent only when the request failed before its name was read.
object.key.value.typeuint.enumoptionalThe type written. Present once the data was read from the caller.
object.key.value.lengthuint.bytesoptionalPresent with object.key.value.type.
object.key.value.digestbinoptionalPresent with object.key.value.type.
object.key.value.type-previousuint.enumoptionalThe effective value before the write. Only on a write outside a transaction that found one: a transacted write never reads it.
object.key.value.length-previousuint.bytesoptionalPresent with object.key.value.type-previous.
object.key.value.digest-previousbinoptionalPresent with object.key.value.type-previous.
access.requesteduint.maskrequiredAlways KEY_SET_VALUE.
access.granteduint.maskrequiredWhat the handle was opened with.
access.matcheduint.maskrequiredThe subset of the requested access that overlapped an audit mask and therefore caused the record to exist.
access.audit-maskuint.maskrequiredThe full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched.
mutation.sequenceuintoptionalThe sequence stamped on the write. Absent only when the request failed before one was allocated.
mutation.sequence-expecteduintoptionalPresent on a compare-and-swap write.
transaction.iduintoptionalPresent when the write was staged in a transaction.
request.timed-outboolwhen outcome.success == falseTrue when the source did not answer in time, so the write may have been applied after all.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.14 lcs.config.value.rejected

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.config.value.rejected
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: none — every rejected configuration value is recorded
  • Cardinality: once per rejected value

The record that LCS read one of its own configuration values, rejected it, and carried on with what it had. Identical in shape and meaning to kmes.config.value.rejected, differing only in which key the values live under.

Validation is reject-or-keep and never clamps, so this event is the only place where what an administrator wrote and what LCS is running on can be seen to differ.

Emission failure preserves the retained configuration — a failure to record the rejection must not change which value is in force.

5.14.1 Fields #

FieldTypePresenceMeaning
config.key.pathstrrequiredThe registry key the reported value lives under, in canonical form.
config.namestrrequiredThe name of the configuration value being reported on, within config.key.path.
config.expected.typeuint.enumrequiredThe registry type the value is required to have.
config.expected.minuintrequiredThe smallest value accepted for this setting.
config.expected.maxuintrequiredThe largest value accepted for this setting.
config.received.kindstr.enumrequiredHow the stored value failed validation.
config.received.typeuint.enumwhen config.received.kind == wrong-typeThe registry type the value actually had.
config.received.valueuintwhen config.received.kind == out-of-rangeThe value that was stored and rejected.
config.valueuintrequiredThe value retained.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

5.15 lcs.source.response.rejected

Peios / Using Peios / Events / Registry Events

  • Event type: lcs.source.response.rejected
  • Defined in: lcs.evman
  • Tier: essential
  • Gating: none — every rejection is recorded
  • Cardinality: one record per occurrence

The record that LCS rejected data a registry source sent it. Sources are userspace backends serving configuration into the kernel, so this is the boundary where the kernel refuses to believe what userspace told it.

This is the one LCS event with no caller. It describes a source misbehaving rather than a principal acting, and there is frequently no principal involved — the data arrived on a source channel, not through a syscall.

The failure classes distinguish malformed structure from semantic impossibility: a security descriptor that will not parse is a different problem from a sequence number from the future or two layers claiming the same winning sequence.

5.15.1 Fields #

FieldTypePresenceMeaning
source.rsi.slotuintrequiredWhich registry source slot supplied the data, by index.
source.rsi.hivestroptionalThe hive the offending source data belonged to, where the failure could be attributed to one.
request.iduintoptionalThe identifier of the source request this record concerns, for joining a record to the exchange that produced it.
request.op-codeuintoptionalThe source-protocol operation code of the request this record concerns.
object.key.guidbin.guidoptionalPresent when the rejected data could be attributed to a specific key.
outcome.reasonstr.enumrequiredThe source-validation failure class.

Values here (open set): malformed-security-descriptor · malformed-layer-name · unknown-rsi-status-code · future-sequence-number · duplicate-winning-sequence-tie · malformed-layer-metadata-security-descriptor · malformed-key-name · malformed-value-name · malformed-response-payload · malformed-key-metadata · malformed-value-payload · malformed-delete-layer-orphan-list.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

6.1 kmes.buffer.swap.failed

Peios / Using Peios / Events / Event Stream Events

  • Event type: kmes.buffer.swap.failed
  • Defined in: kmes.evman
  • Tier: standard
  • Gating: none — every failed swap is recorded, whatever the error
  • Cardinality: once per failed swap

The record that KMES could not resize its per-CPU ring buffers and kept the capacity it had. A capacity change is a swap — new buffers at the new size, surviving events copied across, writers switched over — and this is what happens when that swap cannot be completed.

The failure is usually memory pressure, which makes it self-reinforcing in a way worth recognising: an administrator typically raises capacity because the system is dropping events, and the allocation most likely to fail is the one made while the system is already short of memory.

The other failures are rarer and more serious. EIO means the migration found a ring whose framing was corrupt and abandoned the swap rather than copy it; any other error is the kernel refusing to quiesce the CPUs for the switch-over. In every case the old rings stay live and nothing was lost by the attempt.

The swap is system-wide rather than per-ring, so no CPU or ring is named.

6.1.1 Fields #

FieldTypePresenceMeaning
buffer.capacity-requesteduint.bytesrequiredThe per-CPU ring buffer capacity that was asked for.
buffer.capacityuint.bytesrequiredThe capacity kept.
outcome.errnoint.errnorequired-ENOMEM when the new rings could not be allocated, -EIO when the migration met a corrupt ring.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

6.2 kmes.config.applied

Peios / Using Peios / Events / Event Stream Events

  • Event type: kmes.config.applied
  • Defined in: kmes.evman
  • Tier: standard
  • Gating: none — every configuration read that reaches the commit is recorded
  • Cardinality: once per read of Machine\System\KMES

The record that KMES read its configuration key and committed what it found. Emitted after every read that gets as far as the commit: at boot once the registry is available, and again each time a value under the key changes.

The four counts account for every setting the read saw, so a record whose config.counts.applied is zero is a read that changed nothing, and one with config.counts.retained-invalid above zero comes with a kmes.config.value.rejected for each value kept back. A read whose BufferCapacity swap failed is still recorded here, because the other three settings commit without it; buffer.capacity is then the capacity kept, beside the kmes.buffer.swap.failed that says why.

6.2.1 Fields #

FieldTypePresenceMeaning
config.key.pathstrrequiredAlways Machine\System\KMES.
config.counts.applieduintrequiredHow many settings in a configuration refresh were applied.
config.counts.retained-missinguintrequiredHow many settings kept their previous value because they were absent from the registry.
config.counts.retained-invaliduintrequiredHow many settings kept their previous value because the stored value was rejected, of the wrong type or out of range.
config.counts.ignored-unknownuintrequiredHow many registry values were ignored because their names match no setting.
buffer.capacityuint.bytesrequiredThe per-CPU ring capacity in force after the commit.
emission.rate-limituintrequiredThe per-process emission ceiling in force after the commit.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

6.3 kmes.config.refresh.failed

Peios / Using Peios / Events / Event Stream Events

  • Event type: kmes.config.refresh.failed
  • Defined in: kmes.evman
  • Tier: essential
  • Gating: none — every failed re-read is recorded
  • Cardinality: once per failed read

The record that KMES could not read one of its configuration keys and kept running on what it had. Two keys are read this way: Machine\System\KMES, KMES's own settings, and Machine\Generic\Events, the emission policy that decides which kernel event types are written.

A failed read changes nothing. KMES keeps the configuration it last committed, or the compiled-in defaults if it never committed one, and the emission policy keeps the switches it last computed, or the tier defaults. Until the next change under the key, the registry and the running kernel disagree, and this record is the only sign of it: an administrator who switched an event type off and finds it still written is looking for one of these.

The usual cause is the registry source failing to answer in time. A configuration rejected value by value is not a failed read; that is kmes.config.value.rejected.

6.3.1 Fields #

FieldTypePresenceMeaning
config.key.pathstrrequiredMachine\System\KMES or Machine\Generic\Events.
outcome.errnoint.errnorequiredThe error the operation failed with, as a negative errno.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

6.4 kmes.config.value.rejected

Peios / Using Peios / Events / Event Stream Events

  • Event type: kmes.config.value.rejected
  • Defined in: kmes.evman
  • Tier: essential
  • Gating: none — every rejected configuration value is recorded
  • Cardinality: once per rejected value

The record that KMES read a configuration value, rejected it, and carried on with what it had. Emitted when the stored value is missing, of the wrong type, or out of range.

Validation is reject-or-keep, never clamp: a valid value is applied and an invalid one is ignored, with the last known-good value retained. That makes this event the only place the divergence is visible — the registry records what an administrator wrote, and this records what KMES is running on. An operator reading only the registry will believe a change took effect that did not.

These records are emitted before the configuration commit and are deliberately not part of the commit decision: a failure to construct one must never roll back a hot-swap that otherwise succeeded.

6.4.1 Fields #

FieldTypePresenceMeaning
config.key.pathstrrequiredThe registry key the reported value lives under, in canonical form.
config.namestrrequiredThe name of the configuration value being reported on, within config.key.path.
config.expected.typeuint.enumrequiredThe registry type the value is required to have.
config.expected.minuintrequiredThe smallest value accepted for this setting.
config.expected.maxuintrequiredThe largest value accepted for this setting.
config.received.kindstr.enumrequiredHow the stored value failed validation.
config.received.typeuint.enumwhen config.received.kind == wrong-typeThe registry type the value actually had.
config.received.valueuintwhen config.received.kind == out-of-rangeThe value that was stored and rejected.
config.valueuintrequiredThe value retained.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

7.1 ntfe.policy.published

Peios / Using Peios / Events / Network Policy Events

  • Event type: ntfe.policy.published
  • Defined in: ntfe.evman
  • Tier: standard
  • Gating: none — every generation of rules that goes into force is recorded
  • Cardinality: once per published generation of rules

The record that a new generation of traffic rules went into force. The kernel reads its own policy from Machine\System\Network\Rules, a short while after the registry changes, and publishes it whole: from this point every traversal is judged by these rules, and every flow judged under the old ones is judged again on its next packet.

A re-read that finds the policy exactly as it was published publishes nothing and writes no record, so writing a rule back unchanged, or netd writing its inventory, is silent. A refused policy writes ntfe.policy.rejected instead, and the generation before it stays.

Not every generation has one of these. A change to the network context (which network each interface is on, and its trust) advances the same generation counter without a new rule set, and writes no record. A verdict whose policy.generation falls between two of these records was judged by the rules of the earlier one.

7.1.1 Fields #

FieldTypePresenceMeaning
policy.generationuintrequiredThe generation this policy now runs as. Verdict records carry the same number.
policy.generation-previousuintrequiredThe generation of the rule set this one replaced, or 0 when this is the first since boot. Context changes advance the counter too, so it can be lower than one less than policy.generation.
policy.layersstr.enum[]requiredThe rules layers the active generation loaded a forest for.
policy.report-thresholduintrequiredThe machine's reporting threshold, CurrentReportingLevel: a rule's report fires only when its level is at least this.
policy.report-threshold-previousuintrequired1, the default, when this is the first generation since boot.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

7.2 ntfe.policy.rejected

Peios / Using Peios / Events / Network Policy Events

  • Event type: ntfe.policy.rejected
  • Defined in: ntfe.evman
  • Tier: essential
  • Gating: a refusal unlike the last one recorded
  • Cardinality: once per distinct refusal

The record that the kernel read a traffic policy and refused it, so the policy an administrator wrote is not the policy in force. NTFE accepts or refuses a policy whole: one bad rule anywhere refuses every layer, and the previous generation goes on judging traffic exactly as before. Nothing is half-applied. The registry shows what was written; this shows that it did not take.

The kernel reads the policy again whenever anything under Machine\System\Network changes, including netd's inventory, and a broken policy is refused by every read until it is fixed. The same refusal of the same policy is recorded once: a new record means the policy or the reason changed. A policy that is accepted, or found unchanged, starts the count again.

The rule, where there is one, is the place to look: outcome.reason says what is wrong with it.

7.2.1 Fields #

FieldTypePresenceMeaning
policy.generationuintrequiredThe generation still in force, which the refused policy did not replace.
policy.previous-retainedboolrequiredAlways true: NTFE never leaves part of a refused policy in force.
outcome.errnoint.errnowhen outcome.reason != no-rules-keyThe error the operation failed with, as a negative errno.
outcome.reasonstr.enumrequiredWhy the policy was refused. A rule's own content: unknown-fact (a condition names a fact the language does not have), bad-operator (an operator the fact does not support), bad-pattern (a match value that does not parse for its fact), bad-counter-view (a Counter.<n> key that does not parse), bad-actions-value (Actions missing or not a list of strings), bad-action (an action that does not parse; rule.action-error says how), prompt-chain-too-deep, bad-priority (not an integer), bad-enabled (not 0 or 1), bad-rule-name, present-never-at-layer (a Present condition on a fact the layer never has), key-not-at-layer and action-not-at-layer (a condition or action the rule's layer does not speak). How it was stored: bad-value-type (a registry type rules do not use), bad-value-length (an integer of the wrong size), not-utf8. The policy as a whole: rule-too-deep (more than 13 levels), too-many-rules (more than 4096 in a layer), bad-reporting-level (CurrentReportingLevel not an integer from 1 to 6), tag-hash-collision and stream-hash-collision (two names that hash alike), counter-never-written (a counter no rule writes), tag-downward-read (a rule reading a tag a higher layer writes), counter-store-refused (the counter tables could not be built). And the read itself: registry-read-failed, out-of-memory, and no-rules-key, which is no policy at all — recorded once each time the key goes missing.

Values here (open set): out-of-memory · unknown-fact · bad-operator · bad-pattern · bad-counter-view · bad-actions-value · bad-action · prompt-chain-too-deep · bad-priority · bad-enabled · bad-rule-name · tag-hash-collision · stream-hash-collision · counter-never-written · tag-downward-read · present-never-at-layer · key-not-at-layer · action-not-at-layer · rule-too-deep · too-many-rules · bad-value-type · bad-value-length · not-utf8 · bad-reporting-level · counter-store-refused · registry-read-failed · no-rules-key.
rule.namestroptionalThe rule the refusal is in, or names, as its path relative to its layer key. Absent when the refusal is not one rule's: two names hashing alike, the reporting level, a registry read that failed outside any rule, or no Rules key. Held to 255 bytes.
rule.name-truncatedbooloptionalWhether rule.name was cut short because the rule's path did not fit in the record.
rule.layerstr.enumoptionalThe layer the named rule is in. Absent with rule.name, and also for the checks that span layers (counter-never-written, tag-downward-read), which name a rule but not its layer.
rule.action-errorstr.enumwhen outcome.reason == bad-actionWhy one action expression in a rule's Actions value failed to parse.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

7.3 ntfe.verdict.reported

Peios / Using Peios / Events / Network Policy Events

  • Event type: ntfe.verdict.reported
  • Defined in: ntfe.evman
  • Tier: essential
  • Gating: an explicit report directive in the matching rule
  • Cardinality: once per matching evaluation

The record of a traffic policy decision that a rule explicitly asked to be reported. Not a record of every decision — the engine evaluates constantly and reports only where a rule says to.

A stock machine emits none of these. The shipped baseline rule set contains no report directives, so this event exists and never fires until an administrator adds one. Absence of these records says nothing about whether traffic was evaluated.

The engine's own record of every verdict goes to a private ring read by the userspace policy daemon, not to the event stream, and is overwritten when no reader is attached. So the complete decision history is neither in the event stream nor durable.

Address, port and protocol fields are conditional on how far up the stack evaluation reached: traffic matched at the raw-packet layer has no addresses to record.

7.3.1 Fields #

FieldTypePresenceMeaning
rule.namestrrequiredThe policy rule that produced this record, by name.
rule.hashuintrequiredThe FNV-1a-64 hash of the rule's whole registry path.
rule.name-truncatedbooloptionalWhether rule.name was cut short because the rule's path did not fit in the record.
rule.report-leveluintrequiredThe reporting level the matching rule asked for.
rule.layerstr.enumrequiredWhich evaluation layer the rule sat in.
rule.seatstr.enumrequiredWhere in the path evaluation happened.
outcome.verdictstr.enumrequiredThe decision a policy engine reached, where the decision has more than two states and outcome.success cannot express it.
outcome.reasonstr.enumwhen outcome.verdict == rejectWhich flavour of explicit rejection the rule asked for: the story the REJECT tells the sender. refused says nothing is listening and reveals no policy; prohibited says policy refused the traffic. When two REJECTs tie on priority, refused wins.

Values here (closed set): prohibited · refused.
network.directionstr.enumrequiredWhich way the traffic was moving relative to this machine.
network.interface.namestroptionalAbsent when the traffic was evaluated with no device attached, in which case network.interface.index is 0.
network.interface.indexuintrequiredThe kernel's index for that interface.
network.ether-typeuintrequiredThe link-layer protocol number of the frame.
network.familyuint.enumrequiredThe address family of the addresses in this record.
network.protocoluint.enumwhen network.family != 0The transport protocol number, from the IANA protocol numbers registry.
source.addressstr.ipwhen network.family != 0The address the traffic came from, rendered in the textual form for its family.
destination.addressstr.ipwhen network.family != 0The address the traffic was going to, rendered in the textual form for its family.
source.portuintoptionalPresent when the protocol has ports.
destination.portuintoptionalPresent when the protocol has ports.
flow.statestr.enumoptionalPresent when flow tracking applied.
network.lengthuint.bytesrequiredThe length of the traffic unit evaluated.
policy.generationuintrequiredThe generation counter of the rule set in force when the decision was made.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.1 peinit.boot.downgraded

Peios / Using Peios / Events / Service Events

  • Event type: peinit.boot.downgraded
  • Defined in: peinit.evman
  • Tier: essential
  • Gating: none
  • Cardinality: one per finding that forced the downgrade, at most once a boot in all

A full boot was downgraded to safe mode: the machine is running a reduced service set. The services named are not marked failed, because safe mode never meant to start them, so this record is the only one that names them as the cause. Essential because it is rare and changes what the whole machine is running.

Formerly boot.safe_mode_downgrade.

8.1.1 Fields #

FieldTypePresenceMeaning
outcome.reasonstr.enumrequiredThe finding that forced the downgrade.

Values here (open set): critical-cycle · critical-boot-conflict.
graph.servicesstr[]when outcome.reason == critical-cycleThe services a graph finding involves.
object.service.namestrwhen outcome.reason == critical-boot-conflictThe name of the service the event is about, as its definition names it.
object.service.conflict.namestrwhen outcome.reason == critical-boot-conflictThe name of the service this one conflicts with, on a finding that two services both triggered at boot declare a conflict and so cannot both start.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.2 peinit.cgroup.leaked

Peios / Using Peios / Events / Service Events

  • Event type: peinit.cgroup.leaked
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none
  • Cardinality: once per cgroup, the first time it is found still populated after its post-kill deadline

A cgroup could not be reclaimed: its processes do not respond to the kernel, and the cgroup is leaked. It is one of a service's sub-cgroups, or the whole cgroup of a submitted job.

Formerly cgroup.leaked.

8.2.1 Fields #

FieldTypePresenceMeaning
object.service.namestroptionalThe service whose cgroup leaked. Absent for a submitted job's cgroup, which belongs to no service.
object.job.guidbin.guidoptionalThe submitted job whose cgroup leaked. Exactly one of object.service.name and this field is present.
object.cgroup.pathstr.pathrequiredThe cgroup the event is about, as its full path under /sys/fs/cgroup/peinit.
object.cgroup.typestr.enumrequiredservice-tree for a submitted job's cgroup, which is the whole of its containment.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.3 peinit.config.reload.applied

Peios / Using Peios / Events / Service Events

  • Event type: peinit.config.reload.applied
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none
  • Cardinality: once per explicit reload-config, and once a boot at most when the boot window closes with reloads deferred

A configuration reload ran: from now on the registry as it then stood is the running configuration, or, if it failed, nothing changed. Written for an explicit reload-config, and for the one reload that applies what the boot window deferred. A reload a registry watch starts writes none.

A failed validation also writes one peinit.graph.validation.failed per finding, under the reload-config phase.

Formerly config.reload_coalesced, which an explicit reload did not write.

8.3.1 Fields #

FieldTypePresenceMeaning
outcome.successboolrequiredWhether the operation succeeded.
outcome.detailstroptionalWhy the reload failed, for a person. Present only when outcome.success is false.
graph.servicesstr[]optionalThe services whose definitions the boot window had deferred. Present exactly on the reload that applies them, which is how it is told from an explicit reload-config.
graph.counts.addeduintwhen outcome.success == trueHow many service definitions a configuration reload added: names that had no definition before.
graph.counts.updateduintwhen outcome.success == trueHow many existing service definitions a configuration reload changed.
graph.counts.restoreduintwhen outcome.success == trueHow many definitions a configuration reload brought back after an earlier reload had removed them while their services were still running.
graph.counts.marked-removeduintwhen outcome.success == trueHow many definitions a configuration reload withdrew from services that were still running.
graph.counts.discardeduintwhen outcome.success == trueHow many definitions a configuration reload withdrew and dropped at once, because their services were not running.
graph.counts.undecodableuintwhen outcome.success == trueHow many definitions a configuration reload found in the registry but could not decode.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.4 peinit.config.reload.deferred

Peios / Using Peios / Events / Service Events

  • Event type: peinit.config.reload.deferred
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none
  • Cardinality: once per reload during the boot window that left definitions pending

A configuration reload during the boot window changed definitions of services the boot plan had not yet launched. The boot runs against its snapshot, so those services start from the plan, and the change waits for peinit.config.reload.applied.

Formerly config.reload_deferred.

8.4.1 Fields #

FieldTypePresenceMeaning
graph.servicesstr[]requiredThe services whose definitions were deferred.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.5 peinit.critical-service.failed

Peios / Using Peios / Events / Service Events

  • Event type: peinit.critical-service.failed
  • Defined in: peinit.evman
  • Tier: essential
  • Gating: none
  • Cardinality: once per Critical failure that drives the machine to reboot

A service marked Critical failed, and peinit took the machine to its reboot final action. Essential because it is rare and reboots the machine.

Formerly critical.failure.

8.5.1 Fields #

FieldTypePresenceMeaning
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
outcome.reasonstr.enumrequiredHow the Critical service failed.

Values here (open set): service-main-terminal · health-check-failure · watchdog-timeout · restart-budget-exhausted.
shutdown.finalization-statestr.enumrequiredHow far the system shutdown had got when the event was written.
outcome.detailstrwhen shutdown.finalization-state == failedWhy finalisation failed.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.6 peinit.event.dropped

Peios / Using Peios / Events / Service Events

  • Event type: peinit.event.dropped
  • Defined in: peinit.evman
  • Tier: essential
  • Gating: none
  • Cardinality: once per event the ring refused

The ring refused one of peinit's events, and it is gone. Written so that the trail records the gap rather than, for example, a job with a peinit.job.started and no peinit.job.ended. Small by construction, and if the ring refuses this one too peinit treats it as fatal. Essential because it is the record of a hole in the audit trail.

There is no count of drops on the record: count the records. The truncated notice that used to follow a cut job.ended is gone, because peinit.job.ended says itself when its arguments were cut.

Formerly event.oversized, with action dropped.

8.6.1 Fields #

FieldTypePresenceMeaning
emission.typestrrequiredThe event type an emitter was trying to emit, as it supplied it.
emission.payload-lengthuint.bytesrequiredThe byte length of an event's MessagePack payload, without the header or the event type.
object.service.namestroptionalThe service the refused event was about, or whose job sent it.
object.job.guidbin.guidoptionalThe job the refused event was about, or whose process sent it.
outcome.errnoint.errnooptionalThe error the emit returned, where it gave a number.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.7 peinit.fd-store.rejected

Peios / Using Peios / Events / Service Events

  • Event type: peinit.fd-store.rejected
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every refused descriptor is recorded
  • Cardinality: one record per occurrence

peinit refused a file descriptor a service asked it to keep.

Formerly fd_store.rejected.

8.7.1 Fields #

FieldTypePresenceMeaning
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
object.fd-store.namestrrequiredThe name a service gave a file descriptor it asked peinit to keep, with FDNAME=.
outcome.reasonstr.enumrequireddisabled when the service's definition does not enable an fd store; full when it is at its limit.

Values here (open set): disabled · full.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.8 peinit.graph.operation.ended

Peios / Using Peios / Events / Service Events

  • Event type: peinit.graph.operation.ended
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none — every member of a graph context is recorded
  • Cardinality: one record per occurrence

An operation that is a member of a graph execution context reached its terminal outcome as the graph sees it: satisfied, so that what depends on it may proceed, or failed. The operation's own peinit.operation.ended records the same end from the operation's side.

Formerly graph.operation_terminal.

8.8.1 Fields #

FieldTypePresenceMeaning
graph.contextuintrequiredThe graph execution context an event belongs to: one boot's start of its service set, or one on-demand start of a service and everything it needs.
object.operation.guidbin.guidrequiredThe peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends.
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
outcome.successboolrequiredTrue when the graph counts the member satisfied, false when it failed.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.9 peinit.graph.validation.failed

Peios / Using Peios / Events / Service Events

  • Event type: peinit.graph.validation.failed
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every finding is recorded
  • Cardinality: one per finding; a validation with several findings writes several

The service graph failed validation for the reason in outcome.reason. At boot the services named are marked and the boot continues; at reload-config the whole reload is rejected; at phase2-boot the boot plan could not be built.

Formerly graph.validation_error.

8.9.1 Fields #

FieldTypePresenceMeaning
graph.phasestr.enumrequiredWhen the service graph was validated.
outcome.reasonstr.enumrequiredThe finding.

Values here (open set): invalid-service-name · duplicate-service · missing-service-definition · missing-hard-dependency · hard-dependency-blocked · cycle · conflicting-boot-services · invalid-health-check-restart-window · unschedulable-health-check · invalid-timer-schedule · validation-error.
object.service.namestroptionalThe service the finding is about. Absent on cycle, which names several.
graph.servicesstr[]when outcome.reason == cycleThe services a graph finding involves.
object.service.dependency.namestroptionalOn missing-hard-dependency and hard-dependency-blocked.
object.service.dependency.kindstr.enumoptionalPresent exactly when object.service.dependency.name is.
object.service.conflict.namestrwhen outcome.reason == conflicting-boot-servicesThe name of the service this one conflicts with, on a finding that two services both triggered at boot declare a conflict and so cannot both start.
object.service.health-check.intervaluint.durationwhen outcome.reason == invalid-health-check-restart-windowThe configured interval between health checks, in nanoseconds.
object.service.health-check.retriesuintwhen outcome.reason == invalid-health-check-restart-windowThe configured number of consecutive health-check failures at which peinit stops reporting the service unhealthy and acts on it.
object.service.health-check.restart-windowuint.durationwhen outcome.reason == invalid-health-check-restart-windowThe configured restart window of a health check, in nanoseconds.
object.service.typestr.enumwhen outcome.reason == unschedulable-health-checkHow the service's main process is supervised.
object.service.timer.schedulestrwhen outcome.reason == invalid-timer-scheduleThe service's timer schedule, exactly as its definition wrote it.
outcome.detailstroptionalOn invalid-timer-schedule, the parser's message; on validation-error, why the definition was refused.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.10 peinit.graph.validation.warned

Peios / Using Peios / Events / Service Events

  • Event type: peinit.graph.validation.warned
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every warning is recorded
  • Cardinality: one per warning

The service graph passed validation with a warning: nothing was refused, but something will not behave as its author probably expects.

Formerly graph.validation_warning.

8.10.1 Fields #

FieldTypePresenceMeaning
graph.phasestr.enumrequiredWhen the service graph was validated.
outcome.reasonstr.enumrequiredThe warning.

Values here (open set): alive-readiness-with-hard-dependents · unfilled-role.
object.service.namestrwhen outcome.reason == alive-readiness-with-hard-dependentsThe name of the service the event is about, as its definition names it.
object.service.dependentsstr[]when outcome.reason == alive-readiness-with-hard-dependentsThe services that hard-depend on this one, by name.
graph.rolestrwhen outcome.reason == unfilled-roleThe role no service fills.
graph.servicesstr[]when outcome.reason == unfilled-roleThe services a graph finding involves.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.11 peinit.internal-error.contained

Peios / Using Peios / Events / Service Events

  • Event type: peinit.internal-error.contained
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every contained internal error is recorded
  • Cardinality: one record per occurrence

peinit could not carry out a step on a service's behalf, and contained the fault to that service. The fault is peinit's, not the service's; the job, operation and state change it caused have their own events.

The error itself is not carried: every path that contains one has it only as Rust Debug output, which no event field admits. peinit's console line and the failed operation's result keep it.

Formerly service.internal_error.

8.11.1 Fields #

FieldTypePresenceMeaning
operation.stagestr.enumrequiredThe step peinit could not carry out.

Values here (open set): job-terminal · process-setup · lifecycle-deadline · notify.
object.service.namestroptionalThe name of the service the event is about, as its definition names it.
object.job.guidbin.guidoptionalThe job the event is about.
object.service.failedbooloptionalPresent exactly when object.service.name is.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.12 peinit.job.created

Peios / Using Peios / Events / Service Events

  • Event type: peinit.job.created
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none — every job peinit creates is recorded
  • Cardinality: one record per occurrence

A job exists: peinit has decided to run a process and recorded it, before the process exists. The gap to peinit.job.started is time spent queued, and peinit.job.ended repeats everything here, which is why this one is verbose.

Formerly job.created.

8.12.1 Fields #

FieldTypePresenceMeaning
object.job.guidbin.guidrequiredThe job the event is about.
object.job.typestr.enumrequiredWhat the job is for.
object.job.statestr.enumrequiredAlways created.
object.service.namestrwhen object.job.type != submittedThe name of the service the event is about, as its definition names it.
object.job.activation-generationuintwhen object.job.type != submittedThe activation generation of the service the job belongs to, at the time the job was created.
object.operation.guidbin.guidoptionalThe operation the job serves. Absent when none asked for it, as for a submitted job.
object.job.executablestr.pathrequiredThe path of the executable the job runs.
object.job.token.sidbin.sidoptionalA service's token is minted when its process is set up, after this record, so here it is the user the job is to run as when peinit knows that SID in advance — a well-known identity such as SYSTEM — and absent for an identity peinit has only by name. A submitted job's token exists from the start.
object.job.token.groupsbin.sid[]optionalPresent once peinit holds the job's token: a submitted job's at once, a service job's from peinit.job.started.
object.job.token.privilegesuint.flagsoptionalPresent exactly when object.job.token.groups is.
object.job.token.privileges-enableduint.flagsoptionalPresent exactly when object.job.token.groups is.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.13 peinit.job.ended

Peios / Using Peios / Events / Service Events

  • Event type: peinit.job.ended
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every job that ends is recorded
  • Cardinality: one record per occurrence

A job is over: its process exited or was killed, or the job ended without its process ever starting. It carries the whole job record, so it is the one job event to read when only one is kept.

Formerly job.ended.

8.13.1 Fields #

FieldTypePresenceMeaning
object.job.guidbin.guidrequiredThe job the event is about.
object.job.typestr.enumrequiredWhat the job is for.
object.job.statestr.enumrequiredThe terminal state: completed, failed or abandoned.
outcome.successboolrequiredTrue exactly when object.job.state is completed.
outcome.detailstroptionalWhy the job did not complete, in peinit's words, such as ProcessCrash: signal 9. Present only when outcome.success is false and peinit recorded a cause. Free text until it is given an enumeration.
object.service.namestrwhen object.job.type != submittedThe name of the service the event is about, as its definition names it.
object.job.activation-generationuintwhen object.job.type != submittedThe activation generation of the service the job belongs to, at the time the job was created.
object.operation.guidbin.guidoptionalThe peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends.
object.process.piduintoptionalAbsent when the process never started.
object.process.exit-codeintoptionalThe exit code of the job's process, as it passed it to exit.
object.process.exit-signalintoptionalThe number of the signal that ended the job's process.
object.job.executablestr.pathrequiredThe path of the executable the job runs.
object.job.argumentsstr[]requiredThe job's argument vector, including argv[0].
object.job.arguments-truncatedboolrequiredWhether object.job.arguments was cut to fit the record.
object.job.arguments-countuintrequiredHow many arguments the job was given, before any were cut.
object.job.created-timeuint.timerequiredWhen peinit created the job, in nanoseconds since the Unix epoch.
object.job.started-timeuint.timeoptionalWhen the job's process started, in nanoseconds since the Unix epoch.
object.job.durationuint.durationrequiredHow long the job lasted, in nanoseconds, from its creation to its end.
object.cgroup.pathstr.pathrequiredThe cgroup the event is about, as its full path under /sys/fs/cgroup/peinit.
object.cgroup.generationuintrequiredThe cgroup generation of the service the cgroup belongs to.
object.job.token.sidbin.sidoptionalAs on peinit.job.started, for a job whose process started. A service's job that ended without starting had no token yet, and is as on peinit.job.created.
object.job.token.groupsbin.sid[]optionalPresent exactly when the job's process started, or it is a submitted job.
object.job.token.privilegesuint.flagsoptionalPresent exactly when object.job.token.groups is.
object.job.token.privileges-enableduint.flagsoptionalPresent exactly when object.job.token.groups is.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.14 peinit.job.output.dropped

Peios / Using Peios / Events / Service Events

  • Event type: peinit.job.output.dropped
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none
  • Cardinality: once per job, on the first line dropped

A submitted job's submitter stopped draining its output, and peinit began dropping the submitter's copy of the job's lines. The copy sent to the log store is unaffected.

Formerly output.dropped.

8.14.1 Fields #

FieldTypePresenceMeaning
object.job.guidbin.guidrequiredThe job the event is about.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.15 peinit.job.started

Peios / Using Peios / Events / Service Events

  • Event type: peinit.job.started
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every job whose process starts is recorded
  • Cardinality: one record per occurrence

A job's process exists and has been executed: the moment a process is running as object.job.token.sid on peinit's behalf.

Formerly job.started.

8.15.1 Fields #

FieldTypePresenceMeaning
object.job.guidbin.guidrequiredThe job the event is about.
object.job.typestr.enumrequiredWhat the job is for.
object.job.statestr.enumrequiredAlways running.
object.service.namestrwhen object.job.type != submittedThe name of the service the event is about, as its definition names it.
object.job.activation-generationuintwhen object.job.type != submittedThe activation generation of the service the job belongs to, at the time the job was created.
object.operation.guidbin.guidoptionalThe peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends.
object.process.piduintrequiredThe job's process.
object.cgroup.pathstr.pathrequiredThe cgroup the job's process runs in.
object.job.token.sidbin.sidrequiredThe user SID of the token the job's process runs as.
object.job.token.groupsbin.sid[]requiredThe group SIDs of the token the job's process runs as, in the token's order.
object.job.token.privilegesuint.flagsrequiredThe privileges present on the token the job's process runs as, as the flags of the 64-bit privilege word of uapi/pkm/token.h, one KACS_SE_*_PRIVILEGE bit each.
object.job.token.privileges-enableduint.flagsrequiredWhich of the privileges in object.job.token.privileges are enabled, as flags in the same 64-bit word.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.16 peinit.job.status.reported

Peios / Using Peios / Events / Service Events

  • Event type: peinit.job.status.reported
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none — every change a submitted job reports is recorded, within the rate bound
  • Cardinality: at most one per job per second; a report inside the window updates the job view and writes nothing

A submitted job reported STATUS= or PROGRESS= on the notification channel, and this is what peinit retained after it.

Formerly job.status.

8.16.1 Fields #

FieldTypePresenceMeaning
object.job.guidbin.guidrequiredThe job the event is about.
object.job.submitter.sidbin.sidrequiredThe user SID of the client that submitted the job.
notify.statusstroptionalThe text a service sent as STATUS=: free text describing what it is doing.
notify.progress.currentuintoptionalHow far a service or submitted job has got, as it reported with PROGRESS=: the count before any /.
notify.progress.totaluintoptionalThe end notify.progress.current is counting towards, as reported after the / of PROGRESS=.
notify.progress.boundedbooloptionalWhether the progress a service or submitted job reported declares an end: true for PROGRESS=N/ and PROGRESS=N/M, false for a bare PROGRESS=N, which counts with no end (PSPU §4.19).
notify.progress.unitstr.enumoptionalWhat notify.progress.current and notify.progress.total count, as reported with PROGRESS_UNIT=.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.17 peinit.notify.errno.reported

Peios / Using Peios / Events / Service Events

  • Event type: peinit.notify.errno.reported
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every authenticated ERRNO= is recorded
  • Cardinality: one record per occurrence

A service's job sent ERRNO=: its own claim about an error, which peinit neither acts on nor retains.

Formerly notify.errno.

8.17.1 Fields #

FieldTypePresenceMeaning
subject.service.namestrrequiredThe service whose job sent a notification message.
subject.job.guidbin.guidrequiredThe job whose process sent a notification message: the service's main process, or a submitted job.
subject.job.activation-generationuintrequiredThe activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it.
subject.operation.guidbin.guidoptionalThe peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes.
notify.errnoint.errnooptionalAbsent when the text sent was not a positive number.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.18 peinit.notify.exit-status.reported

Peios / Using Peios / Events / Service Events

  • Event type: peinit.notify.exit-status.reported
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every authenticated EXIT_STATUS= is recorded
  • Cardinality: one record per occurrence

A service's job sent EXIT_STATUS=, informationally; it is not the exit of any process.

Formerly notify.exit_status.

8.18.1 Fields #

FieldTypePresenceMeaning
subject.service.namestrrequiredThe service whose job sent a notification message.
subject.job.guidbin.guidrequiredThe job whose process sent a notification message: the service's main process, or a submitted job.
subject.job.activation-generationuintrequiredThe activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it.
subject.operation.guidbin.guidoptionalThe peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes.
notify.exit-statusintoptionalAbsent when the text sent was not a number.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.19 peinit.notify.progress.reported

Peios / Using Peios / Events / Service Events

  • Event type: peinit.notify.progress.reported
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none — every change of progress is recorded, within the rate bound
  • Cardinality: at most one per service activation per second

A service's job sent PROGRESS= or PROGRESS_UNIT=, and this is the progress peinit retained after it.

Formerly notify.progress.

8.19.1 Fields #

FieldTypePresenceMeaning
subject.service.namestrrequiredThe service whose job sent a notification message.
subject.job.guidbin.guidrequiredThe job whose process sent a notification message: the service's main process, or a submitted job.
subject.job.activation-generationuintrequiredThe activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it.
subject.operation.guidbin.guidoptionalThe peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes.
notify.progress.currentuintoptionalHow far a service or submitted job has got, as it reported with PROGRESS=: the count before any /.
notify.progress.totaluintoptionalThe end notify.progress.current is counting towards, as reported after the / of PROGRESS=.
notify.progress.boundedbooloptionalWhether the progress a service or submitted job reported declares an end: true for PROGRESS=N/ and PROGRESS=N/M, false for a bare PROGRESS=N, which counts with no end (PSPU §4.19).
notify.progress.unitstr.enumoptionalWhat notify.progress.current and notify.progress.total count, as reported with PROGRESS_UNIT=.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.20 peinit.notify.rejected

Peios / Using Peios / Events / Service Events

  • Event type: peinit.notify.rejected
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every refused notification datagram is recorded
  • Cardinality: one record per occurrence

peinit refused a datagram on the notification channel and applied none of it: the sender could not be authenticated, the message did not parse, or it made no sense for the job's state. A stream of these from one process is worth reading.

Formerly notify.rejected.

8.20.1 Fields #

FieldTypePresenceMeaning
outcome.reasonstr.enumrequiredWhy the datagram was refused. internal-error is peinit unable to act on it, not anything wrong with the datagram; shutdown-refused is a timeout extension (EXTEND_TIMEOUT_USEC=) the shutdown in progress would not grant.

Values here (open set): invalid-utf8 · malformed-line · truncated · unauthenticated-sender · missing-service · job-not-running · missing-process · pidfd-mismatch · process-verification-failed · generation-mismatch · missing-start-operation · missing-reload-operation · unsupported-reload-operation · unsupported-ready-state · shutdown-refused · internal-error.
subject.process.piduintoptionalThe sending process, when the kernel gave its credentials.
subject.service.namestroptionalThe sender's service, when peinit could attribute it.
subject.job.guidbin.guidoptionalThe job whose process sent a notification message: the service's main process, or a submitted job.
subject.job.activation-generationuintoptionalThe activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it.
subject.operation.guidbin.guidoptionalThe peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.21 peinit.notify.status.reported

Peios / Using Peios / Events / Service Events

  • Event type: peinit.notify.status.reported
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none — every authenticated STATUS= is recorded
  • Cardinality: one record per occurrence

A service's job sent STATUS= on the notification channel. The text is the service's own words, not peinit's. Not rate-bounded: a service decides how often it sends one.

Formerly notify.status.

8.21.1 Fields #

FieldTypePresenceMeaning
subject.service.namestrrequiredThe service whose job sent a notification message.
subject.job.guidbin.guidrequiredThe job whose process sent a notification message: the service's main process, or a submitted job.
subject.job.activation-generationuintrequiredThe activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it.
subject.operation.guidbin.guidoptionalThe peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes.
notify.statusstrrequiredThe text a service sent as STATUS=: free text describing what it is doing.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.22 peinit.notify.stopping.reported

Peios / Using Peios / Events / Service Events

  • Event type: peinit.notify.stopping.reported
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every authenticated STOPPING=1 is recorded
  • Cardinality: one record per occurrence

A service's job sent STOPPING=1, so peinit will not send it SIGTERM. The record exists because the effect is an absence: without it, a service that rightly got no SIGTERM looks the same afterwards as one that wrongly did not.

Formerly notify.stopping.

8.22.1 Fields #

FieldTypePresenceMeaning
subject.service.namestrrequiredThe service whose job sent a notification message.
subject.job.guidbin.guidrequiredThe job whose process sent a notification message: the service's main process, or a submitted job.
subject.job.activation-generationuintrequiredThe activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it.
subject.operation.guidbin.guidoptionalThe peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.23 peinit.on-failure.suppressed

Peios / Using Peios / Events / Service Events

  • Event type: peinit.on-failure.suppressed
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every suppressed handler is recorded
  • Cardinality: one record per occurrence

peinit declined to start an OnFailure handler, because starting it would have looped or gone too deep, so the failure it was meant to handle went unhandled.

Formerly on_failure.loop_suppressed.

8.23.1 Fields #

FieldTypePresenceMeaning
object.service.namestrrequiredThe service whose failure the chain was handling.
object.service.on-failure.namestrrequiredThe OnFailure handler peinit declined to start, because starting it would have looped or gone too deep.
object.service.on-failure-chainstr[]requiredThe OnFailure handlers already started in the chain that peinit cut short, in the order they were started.
outcome.reasonstr.enumrequiredWhy the operation resolved the way it did.

Values here (closed set): cycle · max-depth.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.24 peinit.operation.ended

Peios / Using Peios / Events / Service Events

  • Event type: peinit.operation.ended
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every operation that ends, other than by merging, is recorded
  • Cardinality: one record per occurrence

An operation reached a terminal state other than merged: it completed, failed, was cancelled while still pending, or was aborted while running. One type for the four, because they are outcomes of one action (PGSS §6.6); object.operation.state says which.

Formerly operation.completed, operation.failed, operation.cancelled and operation.aborted.

8.24.1 Fields #

FieldTypePresenceMeaning
object.operation.guidbin.guidrequiredThe peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends.
object.operation.typestr.enumrequiredWhat the operation does to its service.
object.operation.sourcestr.enumrequiredWho or what asked for the operation.
object.operation.statestr.enumrequiredcompleted, failed, cancelled or aborted.
outcome.successboolrequiredTrue exactly when object.operation.state is completed.
outcome.detailstroptionalThe operation's result as peinit words it for a client, such as inactive or startup killed by shutdown. Free text until it is given an enumeration.
object.operation.durationuint.durationoptionalFrom the request, not from the start. Absent on a cancelled operation, which never ran.
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
subject.token.sidbin.sidoptionalThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]optionalThe group SIDs carried by the effective token.
subject.token.privilegesuint.flagsoptionalThe privileges the effective token holds, as the flags of its 64-bit privilege word from uapi/pkm/token.h: bit n is the privilege whose LUID is n, so SeDebugPrivilege is bit 20.
subject.token.privileges-enableduint.flagsoptionalWhich of the privileges in subject.token.privileges are enabled, as flags in the same bit layout.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.25 peinit.operation.merged

Peios / Using Peios / Events / Service Events

  • Event type: peinit.operation.merged
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none — every merge is recorded
  • Cardinality: one record per occurrence

An operation was absorbed into another before it ran, and has no outcome of its own: follow object.operation.merged-into.guid to the operation whose peinit.operation.ended decides it.

Formerly operation.merged.

8.25.1 Fields #

FieldTypePresenceMeaning
object.operation.guidbin.guidrequiredThe peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends.
object.operation.typestr.enumrequiredWhat the operation does to its service.
object.operation.sourcestr.enumrequiredWho or what asked for the operation.
object.operation.statestr.enumrequiredAlways merged.
object.operation.merged-into.guidbin.guidrequiredThe operation that absorbed this one.
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
subject.token.sidbin.sidoptionalThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]optionalThe group SIDs carried by the effective token.
subject.token.privilegesuint.flagsoptionalThe privileges the effective token holds, as the flags of its 64-bit privilege word from uapi/pkm/token.h: bit n is the privilege whose LUID is n, so SeDebugPrivilege is bit 20.
subject.token.privileges-enableduint.flagsoptionalWhich of the privileges in subject.token.privileges are enabled, as flags in the same bit layout.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.26 peinit.operation.requested

Peios / Using Peios / Events / Service Events

  • Event type: peinit.operation.requested
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every operation is recorded
  • Cardinality: one record per occurrence

An operation on a service — a start, stop, restart, reload or reset — was created. A client's command creates one with object.operation.source admin; every other source is peinit acting for its own reasons. Every operation in a graph context is requested when the context is built.

Formerly operation.requested.

8.26.1 Fields #

FieldTypePresenceMeaning
object.operation.guidbin.guidrequiredThe peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends.
object.operation.typestr.enumrequiredWhat the operation does to its service.
object.operation.sourcestr.enumrequiredWho or what asked for the operation.
object.operation.statestr.enumrequiredAlways pending.
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
subject.token.sidbin.sidoptionalThe client whose command created the operation. Absent for an operation peinit created itself.
subject.token.groupsbin.sid[]optionalWritten only when peinit holds the client's whole token. For a control-channel caller it holds the user SID alone, so today an operation's subject is subject.token.sid and nothing more.
subject.token.privilegesuint.flagsoptionalPresent exactly when subject.token.groups is.
subject.token.privileges-enableduint.flagsoptionalPresent exactly when subject.token.groups is.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.27 peinit.operation.started

Peios / Using Peios / Events / Service Events

  • Event type: peinit.operation.started
  • Defined in: peinit.evman
  • Tier: verbose
  • Gating: none — every operation that begins to run is recorded
  • Cardinality: one record per occurrence

An operation left the queue and began to run.

Formerly operation.started.

8.27.1 Fields #

FieldTypePresenceMeaning
object.operation.guidbin.guidrequiredThe peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends.
object.operation.typestr.enumrequiredWhat the operation does to its service.
object.operation.sourcestr.enumrequiredWho or what asked for the operation.
object.operation.statestr.enumrequiredAlways running.
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
subject.token.sidbin.sidoptionalThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]optionalThe group SIDs carried by the effective token.
subject.token.privilegesuint.flagsoptionalThe privileges the effective token holds, as the flags of its 64-bit privilege word from uapi/pkm/token.h: bit n is the privilege whose LUID is n, so SeDebugPrivilege is bit 20.
subject.token.privileges-enableduint.flagsoptionalWhich of the privileges in subject.token.privileges are enabled, as flags in the same bit layout.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.28 peinit.recovery.entered

Peios / Using Peios / Events / Service Events

  • Event type: peinit.recovery.entered
  • Defined in: peinit.evman
  • Tier: essential
  • Gating: none
  • Cardinality: once, when peinit gives up on the boot and starts the recovery shell

peinit dropped the machine to a recovery shell, for the reason in outcome.reason. Written before the registry or eventd may exist, into the ring, which is where the record of a boot that failed this early survives. Essential because it is rare and means the machine did not boot.

Formerly recovery.entered.

8.28.1 Fields #

FieldTypePresenceMeaning
outcome.reasonstr.enumrequiredWhy the operation resolved the way it did.

Values here (open set): kernel-command-line · privileges · boot-attempt-counter · forced-by-kernel-command-line · boot-attempt-threshold-reached · root-writable · virtual-filesystems · machine-id · rtc-clock · registryd · provisioning · infrastructure · phase2 · runtime.
outcome.detailstroptionalWhat went wrong, in the error's own words, such as peinit is missing required privilege(s): SeAuditPrivilege. Absent for forced-by-kernel-command-line, which has nothing to add, and for phase2, whose findings are their own peinit.graph.validation.failed records.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.29 peinit.service.abandoned

Peios / Using Peios / Events / Service Events

  • Event type: peinit.service.abandoned
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none
  • Cardinality: once per service abandoned

A service's processes survived SIGKILL and its post-kill timeout, so peinit gave up on them and moved the service to abandoned: its cgroup is still populated, unkillably. Written only on the shutdown path so far; the name also covers an abandonment anywhere else.

Formerly shutdown.abandoned.

8.29.1 Fields #

FieldTypePresenceMeaning
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.
object.cgroup.pathstr.pathrequiredThe cgroup the event is about, as its full path under /sys/fs/cgroup/peinit.
object.service.state-previousstr.enumrequiredThe service's state before the event, with the same values as object.service.state.
object.service.statestr.enumrequiredAlways abandoned.
object.service.transition-causestr.enumrequiredWhy the service's state changed.
object.service.generationuintrequiredThe service's activation generation: a counter peinit advances each time the service enters starting, so that every incarnation of a service has its own number.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

8.30 peinit.service.reload.timed-out

Peios / Using Peios / Events / Service Events

  • Event type: peinit.service.reload.timed-out
  • Defined in: peinit.evman
  • Tier: standard
  • Gating: none — every reload left unconfirmed past its deadline is recorded
  • Cardinality: one record per occurrence

A service announced RELOADING=1 and never confirmed the reload by its deadline: it wedged mid-reload, or lost its handler. Recorded because the default reload does not wait, so nothing else would say so.

Formerly service.reload_unconfirmed.

8.30.1 Fields #

FieldTypePresenceMeaning
object.service.namestrrequiredThe name of the service the event is about, as its definition names it.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.1 peipkg.action.authorised

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.action.authorised
  • Defined in: peipkg.evman
  • Tier: essential
  • Gating: none — every authorisation is recorded
  • Cardinality: once per elevated action put to the operator, and once per stale repository proceeded with

The record that the operator was asked to authorise an elevated action specifically, apart from the routine proceed prompt, and what they answered. outcome.success false means they declined. The routine prompt and its --yes never answer one of these. Asked about several actions, the operator answers them in turn, and the first refusal ends the questions.

stale-trust-state and stale-index are answered by --allow-stale rather than a prompt, so they are only ever recorded as authorised: without the flag the command fails instead, and writes no record of this type.

Replaces peipkg.authorisation.

9.1.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
operation.namestr.enumrequiredWhich elevated action was put to the operator.

Values here (open set): low-trust-provides · foreign-replaces · downgrade · remove-modified-file · stale-trust-state · stale-index.
object.package.namestroptionalThe package the action concerns: the package substituted by provides for low-trust-provides, the successor for foreign-replaces, the package moving backward for downgrade, and the package being uninstalled for remove-modified-file.
object.file.pathstr.pathwhen operation.name == remove-modified-fileThe modified file the uninstall would remove, as the package database records it: absolute within the root peipkg operated on.
object.repository.namestroptionalThe repository, for stale-trust-state and stale-index.
outcome.successboolrequiredFalse when the operator declined. For remove-modified-file, keeping the file and aborting the transaction both decline the removal.
outcome.detailstroptionalThe action as it was put to the operator.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.2 peipkg.claim.changed

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.claim.changed
  • Defined in: peipkg.evman
  • Tier: standard
  • Gating: none
  • Cardinality: once per claim grant or revoke

The record that peipkg granted a role to a package or revoked it, or tried to and failed. A grant names the new holder; a revoke leaves object.claim.holder out. A change the operator declines at the proceed prompt writes nothing.

Replaces peipkg.claim.

9.2.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
transaction.iduintoptionalThe transaction the operation belonged to, registry or package.
object.claim.rolestrrequiredThe role a claim event changed the holder of.
object.claim.holderstroptionalThe package that holds object.claim.role after the event, by name.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseWhy the operation resolved the way it did.

Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed.
outcome.detailstroptionalFree text about the outcome, for a person to read.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.3 peipkg.package.installed

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.package.installed
  • Defined in: peipkg.evman
  • Tier: essential
  • Gating: none — every installation is recorded
  • Cardinality: once per package a transaction installs; once per named package on a rejected request

The record that peipkg installed a package, or tried to and failed. A transaction writes one record for each package its plan installs, whichever command ran it: an upgrade that pulls in a new dependency writes this event for the dependency, and undoing an uninstall writes it for the package restored. A request refused before any transaction opened writes one failed record for each package it named.

Essential because a package installation changes what the system runs, and it is rare. Replaces peipkg.install, and the install half of peipkg.transaction-failed.

9.3.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe operator: the user SID of the token peipkg ran under. This is peipkg's own word; the kernel-stamped emitter.token.guid is the identity it cannot forge.
transaction.iduintoptionalThe peipkg transaction, for every record of one transaction. Absent when the request was refused before a transaction opened, or when a cross-root transaction failed while preparing its roots. In a cross-root transaction, the transaction of the root this package is installed in.
object.package.namestroptionalAbsent only on a refused request that named no package.
object.package.versionstroptionalThe version installed. Absent on a refused request that named no version.
object.package.architecturestroptionalThe architecture of the package an event is about: an identifier of PSPU §5.8, such as x86_64, aarch64 or noarch.
source.repository.namestroptionalAbsent for an install from a local file.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falsepeipkg's stable error code for the failure, the one its driven mode reports. Whether anything was rolled back follows from transaction.id: a failure with one was rolled back, a failure without one was refused before it began.

Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed.
outcome.detailstroptionalThe error as peipkg reported it to the operator. Absent on success.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.4 peipkg.package.uninstalled

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.package.uninstalled
  • Defined in: peipkg.evman
  • Tier: essential
  • Gating: none — every uninstallation is recorded
  • Cardinality: once per package a transaction removes; once per named package on a rejected request

The record that peipkg removed a package, or tried to and failed. A transaction writes one record for each package its plan removes, including a package removed to resolve a conflict during an install, and a package removed by undoing its install.

Replaces peipkg.uninstall, and the uninstall half of peipkg.transaction-failed.

9.4.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
transaction.iduintoptionalAbsent when the request was refused before a transaction opened.
object.package.namestrrequiredThe name of the package the event is about.
object.package.versionstroptionalThe version removed. Absent on a refused request.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseWhy the operation resolved the way it did.

Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed.
outcome.detailstroptionalFree text about the outcome, for a person to read.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.5 peipkg.package.upgraded

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.package.upgraded
  • Defined in: peipkg.evman
  • Tier: essential
  • Gating: none — every upgrade, downgrade and undo is recorded
  • Cardinality: once per package a transaction moves to another version; once per named package on a rejected request

The record that peipkg moved an installed package to another version, or tried to and failed. A downgrade and an undo are recorded here too: comparing object.package.version with object.package.version-previous by PSPU §5.6 tells which way the package moved. A refused downgrade or undo is recorded here as well, with the version it asked for.

Replaces peipkg.upgrade, and the upgrade half of peipkg.transaction-failed.

9.5.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
transaction.iduintoptionalAbsent when the request was refused before a transaction opened, or when a cross-root transaction failed while preparing its roots.
object.package.namestroptionalAbsent only on a refused request that named no package, such as an upgrade of everything.
object.package.versionstroptionalThe version the package moved to.
object.package.version-previousstroptionalThe version it moved from. Absent on a refused request.
object.package.architecturestroptionalThe architecture of the package an event is about: an identifier of PSPU §5.8, such as x86_64, aarch64 or noarch.
source.repository.namestroptionalAbsent for an upgrade from a local file.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseWhy the operation resolved the way it did.

Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed.
outcome.detailstroptionalFree text about the outcome, for a person to read.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.6 peipkg.repository.added

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.repository.added
  • Defined in: peipkg.evman
  • Tier: essential
  • Gating: none — every repository trust ceremony is recorded
  • Cardinality: once per repository add

The record that peipkg added a repository and established trust in it, or tried to and failed. Adding a repository decides whose packages the system will install, which is why it is essential. A command refused before it names a base URL, such as repo add <name> for a repository with no configuration, writes nothing.

Replaces peipkg.repo-add.

9.6.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
object.repository.namestrrequiredThe repository the event is about, by the name it is configured under.
object.repository.urlstrrequiredThe base URL of the repository the event is about, which is what identifies it (PSPU §5.36).
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseWhy the operation resolved the way it did.

Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed.
outcome.detailstroptionalThe error as peipkg reported it to the operator. Absent on success.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.7 peipkg.repository.reconfigured

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.repository.reconfigured
  • Defined in: peipkg.evman
  • Tier: essential
  • Gating: none — every trust-relevant change is recorded
  • Cardinality: once per changed setting

The record that a repository add changed one of an existing repository's trust-relevant settings. One record for each setting that changed, written after the add's own peipkg.repository.added. The settings are signature_policy, allow_insecure_transport, max_trusted_age_days, min_index_version, max_index_staleness_days and trust_anchors.

Only a change made through the flags of repo add is seen. An operator who edits the repository file directly and re-runs the ceremony leaves nothing to compare.

Replaces peipkg.config-change.

9.7.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
object.repository.namestrrequiredThe repository the event is about, by the name it is configured under.
config.namestrrequiredThe setting's name as written in the repository file.
config.textstrwhen config.name == signature_policyA setting's value in force, where the value is not an integer: a string, or the textual rendering of a value of another registry type.
config.text-previousstrwhen config.name == signature_policyThe text value a change replaced, beside config.text.
config.valueuintoptionalThe setting in force, for every setting except signature_policy: a number of days or an index version as written, 0 for a setting left at its default; 1 or 0 for allow_insecure_transport; for trust_anchors, how many anchors are configured, so replacing one anchor with another records equal counts.
config.value-previousuintoptionalThe setting it replaced, in the same form as config.value.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.8 peipkg.repository.refreshed

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.repository.refreshed
  • Defined in: peipkg.evman
  • Tier: standard
  • Gating: none
  • Cardinality: once per refresh command

The record that peipkg refreshed the metadata of its configured repositories. One refresh covers every repository it was asked to; a failure of one does not stop the others, so a refresh can partly succeed. A refresh that fails before it reaches any repository writes nothing.

Replaces peipkg.refresh.

9.8.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
operation.succeeded-countuintrequiredRepositories refreshed.
operation.failed-countuintrequiredRepositories whose refresh failed.
outcome.successboolrequiredFalse when any repository failed to refresh.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.9 peipkg.repository.removed

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.repository.removed
  • Defined in: peipkg.evman
  • Tier: essential
  • Gating: none — every repository removal is recorded
  • Cardinality: once per repository remove

The record that peipkg removed a repository from its configuration and database, or tried to and failed. Removing a repository that is not configured succeeds.

Replaces peipkg.repo-remove.

9.9.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
object.repository.namestrrequiredThe repository the event is about, by the name it is configured under.
outcome.successboolrequiredWhether the operation succeeded.
outcome.detailstroptionalThe error as peipkg reported it to the operator. Absent on success.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

9.10 peipkg.transaction.recovered

Peios / Using Peios / Events / Package Events

  • Event type: peipkg.transaction.recovered
  • Defined in: peipkg.evman
  • Tier: standard
  • Gating: none
  • Cardinality: once per run of peipkg recover

The record that peipkg recover reconciled interrupted transactions, rolling back each one it found pending, or failed to. Every run writes it, one that found nothing to recover included. An automatic recovery at the start of an ordinary operation does not write it.

Replaces peipkg.recovery.

9.10.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe user SID of the effective token the operation ran under.
operation.succeeded-countuintrequiredInterrupted transactions rolled back, before the failure on a run that failed. Zero when there were none.
outcome.successboolrequiredWhether the operation succeeded.
outcome.detailstroptionalThe error, on a run that failed.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from peipkg.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

10.1 eventd.config.changed

Peios / Using Peios / Events / Event Store Events

  • Event type: eventd.config.changed
  • Defined in: eventd.evman
  • Tier: essential
  • Gating: none — every applied change is recorded
  • Cardinality: once per configuration value whose change was applied

The record that eventd applied a change to one of its configuration values at runtime. A change to retention or to the stores is a change to what the audit trail keeps, which is why this is essential.

Every value eventd reloads at runtime is a REG_DWORD or a REG_QWORD, so each side of a change is an integer or absent. A side is absent when no value is stored, even though eventd's compiled default then applies. A stored value of the wrong type is reported as the expected type, holding the integer eventd actually uses.

Replaces synthetic.config_change (PEI-617). Its values were decimal strings and its absent values nil.

10.1.1 Fields #

FieldTypePresenceMeaning
config.key.pathstrrequiredAlways Machine\System\eventd.
config.namestrrequiredThe name of the configuration value being reported on, within config.key.path.
config.typeuint.enumoptionalAbsent when the change removed the value. Present exactly when config.value is.
config.type-previousuint.enumoptionalAbsent when the value was not set before. Present exactly when config.value-previous is.
config.valueuintoptionalThe value in force after the event.
config.value-previousuintoptionalThe value that was in force before the change.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from eventd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

10.2 eventd.daemon.started

Peios / Using Peios / Events / Event Store Events

  • Event type: eventd.daemon.started
  • Defined in: eventd.evman
  • Tier: essential
  • Gating: none — written on every start
  • Cardinality: once per start of eventd

The record that eventd started, attached to KMES and decided where to resume reading each CPU's ring. Like the other four types eventd writes about itself (eventd.daemon.stopped, eventd.events.lost, eventd.store.quarantined and eventd.config.changed), eventd writes it straight into its event store and never through KMES. It therefore has no event.sequence and no emitter.*: only event.type, event.time (when eventd wrote it) and event.boot.guid.

Essential because the audit store starting is rare, and a start with no matching stop is the evidence that eventd crashed. No emission policy applies to it or to the other four: eventd is their emitter, and an essential type is always written (PGSS §6.9). No KMES event of any of the five types is stored, so event.type alone marks a record eventd wrote.

Replaces synthetic.startup (PEI-617). It carries no boot ID of its own, because that is always the record's event.boot.guid (PEI-1390).

10.2.1 Fields #

FieldTypePresenceMeaning
store.restartedboolrequiredWhether this boot's events were already in the store when eventd started, which is to say eventd had already run during this boot and this start is a restart.
store.shard-countuintrequiredHow many active event-store shards eventd is running with, after resolving its configured shard count.
store.resume.cpusuint[]requiredThe CPUs whose KMES rings eventd resumed reading at startup, one entry per logical CPU in ascending order.
store.resume.sequencesuint[]requiredFor each CPU in store.resume.cpus, the highest event sequence of this boot already committed with no gap before it, which is where eventd resumed reading that CPU's ring.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from eventd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

10.3 eventd.daemon.stopped

Peios / Using Peios / Events / Event Store Events

  • Event type: eventd.daemon.stopped
  • Defined in: eventd.evman
  • Tier: essential
  • Gating: none — written on every graceful shutdown
  • Cardinality: once per graceful shutdown

The record that eventd shut down gracefully, written after it stopped reading the rings and committed everything it had read. A crash writes nothing, which is how a crash is told apart from a shutdown.

Replaces synthetic.shutdown (PEI-617).

10.3.1 Fields #

FieldTypePresenceMeaning
store.committed.cpusuint[]optionalAbsent when eventd could not read its record of what it had committed (PEI-1394), rather than written as zeroes.
store.committed.sequencesuint[]optionalPresent exactly when store.committed.cpus is.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from eventd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

10.4 eventd.events.lost

Peios / Using Peios / Events / Event Store Events

  • Event type: eventd.events.lost
  • Defined in: eventd.evman
  • Tier: essential
  • Gating: none — every gap found is recorded
  • Cardinality: once per contiguous run of missing sequence numbers on one ring

The record that eventd found events missing from a CPU's ring: sequence numbers it never read and never stored. KMES overwrote them before eventd read them, or eventd consumed them while it had nowhere to store them.

event.time is the time of the ring event that revealed the gap, so loss.preceding-time and event.time bound when the lost events were written, and the record sorts beside that event. It is not when eventd noticed, which after a restart can be much later. Where eventd consumed the events itself while it had nowhere to store them, it is the time of the last of them. The record also carries the ring's CPU as event.cpu.

Replaces synthetic.gap (PEI-617). Its cpu_id became buffer.cpu (PEI-1390), and its revealing_timestamp the record's event.time.

10.4.1 Fields #

FieldTypePresenceMeaning
buffer.cpuuintrequiredThe logical CPU whose ring buffer a record concerns.
loss.sequenceuintrequiredThe first sequence number a loss covers.
loss.sequence-lastuintrequiredThe last sequence number of a gap, where loss.sequence is the first.
loss.countuintrequiredThe number of events lost in one occurrence.
loss.preceding-timeuint.timeoptionalThe time of the last record received before a gap, in nanoseconds since the Unix epoch.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from eventd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

10.5 eventd.store.quarantined

Peios / Using Peios / Events / Event Store Events

  • Event type: eventd.store.quarantined
  • Defined in: eventd.evman
  • Tier: essential
  • Gating: none — every quarantine is recorded
  • Cardinality: once per store or shard quarantined

The record that eventd found one of its stores corrupt, moved it aside and started a new one in its place. Whatever the quarantined file held is no longer queryable. This is what an operator alerts on.

It is written only for a quarantine. A store that is full, or a write that fails for any other reason, writes none. The record goes to shard 0, else to the lowest-numbered writable event shard, and never to a failed shard until it has been replaced.

Replaces synthetic.storage_error (PEI-617).

10.5.1 Fields #

FieldTypePresenceMeaning
store.kindstr.enumrequiredWhich of eventd's stores a record is about: the sharded event store, the log store or the metric store.
store.sharduintwhen store.kind == eventAbsent for the log and metric stores, which are not sharded (PEI-1394).
outcome.detailstrrequiredThe error eventd found, as it describes it. Its wording is not stable.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from eventd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

11.1 authd.logon.attempted

Peios / Using Peios / Events / Authentication Events

  • Event type: authd.logon.attempted
  • Defined in: authd.evman
  • Tier: essential
  • Gating: none — every logon that reaches a principal source's question, or is refused before one, is recorded
  • Cardinality: once per LogonStart authd reads; a connection that opens with anything else writes none

The record that something asked authd to sign a principal in, and whether it did. Written once per logon conversation, when it ends: with a token minted and handed over, or with the denial authd sent the originator. Success and failure are one type, so "every failed logon" is one query.

The principal's name is never recorded. On a failure authd does not know who was signing in: a principal source answers "authentication failed" alike for a name it does not hold and for a wrong credential, and the name the originator sent is the caller's input, not an identity. The source's own record, such as lpsd.credential.verified, says what the wire hides. On a success the principal is subject.token.sid.

Essential because a logon is the most important thing an operating system records about who uses it, and a machine signs people in rarely enough for every attempt to be kept.

11.1.1 Fields #

FieldTypePresenceMeaning
source.token.sidbin.sidrequiredThe originator: the principal of the process on the other end of /run/logon.sock that asked for the logon.
source.addressstr.ipoptionalThe remote peer the originator says the logon is for, where it named one and it is an IP address. It is the originator's word, as login -h or sshd passes it; a host name is not recorded.
object.session.logon-typestr.enumrequiredThe logon type the originator asked for, whether or not it was granted.
object.session.auth-packagestroptionalThe principal source authd asked to verify the credential. Absent when the logon was refused before a source was chosen.
subject.token.sidbin.sidwhen outcome.success == trueThe principal signed in: the user SID of the token minted.
object.session.iduint.luidoptionalThe logon session created for the sign-on. Every record of what the principal does in it carries the same value as subject.token.auth-id. Present whenever a token was minted: on a success, and on an undelivered failure.
object.token.iduint.luidoptionalThe token minted for the originator, present exactly when object.session.id is.
outcome.successboolrequiredTrue only when the token reached the originator.
outcome.reasonstr.enumwhen outcome.success == falseThe denial authd sent the originator, in kebab-case, whether authd decided it or relayed it from the source; authentication-failed covers an unknown principal and a wrong credential alike. abandoned is a conversation that ended without a terminal answer, because the originator's or the source's connection failed. undelivered is a token minted that could not be handed over; its session is reaped once nothing holds it.

Values here (open set): malformed-request · unsupported-version · permission-denied · authentication-failed · logon-type-not-permitted · account-restricted · authority-unavailable · conversation-limit · internal · abandoned · undelivered.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from authd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

11.2 authd.service.attested

Peios / Using Peios / Events / Authentication Events

  • Event type: authd.service.attested
  • Defined in: authd.evman
  • Tier: standard
  • Gating: none — every service attestation that names a service is recorded
  • Cardinality: once per ServiceAttest authd reads

The record that the service manager asked authd for a service's token, with no credential behind it, and whether authd minted one. The service manager is PID 1 running as SYSTEM, and authd takes the service name on its word, because the process the token is for does not exist yet (PGSS Logon §2.19).

Standard rather than essential because every service with an identity other than SYSTEM is attested on every start, so a machine writes these in proportion to its service restarts.

11.2.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe principal that asked: the user SID of the peer's token, SYSTEM for the service manager.
object.service.namestroptionalThe service the token is for, as the service manager named it. Absent only when the request named no service.
object.token.sidbin.sidoptionalThe identity attested: the service's virtual account, a built-in service identity such as LocalService, or a principal designated for service logon. Present whenever a token was minted: on a success, and on an undelivered failure.
object.session.iduint.luidoptionalThe logon session created for the service, present exactly when object.token.sid is.
object.token.iduint.luidoptionalThe token minted, present exactly when object.token.sid is.
object.token.privilegesuint.flagsoptionalThe privileges local policy granted the token, all of them enabled. Present exactly when object.token.sid is.
outcome.successboolrequiredTrue only when the token reached the service manager.
outcome.reasonstr.enumwhen outcome.success == falseThe denial authd sent. permission-denied is a peer that is not the service manager; account-restricted an identity no source holds, or one not designated for service logon, which authd does not tell apart; undelivered a token minted that could not be handed over.

Values here (open set): permission-denied · malformed-request · account-restricted · internal · undelivered.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from authd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

11.3 authd.session.ended

Peios / Using Peios / Events / Authentication Events

  • Event type: authd.session.ended
  • Defined in: authd.evman
  • Tier: essential
  • Gating: none — every session end authd carries out is recorded; a refused request and a query are not
  • Cardinality: once per SessionEnd authd acts on

The record that authd ended a logon session at someone's request, by ending every process whose primary token belongs to it (PGSS Logon §2.22). The kernel destroys the session when the last reference drops, and records that as kacs.session.destroyed; this record adds who asked, which the kernel cannot know.

A refusal is not recorded here. Who may end another principal's session is decided by an access check against the SessionEndSecurity descriptor, which KACS records as kacs.audit.access.checked with object.kind authd-session-end when the descriptor's SACL asks it to.

Essential because ending somebody's session is rare and is an administrative act on another principal.

11.3.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe principal that asked: themselves, signing out, or someone the descriptor permits to end other principals' sessions.
object.session.iduint.luidrequiredThe LUID of the logon session the operation acted on.
object.session.user.sidbin.sidrequiredWhose session it was.
object.session.logon-typestr.enumrequiredWhat kind of logon the session represents, from the KACS_LOGON_TYPE_* values in uapi/pkm/token.h.
outcome.successboolrequiredTrue when no process was left holding the session.
outcome.reasonstr.enumwhen outcome.success == falseSome processes survived every round, or could not be examined. The session lives on until they exit.

Values here (open set): processes-remaining.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from authd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.1 lpsd.account.created

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.account.created
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every request to create an account is recorded
  • Cardinality: once per request

The record that an administrator created a local account with lps, or tried to. The first account on a new machine is created this way too, by the boot-time service that provisions it.

Essential because a new account is a new way in, and it is rare.

12.1.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe administrator: the user SID of the token that asked.
object.account.sidbin.sidwhen outcome.success == trueThe new account.
outcome.successboolrequiredTrue once the account is durable.
outcome.reasonstr.enumwhen outcome.success == falseThe failure lps was told: not-found names a group that does not exist, exists an account name already in use, invalid a value the store refuses, not-saved a change that could not be made durable.

Values here (open set): not-found · exists · invalid · internal · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.2 lpsd.account.deleted

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.account.deleted
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every request to delete an account is recorded
  • Cardinality: once per request

The record that an administrator deleted a local account with lps, or tried to.

Essential because deleting an account is irreversible and rare: its SID is never issued again, and every descriptor naming it names nobody.

12.2.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe administrator.
object.account.sidbin.sidoptionalThe account. Absent when no account had the name asked for.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseinvalid is a deletion the store refuses, such as of the last administrator.

Values here (open set): not-found · invalid · internal · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.3 lpsd.account.modified

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.account.modified
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every administrative change to an account, and every change of one's own display name, is recorded; a request that changes nothing is not
  • Cardinality: once per request that changes something or fails

The record that an account was changed: by an administrator with lps, or by the principal themselves where the self socket allows it. Which change it was is operation.name.

A request that would leave the account as it was, such as enabling an enabled account, changes nothing and writes no record.

Essential because an account's settings decide who can sign in and as what, and they change rarely.

12.3.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe principal that asked: an administrator, or the account itself for set-display-name.
object.account.sidbin.sidoptionalThe account changed. Absent when no account had the name asked for.
object.group.sidbin.sidoptionalFor set-primary-group, the group made the account's primary group.
operation.namestr.enumrequiredThe change, as lps names its command. set-display-name is the principal's own, through the self socket.

Values here (open set): set-enabled · set-password · set-profile · set-display-name · set-primary-group · set-claim · remove-claim · rename · set-logon-types · key-add · key-remove · set-credential-policy.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falsedenied is a disabled account changing its own display name.

Values here (open set): not-found · exists · invalid · internal · denied · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.4 lpsd.credential.changed

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.credential.changed
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every change of an account's own credential is recorded, and every refusal once the account is known
  • Cardinality: once per change conversation that reaches the account

The record that a principal changed their own password, or added or removed one of their own SSH keys, through authd (PSPU §2.21, §2.23), or tried to and was refused. A change an administrator makes with lps is lpsd.account.modified.

Essential because a changed credential is how an account changes hands, and it is rare.

12.4.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe principal that asked, as authd vouched for them from their token. The same SID as object.account.sid: only one's own credential can be changed this way.
object.account.sidbin.sidrequiredThe SID of the account a record is about: a principal a principal source holds, whose credential was checked or changed, or which was created, deleted or modified.
operation.namestr.enumrequiredWhich operation was attempted.

Values here (open set): password · ssh-key-added · ssh-key-removed.
outcome.successboolrequiredTrue once the change is durable.
outcome.reasonstr.enumwhen outcome.success == falseno-credential is an account with no password to prove itself with; superseded a password that changed between the rounds of the conversation; rejected a new password or key the store refused; conversation-limit too many unusable new passwords; not-saved a change the store could not make durable, so it was not applied.

Values here (open set): no-such-account · disabled · no-credential · wrong-credential · superseded · rejected · conversation-limit · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.5 lpsd.credential.verified

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.credential.verified
  • Defined in: lpsd.evman
  • Tier: standard
  • Gating: none — every credential lpsd checks for a logon is recorded
  • Cardinality: once per logon lpsd decides; probing which SSH keys an account would accept writes none

The record that lpsd checked a credential for a logon authd relayed to it, and what it found. It says what the wire must not: authd and the originator are told only "authentication failed" whether the account does not exist or the credential was wrong, and outcome.reason here tells them apart for whoever may read the audit trail.

The account is named by SID when it exists. The name the caller typed is never recorded, so a failure against a name lpsd does not hold carries no account at all; authd.logon.attempted is the same logon as the authority saw it.

Standard rather than essential because a machine exposed to a network can be asked to check credentials far more often than it signs anyone in.

12.5.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredlpsd itself, the principal that checked the credential: the user SID of lpsd's own token, which is its service account.
object.account.sidbin.sidoptionalThe account the credential was checked for. Absent when lpsd holds no account by the name it was asked about.
operation.namestr.enumrequiredWhat was checked. none is an account whose policy is that it signs in with no credential, asserted without asking for one.

Values here (open set): password · ssh-key · none.
outcome.successboolrequiredTrue when lpsd told authd who the principal is.
outcome.reasonstr.enumwhen outcome.success == falsenot-permitted is an account whose credential policy does not allow the kind of credential offered, or a key the account does not hold.

Values here (open set): no-such-account · wrong-credential · disabled · not-permitted.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.6 lpsd.group.created

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.group.created
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every request to create a group is recorded
  • Cardinality: once per request

The record that an administrator created a local group with lps, or tried to.

Essential because groups are what descriptors grant to, and they are created rarely.

12.6.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe administrator.
object.group.sidbin.sidwhen outcome.success == trueThe new group.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseWhy the operation resolved the way it did.

Values here (open set): exists · invalid · internal · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.7 lpsd.group.deleted

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.group.deleted
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every request to delete a group is recorded
  • Cardinality: once per request

The record that an administrator deleted a local group with lps, or tried to.

Essential because deleting a group removes every grant made to it, and it is rare.

12.7.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe administrator.
object.group.sidbin.sidoptionalThe group. Absent when no group had the name asked for.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseWhy the operation resolved the way it did.

Values here (open set): not-found · invalid · internal · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.8 lpsd.group.member.added

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.group.member.added
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every request to add a membership is recorded; one that already held is not
  • Cardinality: once per request that changes something or fails

The record that an administrator added an account to a group with lps, or tried to. The group may be a well-known one: adding an account to BUILTIN\Administrators is recorded here.

Essential because a membership is a grant of everything granted to the group, and memberships change rarely.

12.8.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe administrator.
object.account.sidbin.sidoptionalThe account. Absent when no account had the name asked for.
object.group.sidbin.sidoptionalThe group. Absent when no group had the name asked for.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseWhy the operation resolved the way it did.

Values here (open set): not-found · invalid · internal · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

12.9 lpsd.group.member.removed

Peios / Using Peios / Events / Local Principal Events

  • Event type: lpsd.group.member.removed
  • Defined in: lpsd.evman
  • Tier: essential
  • Gating: none — every request to remove a membership is recorded; one that did not hold is not
  • Cardinality: once per request that changes something or fails

The record that an administrator removed an account from a group with lps, or tried to.

Essential for the reason lpsd.group.member.added is: a membership is a grant, and taking one away is as much an access change as giving it.

12.9.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidrequiredThe administrator.
object.account.sidbin.sidoptionalThe account. Absent when no account had the name asked for.
object.group.sidbin.sidoptionalThe group. Absent when no group had the name asked for.
outcome.successboolrequiredWhether the operation succeeded.
outcome.reasonstr.enumwhen outcome.success == falseinvalid includes removing the last administrator from BUILTIN\Administrators.

Values here (open set): not-found · invalid · internal · not-saved.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from lpsd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

13.1 timed.clock.stepped

Peios / Using Peios / Events / Time Events

  • Event type: timed.clock.stepped
  • Defined in: timed.evman
  • Tier: essential
  • Gating: none — every step timed makes is recorded
  • Cardinality: one record per occurrence

timed moved the system clock at once by an arbitrary amount, rather than adjusting its rate. Every timestamp written after this record is on the new clock, including the times of every other event in the store, so this is the record that explains a jump in them.

timed slews small errors by adjusting the clock's rate after each poll, and those corrections are not recorded. Only a step is.

13.1.1 Fields #

FieldTypePresenceMeaning
operation.namestr.enumrequiredWhy timed stepped the clock. automatic is its own decision: its sources agreed the clock was further off than it is willing to slew. manual is a request on its control socket (clock set), which timed accepts only while Automatic is 0. boot-floor is the clock raised to the build's timestamp at startup, because it read earlier than that; the real time is not yet known when this is written.

Values here (closed set): automatic · manual · boot-floor.
clock.timeuint.timerequiredNever before the build's timestamp: timed refuses a step that would land there.
clock.time-previousuint.timeoptionalThe wall clock's reading just before timed moved it, the counterpart of clock.time.
subject.token.sidbin.sidrequiredThe principal that acted. On a manual step, the user of the token that asked for the clock to be set; timed refuses a request whose user it cannot read. On an automatic step and the boot-floor, which timed decides on its own authority, timed's own user: its service SID. Search operation.name, not this field, to tell timed's own steps from a person's.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from timed.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

14.1 netd.hostname.changed

Peios / Using Peios / Events / Network Configuration Events

  • Event type: netd.hostname.changed
  • Defined in: netd.evman
  • Tier: essential
  • Gating: none — every change netd makes to the kernel's hostname is recorded
  • Cardinality: one record per occurrence

netd changed the machine's hostname. The name is what other machines, log lines and certificate requests know the machine by, so a change of it is always recorded.

netd takes the name from Machine\System\Network Hostname, or else from a lease that offers one where the interface's profile accepts it, and passes it to the kernel. A call that leaves the kernel's name as it was, as when netd restarts on a machine that already has the name, records nothing. A name the kernel refuses is not a change and is not recorded.

14.1.1 Fields #

FieldTypePresenceMeaning
config.namestrrequiredAlways Hostname, the setting the name is held in, whether the value in force came from the registry or from a lease.
config.textstrrequiredThe name now in force, as netd passed it to the kernel.
config.text-previousstroptionalThe kernel's name just before the change, as the kernel held it. On the first change after boot this is the kernel's own (none). Absent when it could not be read.
subject.token.sidbin.sidrequiredThe principal that acted. When the change was made during the pass a reconcile request on netd's control socket asked for, the user of the requester's token; netd refuses a request whose user it cannot read. Otherwise netd changed the name on its own authority, after the registry value changed, when a lease arrived or at startup, and this is netd's own user, SYSTEM. Who wrote the registry value is LCS's to record, where the key's SACL audits the write.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from netd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

15.1 trustd.root.added

Peios / Using Peios / Events / Trust Events

  • Event type: trustd.root.added
  • Defined in: trustd.evman
  • Tier: standard
  • Gating: none — every root that enters the set in force is recorded
  • Cardinality: one per root that entered the set

A root certificate authority entered the set this machine trusts. trustd recomposes the set whenever the registry's additions or distrusts change, or the shipped bundle is replaced, and writes one record for each root that is in the new set and was not in the one before: an addition, a distrust lifted, or a root a bundle upgrade brought in.

The set trustd composes when it starts is the baseline these records count from, and is not recorded. A change made while trustd was not running is seen only as part of that baseline.

No subject. PGSS §6.4 asks an event about an action for the principal that acted, and the action here is not trustd's: trustd only recomposes the set from what others decided, and it is never told who they were. The principal that acted is whoever wrote the addition or the distrust, which the registry records (LCS, where the key is audited), or whoever upgraded the bundle, which peipkg records. Naming trustd's own SID instead would answer "who distrusted this root?" with trustd, which is wrong. The writer is on the registry's record of the write under Machine\System\Trust\Certificates, just before this one.

15.1.1 Fields #

FieldTypePresenceMeaning
object.certificate.digestbinrequiredThe SHA-256 digest of the certificate's DER encoding: its fingerprint, the name a distrust gives it and the one trust list prints, carried as 32 bytes rather than as hexadecimal.
object.certificate.namestrrequiredThe certificate's subject distinguished name, in the form trust show prints it, such as CN=DigiCert TLS ECC P384 Root G5,O=DigiCert\, Inc.,C=US.
object.certificate.purposesstr.enum[]requiredThe purposes the root is trusted for now.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from trustd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

15.2 trustd.root.distrusted

Peios / Using Peios / Events / Trust Events

  • Event type: trustd.root.distrusted
  • Defined in: trustd.evman
  • Tier: standard
  • Gating: none — every root a distrust takes out of the set in force is recorded
  • Cardinality: one per root that left the set

A distrust took a root certificate authority out of the set this machine trusts. A distrust applies to shipped roots and to additions alike. A distrust naming a certificate the machine does not have takes nothing out and writes no record; if that certificate arrives later it is refused, and never enters the set to leave it.

No subject, as for trustd.root.added.

15.2.1 Fields #

FieldTypePresenceMeaning
object.certificate.digestbinrequiredThe SHA-256 digest of the certificate's DER encoding: its fingerprint, the name a distrust gives it and the one trust list prints, carried as 32 bytes rather than as hexadecimal.
object.certificate.namestrrequiredThe certificate's subject distinguished name, in the form trust show prints it, such as CN=DigiCert TLS ECC P384 Root G5,O=DigiCert\, Inc.,C=US.
object.certificate.purposesstr.enum[]requiredThe purposes the root was trusted for until it was distrusted.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from trustd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

15.3 trustd.root.removed

Peios / Using Peios / Events / Trust Events

  • Event type: trustd.root.removed
  • Defined in: trustd.evman
  • Tier: standard
  • Gating: none — every root that leaves the set in force, other than by distrust, is recorded
  • Cardinality: one per root that left the set

A root certificate authority left the set this machine trusts, and no distrust names it: its addition was withdrawn, or a bundle upgrade dropped it. A root that leaves because it was distrusted is trustd.root.distrusted instead.

No subject, as for trustd.root.added.

15.3.1 Fields #

FieldTypePresenceMeaning
object.certificate.digestbinrequiredThe SHA-256 digest of the certificate's DER encoding: its fingerprint, the name a distrust gives it and the one trust list prints, carried as 32 bytes rather than as hexadecimal.
object.certificate.namestrrequiredThe certificate's subject distinguished name, in the form trust show prints it, such as CN=DigiCert TLS ECC P384 Root G5,O=DigiCert\, Inc.,C=US.
object.certificate.purposesstr.enum[]requiredThe purposes the root was trusted for until it left.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from trustd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

16.1 gxwid.certificate.renewed

Peios / Using Peios / Events / Desktop Server Events

  • Event type: gxwid.certificate.renewed
  • Defined in: gxwid.evman
  • Tier: essential
  • Gating: none — every renewal of the machine's GXWI certificate is recorded
  • Cardinality: once per renewal, which is about once a year

gxwid made the machine a new certificate for its GXWI key and serves it from now on, in place of the one before. A certificate lasts a year and is renewed once fewer than 30 days of it remain, which gxwid looks for as it starts, once a day, and when it is reloaded; one made by an older gxwid that lasts longer, or one not valid yet, is renewed at the first look.

The key is the same, so the machine's identity is: what changes is the certificate's fingerprint, which a browser that trusted the old certificate does not know. Everyone who reaches the desktop is shown the browser's warning once more, and anyone who imported the old certificate imports the new one, /var/state/gxwi/certificate.pem. This record says which fingerprint they should now see.

Essential because it changes what everyone who connects is shown, and is rare. The new certificate is served to every connection made after it; those already made, and everyone signed in, carry on.

No subject: gxwid renews the certificate of its own accord, on time.

16.1.1 Fields #

FieldTypePresenceMeaning
object.certificate.digestbinrequiredThe new certificate's SHA-256 digest.
object.certificate.digest-previousbinrequiredThe SHA-256 digest of the DER encoding of the certificate this one replaced: its fingerprint, as 32 bytes, in the form of object.certificate.digest.
object.certificate.namestrrequiredThe new certificate's subject, CN= the machine's name when it was made and O=Peios.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from gxwid.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

17.1 Watch Records

Peios / Using Peios / Events / Registry Watch Records

Watch records are not KMES events. They are binary records read from a key file descriptor with read(), and they exist to tell a watcher that something under a key changed.

They are documented here because an operator asking what the registry reports would otherwise miss them, but nothing else in this book applies to them: no msgpack, no envelope, no identity stamps, no audit meaning.

17.1.1 Reading #

A single read() returns as many complete records as fit in the caller's buffer. A record is never split across two calls.

If the buffer cannot hold even the first queued record, read() fails with EINVAL — the buffer is too small to make progress, and the caller retries with a larger one. On an armed fd with an empty queue, read() blocks, or returns EAGAIN under O_NONBLOCK.

Only records copied out in full are dequeued.

17.1.2 Layout #

Every record begins with the same four fields.

OffsetSizeField
04total_len
42event_type
62name_len
8name_lenname, UTF-8

All integers are little-endian. total_len is the whole record including this header, it is how a consumer advances to the next record, and it is the only safe way to do so.

17.1.3 Subtree watches carry a path #

A subtree watch's records carry additional fields after the name, locating the key the change happened on relative to the watched key.

SizeField
2path_depth
2 + n eachpath_components: a u16 length, then that many UTF-8 bytes

path_depth is the number of components from the watched key down to the changed key. Zero means the change was on the watched key itself.

The components are length-prefixed rather than joined by a separator because registry names can contain any Unicode character and value names can contain backslashes. A concatenated path string would be ambiguous.

OVERFLOW records are emitted in the bare eight-byte form, with no path even on a subtree watch — there is no single key to name when the queue itself overflowed.

The header offsets are ABI, named in uapi/pkm/lcs.h and listed in the Peios Kernel TRM §5.A.

Appendix A All Event Types

Peios / Using Peios / Events

Every event type in the evman catalogue, generated from the fragments by pkm/tools/gen-events-book.py: 101 event types and 594 fields, from kacs.evman, kernel.evman, kmes.evman, lcs.evman, ntfe.evman, stratafs.evman, peinit.evman, peipkg.evman, eventd.evman, authd.evman, lpsd.evman, timed.evman, netd.evman, trustd.evman, gxwid.evman.

The tier sets whether an event type is recorded by default (PGSS §6.8). Each type links to its page; each page's fields link to the field index.

A.1 Access and Identity Events #

Event typeTierFragmentSummary
kacs.audit.access.checkedessentialkacs.evmanThe record that an access check completed, and what it decided.
kacs.audit.descriptor.changedessentialkacs.evmanThe record that a caller changed, or was authorised to change and failed to change, the security descriptor of a file, a token, a process or a System V IPC object.
kacs.audit.handle.usedessentialkacs.evmanThe record of what was done with a handle after it was opened.
kacs.audit.privilege.usedessentialkacs.evmanThe record that a privilege was spent.
kacs.caap.policy.changedessentialkacs.evmanThe record that a central access policy was installed, replaced or removed.
kacs.caap.sacl.skippedstandardkacs.evmanThe record that a central access policy rule's SACL could not be parsed or evaluated, so the audit it asked for was skipped.
kacs.caap.staging.divergedstandardkacs.evmanThe record that a staged central access policy would have decided an access differently from the policy in force.
kacs.config.value.rejectedessentialkacs.evmanThe record that KACS read one of its registry-held tables, rejected it, and carried on with what it had.
kacs.descriptor.rejectedstandardkacs.evmanThe record that KACS read an object's stored security descriptor, found it corrupt, and refused to use it.
kacs.impersonation.revertedverbosekacs.evmanThe record that a thread stopped impersonating and acts as its own token again.
kacs.impersonation.startedstandardkacs.evmanThe record that a thread took on, or tried to take on, a client's identity by impersonating its token.
kacs.mount.policy.changedessentialkacs.evmanThe record that a filesystem's KACS mount policy was set: what happens to an object on it that has no stored descriptor.
kacs.session.destroyedessentialkacs.evmanThe record that a logon session ended because its last token went away.
kacs.signature.crypto.failedessentialkacs.evmanThe record that the machinery for verifying signed executables cannot run.

A.2 Filesystem Events #

Event typeTierFragmentSummary
stratafs.file.copied-upstandardstratafs.evmanThe record that StrataFS materialised an object into a writable stratum, successful or not.
stratafs.mutation.refusedstandardstratafs.evmanThe record that a mutation was refused because of how the mount is arranged, rather than because of an access check.

A.3 Registry Events #

Event typeTierFragmentSummary
lcs.audit.backup.endedessentiallcs.evmanThe record that a registry subtree backup finished, successfully or otherwise.
lcs.audit.backup.startedessentiallcs.evmanThe record that a registry subtree backup began, emitted before any data is read.
lcs.audit.key.createdessentiallcs.evmanThe record that a registry key was created.
lcs.audit.key.deletedessentiallcs.evmanThe record that a registry key was deleted from a layer through its own handle, or that an attempt failed.
lcs.audit.key.descriptor.changedessentiallcs.evmanThe record that a registry key's security descriptor was changed through a key handle, or that an attempt failed.
lcs.audit.key.hiddenessentiallcs.evmanThe record that a registry key was hidden in a layer through its own handle, or that an attempt failed.
lcs.audit.key.openedessentiallcs.evmanThe record that a registry key was opened and what access the open received.
lcs.audit.key.tombstonedessentiallcs.evmanThe record that a key's blanket tombstone was set or cleared in a layer, or that an attempt failed.
lcs.audit.restore.endedessentiallcs.evmanThe record that a registry subtree restore finished, successfully or otherwise.
lcs.audit.restore.startedessentiallcs.evmanThe record that a registry subtree restore began, emitted before any state is modified.
lcs.audit.transaction.committedessentiallcs.evmanThe record of how a registry transaction ended, written for a transaction that staged at least one write some other record covers.
lcs.audit.value.deletedessentiallcs.evmanThe record that a registry value was deleted through a key handle, or that an attempt to delete one failed.
lcs.audit.value.setessentiallcs.evmanThe record that a registry value was written through a key handle, or that an attempt to write one failed.
lcs.config.value.rejectedessentiallcs.evmanThe record that LCS read one of its own configuration values, rejected it, and carried on with what it had.
lcs.source.response.rejectedessentiallcs.evmanThe record that LCS rejected data a registry source sent it.

A.4 Event Stream Events #

Event typeTierFragmentSummary
kmes.buffer.swap.failedstandardkmes.evmanThe record that KMES could not resize its per-CPU ring buffers and kept the capacity it had.
kmes.config.appliedstandardkmes.evmanThe record that KMES read its configuration key and committed what it found.
kmes.config.refresh.failedessentialkmes.evmanThe record that KMES could not read one of its configuration keys and kept running on what it had.
kmes.config.value.rejectedessentialkmes.evmanThe record that KMES read a configuration value, rejected it, and carried on with what it had.

A.5 Network Policy Events #

Event typeTierFragmentSummary
ntfe.policy.publishedstandardntfe.evmanThe record that a new generation of traffic rules went into force.
ntfe.policy.rejectedessentialntfe.evmanThe record that the kernel read a traffic policy and refused it, so the policy an administrator wrote is not the policy in force.
ntfe.verdict.reportedessentialntfe.evmanThe record of a traffic policy decision that a rule explicitly asked to be reported.

A.6 Service Events #

Event typeTierFragmentSummary
peinit.boot.downgradedessentialpeinit.evmanA full boot was downgraded to safe mode: the machine is running a reduced service set.
peinit.cgroup.leakedstandardpeinit.evmanA cgroup could not be reclaimed: its processes do not respond to the kernel, and the cgroup is leaked.
peinit.config.reload.appliedstandardpeinit.evmanA configuration reload ran: from now on the registry as it then stood is the running configuration, or, if it failed, nothing changed.
peinit.config.reload.deferredverbosepeinit.evmanA configuration reload during the boot window changed definitions of services the boot plan had not yet launched.
peinit.critical-service.failedessentialpeinit.evmanA service marked Critical failed, and peinit took the machine to its reboot final action.
peinit.event.droppedessentialpeinit.evmanThe ring refused one of peinit's events, and it is gone.
peinit.fd-store.rejectedstandardpeinit.evmanpeinit refused a file descriptor a service asked it to keep.
peinit.graph.operation.endedverbosepeinit.evmanAn operation that is a member of a graph execution context reached its terminal outcome as the graph sees it: satisfied, so that what depends on it may proceed, or failed.
peinit.graph.validation.failedstandardpeinit.evmanThe service graph failed validation for the reason in outcome.reason.
peinit.graph.validation.warnedstandardpeinit.evmanThe service graph passed validation with a warning: nothing was refused, but something will not behave as its author probably expects.
peinit.internal-error.containedstandardpeinit.evmanpeinit could not carry out a step on a service's behalf, and contained the fault to that service.
peinit.job.createdverbosepeinit.evmanA job exists: peinit has decided to run a process and recorded it, before the process exists.
peinit.job.endedstandardpeinit.evmanA job is over: its process exited or was killed, or the job ended without its process ever starting.
peinit.job.output.droppedstandardpeinit.evmanA submitted job's submitter stopped draining its output, and peinit began dropping the submitter's copy of the job's lines.
peinit.job.startedstandardpeinit.evmanA job's process exists and has been executed: the moment a process is running as object.job.token.sid on peinit's behalf.
peinit.job.status.reportedverbosepeinit.evmanA submitted job reported STATUS= or PROGRESS= on the notification channel, and this is what peinit retained after it.
peinit.notify.errno.reportedstandardpeinit.evmanA service's job sent ERRNO=: its own claim about an error, which peinit neither acts on nor retains.
peinit.notify.exit-status.reportedstandardpeinit.evmanA service's job sent EXIT_STATUS=, informationally; it is not the exit of any process.
peinit.notify.progress.reportedverbosepeinit.evmanA service's job sent PROGRESS= or PROGRESS_UNIT=, and this is the progress peinit retained after it.
peinit.notify.rejectedstandardpeinit.evmanpeinit refused a datagram on the notification channel and applied none of it: the sender could not be authenticated, the message did not parse, or it made no sense for the job's state.
peinit.notify.status.reportedverbosepeinit.evmanA service's job sent STATUS= on the notification channel.
peinit.notify.stopping.reportedstandardpeinit.evmanA service's job sent STOPPING=1, so peinit will not send it SIGTERM.
peinit.on-failure.suppressedstandardpeinit.evmanpeinit declined to start an OnFailure handler, because starting it would have looped or gone too deep, so the failure it was meant to handle went unhandled.
peinit.operation.endedstandardpeinit.evmanAn operation reached a terminal state other than merged: it completed, failed, was cancelled while still pending, or was aborted while running.
peinit.operation.mergedverbosepeinit.evmanAn operation was absorbed into another before it ran, and has no outcome of its own: follow object.operation.merged-into.guid to the operation whose peinit.operation.ended decides it.
peinit.operation.requestedstandardpeinit.evmanAn operation on a service — a start, stop, restart, reload or reset — was created.
peinit.operation.startedverbosepeinit.evmanAn operation left the queue and began to run.
peinit.recovery.enteredessentialpeinit.evmanpeinit dropped the machine to a recovery shell, for the reason in outcome.reason.
peinit.service.abandonedstandardpeinit.evmanA service's processes survived SIGKILL and its post-kill timeout, so peinit gave up on them and moved the service to abandoned: its cgroup is still populated, unkillably.
peinit.service.reload.timed-outstandardpeinit.evmanA service announced RELOADING=1 and never confirmed the reload by its deadline: it wedged mid-reload, or lost its handler.

A.7 Package Events #

Event typeTierFragmentSummary
peipkg.action.authorisedessentialpeipkg.evmanThe record that the operator was asked to authorise an elevated action specifically, apart from the routine proceed prompt, and what they answered.
peipkg.claim.changedstandardpeipkg.evmanThe record that peipkg granted a role to a package or revoked it, or tried to and failed.
peipkg.package.installedessentialpeipkg.evmanThe record that peipkg installed a package, or tried to and failed.
peipkg.package.uninstalledessentialpeipkg.evmanThe record that peipkg removed a package, or tried to and failed.
peipkg.package.upgradedessentialpeipkg.evmanThe record that peipkg moved an installed package to another version, or tried to and failed.
peipkg.repository.addedessentialpeipkg.evmanThe record that peipkg added a repository and established trust in it, or tried to and failed.
peipkg.repository.reconfiguredessentialpeipkg.evmanThe record that a repository add changed one of an existing repository's trust-relevant settings.
peipkg.repository.refreshedstandardpeipkg.evmanThe record that peipkg refreshed the metadata of its configured repositories.
peipkg.repository.removedessentialpeipkg.evmanThe record that peipkg removed a repository from its configuration and database, or tried to and failed.
peipkg.transaction.recoveredstandardpeipkg.evmanThe record that peipkg recover reconciled interrupted transactions, rolling back each one it found pending, or failed to.

A.8 Event Store Events #

Event typeTierFragmentSummary
eventd.config.changedessentialeventd.evmanThe record that eventd applied a change to one of its configuration values at runtime.
eventd.daemon.startedessentialeventd.evmanThe record that eventd started, attached to KMES and decided where to resume reading each CPU's ring.
eventd.daemon.stoppedessentialeventd.evmanThe record that eventd shut down gracefully, written after it stopped reading the rings and committed everything it had read.
eventd.events.lostessentialeventd.evmanThe record that eventd found events missing from a CPU's ring: sequence numbers it never read and never stored.
eventd.store.quarantinedessentialeventd.evmanThe record that eventd found one of its stores corrupt, moved it aside and started a new one in its place.

A.9 Authentication Events #

Event typeTierFragmentSummary
authd.logon.attemptedessentialauthd.evmanThe record that something asked authd to sign a principal in, and whether it did.
authd.service.attestedstandardauthd.evmanThe record that the service manager asked authd for a service's token, with no credential behind it, and whether authd minted one.
authd.session.endedessentialauthd.evmanThe record that authd ended a logon session at someone's request, by ending every process whose primary token belongs to it (PGSS Logon §2.22).

A.10 Local Principal Events #

Event typeTierFragmentSummary
lpsd.account.createdessentiallpsd.evmanThe record that an administrator created a local account with lps, or tried to.
lpsd.account.deletedessentiallpsd.evmanThe record that an administrator deleted a local account with lps, or tried to.
lpsd.account.modifiedessentiallpsd.evmanThe record that an account was changed: by an administrator with lps, or by the principal themselves where the self socket allows it.
lpsd.credential.changedessentiallpsd.evmanThe record that a principal changed their own password, or added or removed one of their own SSH keys, through authd (PSPU §2.21, §2.23), or tried to and was refused.
lpsd.credential.verifiedstandardlpsd.evmanThe record that lpsd checked a credential for a logon authd relayed to it, and what it found.
lpsd.group.createdessentiallpsd.evmanThe record that an administrator created a local group with lps, or tried to.
lpsd.group.deletedessentiallpsd.evmanThe record that an administrator deleted a local group with lps, or tried to.
lpsd.group.member.addedessentiallpsd.evmanThe record that an administrator added an account to a group with lps, or tried to.
lpsd.group.member.removedessentiallpsd.evmanThe record that an administrator removed an account from a group with lps, or tried to.

A.11 Time Events #

Event typeTierFragmentSummary
timed.clock.steppedessentialtimed.evmantimed moved the system clock at once by an arbitrary amount, rather than adjusting its rate.

A.12 Network Configuration Events #

Event typeTierFragmentSummary
netd.hostname.changedessentialnetd.evmannetd changed the machine's hostname.

A.13 Trust Events #

Event typeTierFragmentSummary
trustd.root.addedstandardtrustd.evmanA root certificate authority entered the set this machine trusts.
trustd.root.distrustedstandardtrustd.evmanA distrust took a root certificate authority out of the set this machine trusts.
trustd.root.removedstandardtrustd.evmanA root certificate authority left the set this machine trusts, and no distrust names it: its addition was withdrawn, or a bundle upgrade dropped it.

A.14 Desktop Server Events #

Event typeTierFragmentSummary
gxwid.certificate.renewedessentialgxwid.evmangxwid made the machine a new certificate for its GXWI key and serves it from now on, in place of the one before.

A.15 Not in the catalogue #

The registry's watch records are not events, so no fragment defines them and this table does not list them.

Generated from the evman catalogue by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.1 access.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under access, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.1.1 access.audit-mask #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. Present so an operator can see what else on that handle would fire, which cannot be derived from the intersection alone.

Carried by:

  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.1.2 access.bypass #

  • Type: str.enum
  • Values: priv · si-fromkernel
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Why a signal was delivered with no access check at all. priv is a signal the kernel sent as itself (SEND_SIG_PRIV); si-fromkernel is one whose si_code marks it as kernel-originated. Either is a total bypass of the process-access model, keyed off the signal's origin, so a spoofed origin would be silent; absent when the signal was checked.

Carried by:

No event carries this field yet.

B.1.3 access.decided #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The bits the DACL evaluation reached a conclusion on, granted or denied by an ACE. A requested bit outside this set was never mentioned by any ACE and was denied because nothing granted it — a different finding from an explicit deny, and one access.granted alone cannot show.

Carried by:

No event carries this field yet.

B.1.4 access.default-descriptor #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether an authorisation decision used the compiled-in default security descriptor rather than one an administrator configured. When true, the policy that decided was built into the kernel and is not visible anywhere in the registry. The case that produces it today is a write to the base layer when the base layer has no metadata row of its own.

Carried by:

No event carries this field yet.

B.1.5 access.denied-integrity #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The bits mandatory integrity control denied: the rights the object's mandatory label withholds from a caller of lower integrity, whatever its DACL says. On an access-check record these are the requested bits, or every bit for a MAXIMUM_ALLOWED request, and the field is absent when there were none.

Carried by:

  • kacs.audit.access.checked

B.1.6 access.denied-trust #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The bits the process-trust label denied: the rights the object's trust label withholds from a caller whose PIP does not dominate it. Read as access.denied-integrity is, and can be non-zero in the same evaluation.

Carried by:

  • kacs.audit.access.checked

B.1.7 access.disallowed #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The requested bits that fall outside the set the operation permits at all, whatever the descriptor says. Such a request is refused before any access check.

Carried by:

No event carries this field yet.

B.1.8 access.granted #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The access mask in force. What that means narrows per event — the rights this check granted, or the rights a handle was opened with — so read the event's own note.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.opened
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.1.9 access.granted-staged #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

What a staged central access policy, not yet in force, would have granted. Carried beside access.granted, the grant the policy in force produced; the two differing is the record of what a policy change will alter before it is made.

Carried by:

  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged

B.1.10 access.matched #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The subset of the requested access that overlapped an audit mask and therefore caused the record to exist. The bits that triggered the audit, not the bits that were used.

Carried by:

  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.1.11 access.maximum-allowed #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the request was made in MAXIMUM_ALLOWED mode, asking for whatever the descriptor would grant rather than for named rights. Changes how SACL audit ACEs match, and such a request cannot fail, so it is needed to read both access.granted and outcome.success.

Carried by:

No event carries this field yet.

B.1.12 access.missing #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The rights an operation needed that the handle did not have. Carried on a refusal of an operation on an already-open handle: the handle's access.granted, and what it lacked.

Carried by:

No event carries this field yet.

B.1.13 access.privileged #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the check was satisfied by a privilege rather than by the descriptor. True on a descriptor written with SeRestorePrivilege over a missing or corrupt one, which is a complete bypass of the object's access control and not a decision the descriptor made.

Carried by:

No event carries this field yet.

B.1.14 access.ptrace-mode #

  • Type: uint.flags
  • Values: 0x1 PTRACE_MODE_READ · 0x2 PTRACE_MODE_ATTACH · 0x4 PTRACE_MODE_NOAUDIT · 0x8 PTRACE_MODE_FSCREDS · 0x10 PTRACE_MODE_REALCREDS · 0x20 PTRACE_MODE_GETFD · 0x40 PTRACE_MODE_PIDFD_OPEN · 0x80 PTRACE_MODE_PROC_QUERY_LIMITED · 0x100 PTRACE_MODE_PROC_QUERY_INFORMATION
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The ptrace access mode of a cross-process check. The last four bits are Peios additions that let KACS tell a pidfd open, a descriptor theft and a /proc read apart from a generic ptrace check. The mode decides the process right required: PTRACE_MODE_GETFD, taking another process's file descriptor, needs PROCESS_DUP_HANDLE.

Carried by:

No event carries this field yet.

B.1.15 access.requested #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The access mask the caller asked for, after generic bits have been mapped to type-specific ones. Generic bits never survive into an event.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.opened
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.1.16 access.requested-minimum #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The smallest access a POSIX open genuinely needed, before the kernel widened the request for compatibility. Carried beside access.requested: the difference is access the caller was given without asking for it.

Carried by:

No event carries this field yet.

B.1.17 access.self #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the operation targeted the caller itself. Several cross-process checks exempt a process acting on itself structurally — raise() must work even when a restricted token would fail its own process's descriptor — so true means no descriptor was consulted.

Carried by:

No event carries this field yet.

B.1.18 access.vfs-mask #

  • Type: uint.flags
  • Values: 0x1 MAY_EXEC · 0x2 MAY_WRITE · 0x4 MAY_READ · 0x8 MAY_APPEND · 0x10 MAY_ACCESS · 0x20 MAY_OPEN · 0x40 MAY_CHDIR · 0x80 MAY_NOT_BLOCK
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The VFS permission mask the kernel passed to the check. A different vocabulary from access.requested, which is the KACS rights the mask was mapped to; a record carrying both shows the mapping.

Carried by:

No event carries this field yet.

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.2 buffer.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under buffer, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.2.1 buffer.capacity #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The per-CPU ring buffer capacity in force. After a failed swap, the capacity that was kept.

Carried by:

  • kmes.buffer.swap.failed
  • kmes.config.applied

B.2.2 buffer.capacity-expected #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The ring capacity a record expected to find, where the ring it found has another. Every per-CPU ring is meant to share one capacity, because KMES sizes an incoming event against one ring's capacity before writing it to another. A ring whose buffer.capacity differs from this has broken that check: an event judged to fit may not fit the ring it lands in.

Carried by:

No event carries this field yet.

B.2.3 buffer.capacity-previous #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The per-CPU ring capacity before a capacity swap: what buffer.capacity was until the swap committed. A swap to a smaller capacity copies the surviving events into the new rings and skips any that no longer fit, so a record where this exceeds buffer.capacity is one where the swap itself can have lost events.

Carried by:

No event carries this field yet.

B.2.4 buffer.capacity-requested #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The per-CPU ring buffer capacity that was asked for.

Carried by:

  • kmes.buffer.swap.failed

B.2.5 buffer.cpu #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The logical CPU whose ring buffer a record concerns. KMES keeps one ring per CPU and writes each event to the ring of the CPU it was emitted on, so this is the numbering event.cpu uses on records read from that ring. It identifies a ring, not a security subject, and it is the only thing that does.

Carried by:

  • eventd.events.lost

B.2.6 buffer.cpu-claimed #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The CPU a ring's own metadata says it belongs to, carried when that disagrees with buffer.cpu, the CPU it is installed for. A disagreement means the ring topology is internally inconsistent, and KMES drops the event rather than trust the ring. It consumes no sequence number and counts no loss, so no gap appears in event.sequence, and a record carrying this field is the only evidence that the event existed.

Carried by:

No event carries this field yet.

B.2.7 buffer.fill #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

How full a ring was, as the bytes of events it held: buffer.head minus buffer.tail. Compare it with buffer.capacity for a proportion. A full ring loses its oldest events to every new one, so a fill near capacity is the warning that comes before loss rather than loss itself.

Carried by:

No event carries this field yet.

B.2.8 buffer.generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The generation of the ring in force. It starts at 1 and goes up by one with each capacity swap, which replaces every ring with a new one. The old ring is stamped with the new generation as it is retired, so a consumer still mapping it can tell that its view is stale; it is the only staleness signal a mapped ring has.

Carried by:

No event carries this field yet.

B.2.9 buffer.generation-previous #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The ring generation before a capacity swap, normally one less than buffer.generation.

Carried by:

No event carries this field yet.

B.2.10 buffer.head #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The ring's write position, as a running byte count. It only increases and never wraps: it is not an offset into the buffer, which is this value modulo buffer.capacity. With buffer.tail it gives the ring's fill directly.

Carried by:

No event carries this field yet.

B.2.11 buffer.slots #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The number of per-CPU ring slots the kernel exposes: one for every CPU the system could have, numbered as buffer.cpu is. A consumer that means to see every event attaches to every slot. A slot for a CPU that is not present holds no ring.

Carried by:

No event carries this field yet.

B.2.12 buffer.tail #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The ring's tail position: where its oldest retained event begins, as a running byte count in the same terms as buffer.head. It moves forward when the ring is full and new events overwrite the oldest, so a tail that has passed the point a consumer was reading from means that consumer lost events.

Carried by:

No event carries this field yet.

B.2.13 buffer.threshold-direction #

  • Type: str.enum
  • Values: rising · falling
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

Whether a ring's fill crossed a watermark on the way up or on the way down. rising is the warning that a consumer is falling behind; falling is its recovery. Without it, a record of recovery cannot be told from a record of onset.

Carried by:

No event carries this field yet.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.3 caap.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under caap, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.3.1 caap.phase #

  • Type: str.enum
  • Values: effective-sacl · staged-sacl
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Which phase of a central access policy's audit evaluation a CAAP diagnostic describes. effective-sacl is a rule's SACL in the policy in force, whose audit records are real. staged-sacl is the SACL of a rule's staged, not-yet-effective version, evaluated alongside it only so that an administrator can see what rolling it out would do; a failure there changes nothing about the access or its audit.

Absent on a diagnostic about the whole check rather than one rule's SACL, such as a disagreement between the staged and effective results.

Carried by:

  • kacs.caap.sacl.skipped

B.3.2 caap.policy.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The SID identifying a central access policy. An object's SACL names the policies that apply to it by this SID, and the kernel's policy cache is keyed on it, so it ties a record to the policy an administrator installed. It identifies a policy, never a user or group, even though it has the form of a SID.

Carried by:

  • kacs.caap.policy.changed
  • kacs.caap.sacl.skipped

B.3.3 caap.rule.index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The zero-based position of a rule within the central access policy named by caap.policy.sid. Meaningful only against the policy as it stood when the record was made: replacing a policy's specification replaces its rule list, so an index in an older record can point at a different rule today.

Carried by:

  • kacs.caap.sacl.skipped

B.3.4 caap.staged-differs #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Whether evaluating the staged policies gave a different result from the effective ones for this access check. True when the staged grant differs from the effective grant, when the per-object results of an object-type check differ, or when the staged audit records differ from those actually produced.

A difference changes nothing about the access itself, which the effective policies decided. It is the signal that promoting the staged policy would change the outcome for this subject and object.

Carried by:

No event carries this field yet.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.4 clock.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under clock, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.4.1 clock.time #

  • Type: uint.time
  • Asserted: no
  • Carried in: the payload
  • Defined in: timed.evman

The wall clock's reading just after timed moved it. Every record written after this one is stamped on the clock as it now reads, so this is the point from which their times count.

Read just after the change, not computed from it, so it includes the few microseconds the change itself took.

Carried by:

  • timed.clock.stepped

B.4.2 clock.time-previous #

  • Type: uint.time
  • Asserted: no
  • Carried in: the payload
  • Defined in: timed.evman

The wall clock's reading just before timed moved it, the counterpart of clock.time. The difference between the two is the size of the step, and records stamped between clock.time-previous and clock.time on either side of this one were not written in the order their times suggest.

Absent when the clock read before the Unix epoch, which a uint.time cannot hold; that happens on a machine whose hardware clock has failed, and it is exactly the case the boot floor exists for.

Carried by:

  • timed.clock.stepped

Generated from timed.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.5 config.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under config, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.5.1 config.coalesced #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether change notifications were coalesced before they were acted on. Network policy coalesces and the registry and KMES do not, which is why one registry edit produces different numbers of records from different subsystems.

Carried by:

No event carries this field yet.

B.5.2 config.counts.applied #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many settings in a configuration refresh were applied. One of four counters read together, which between them account for every setting the refresh saw.

Carried by:

  • kmes.config.applied

B.5.3 config.counts.ignored-unknown #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many registry values were ignored because their names match no setting. A misspelt setting name lands here and nowhere else, so a non-zero count is usually an administrator's typo.

Carried by:

  • kmes.config.applied

B.5.4 config.counts.retained-invalid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many settings kept their previous value because the stored value was rejected, of the wrong type or out of range.

Carried by:

  • kmes.config.applied

B.5.5 config.counts.retained-missing #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many settings kept their previous value because they were absent from the registry.

Carried by:

  • kmes.config.applied

B.5.6 config.expected.max #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The largest value accepted for this setting.

Carried by:

  • kmes.config.value.rejected
  • lcs.config.value.rejected

B.5.7 config.expected.min #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The smallest value accepted for this setting.

Carried by:

  • kmes.config.value.rejected
  • lcs.config.value.rejected

B.5.8 config.expected.type #

  • Type: uint.enum
  • Values: 0 REG_NONE · 1 REG_SZ · 2 REG_EXPAND_SZ · 3 REG_BINARY · 4 REG_DWORD · 5 REG_DWORD_BIG_ENDIAN · 6 REG_LINK · 7 REG_MULTI_SZ · 8 REG_RESOURCE_LIST · 9 REG_FULL_RESOURCE_DESCRIPTOR · 10 REG_RESOURCE_REQUIREMENTS_LIST · 11 REG_QWORD
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry type the value is required to have.

Carried by:

  • kmes.config.value.rejected
  • lcs.config.value.rejected

B.5.9 config.key.path #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry key the reported value lives under, in canonical form.

Carried by:

  • eventd.config.changed
  • kacs.config.value.rejected
  • kmes.config.applied
  • kmes.config.refresh.failed
  • kmes.config.value.rejected
  • lcs.config.value.rejected

B.5.10 config.limit #

  • Type: str.enum
  • Values: request-timeout-ms · transaction-timeout-ms · notification-queue-size · symlink-depth-limit · max-value-size · max-key-depth · max-path-component-length · max-total-path-length · max-layers-per-value · max-bound-transactions-per-source · max-read-only-transactions-per-source · max-total-layers · max-registered-sources · max-hives-per-source · max-concurrent-rsi-requests · max-scope-guids-per-token · max-private-layers-per-token · max-subtree-watch-depth · max-transaction-watch-event-burst
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The kernel's internal identifier of a runtime limit, from the LCS_LIM_* codes with the prefix removed and folded to lower case. A different vocabulary from config.name: that is the name an administrator wrote in the registry, and can be anything; this is the limit the kernel validated, and a record can carry one without the other.

Carried by:

No event carries this field yet.

B.5.11 config.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The name of the configuration value being reported on, within config.key.path.

Carried by:

  • eventd.config.changed
  • kacs.config.value.rejected
  • kmes.config.value.rejected
  • lcs.config.value.rejected
  • netd.hostname.changed
  • peipkg.repository.reconfigured

B.5.12 config.received.kind #

  • Type: str.enum
  • Values: missing · wrong-type · out-of-range
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How the stored value failed validation. Three different administrative mistakes with three different fixes: a value that was absent, one of the wrong type, and one that was well-typed but outside the permitted range.

KMES and LCS reached this vocabulary independently and disagreed — u32_out_of_range and u64_out_of_range against dword_out_of_range for the same condition. The width was never information the reader needed, since config.expected.type already carries it, so the three collapse to one.

Carried by:

  • kmes.config.value.rejected
  • lcs.config.value.rejected

B.5.13 config.received.text #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

A value supplied as text and rejected because it could not be parsed, as the caller wrote it. Carried where there is no well-typed value for config.received.value to hold.

Carried by:

No event carries this field yet.

B.5.14 config.received.type #

  • Type: uint.enum
  • Values: 0 REG_NONE · 1 REG_SZ · 2 REG_EXPAND_SZ · 3 REG_BINARY · 4 REG_DWORD · 5 REG_DWORD_BIG_ENDIAN · 6 REG_LINK · 7 REG_MULTI_SZ · 8 REG_RESOURCE_LIST · 9 REG_FULL_RESOURCE_DESCRIPTOR · 10 REG_RESOURCE_REQUIREMENTS_LIST · 11 REG_QWORD
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry type the value actually had. Present only when the failure was the type itself.

Carried by:

  • kmes.config.value.rejected
  • lcs.config.value.rejected

B.5.15 config.received.value #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The value that was stored and rejected. Present only when the value was well-typed and out of range — there is nothing to report for a value that was missing or of the wrong type entirely.

Carried by:

  • kmes.config.value.rejected
  • lcs.config.value.rejected

B.5.16 config.root #

  • Type: str.enum
  • Values: registry · kmes · layers · port-reservations · network
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which kernel-read configuration root the record concerns: Machine\System\Registry for the registry's own limits, Machine\System\KMES, the layer metadata under Machine\System\Registry\Layers, the port reservations under Machine\System\Network\TcpIp\PortReservations, and the network policy under Machine\System\Network. Which subsystem's key, not which setting within it.

Carried by:

No event carries this field yet.

B.5.17 config.roots-present #

  • Type: str.enum[]
  • Values: registry · kmes · layers · port-reservations · network
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The configuration roots found present when the registry was bootstrapped, from the same values as config.root. A root missing from the list is running on compiled-in defaults, and the kernel watches the whole machine hive for it to appear rather than watching the root itself.

Carried by:

No event carries this field yet.

B.5.18 config.seed-file #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The shipped registry seed file that was applied, from /usr/share/regim/. Seed files are inert until an image names them, so this records which defaults a machine was actually given.

Carried by:

No event carries this field yet.

B.5.19 config.self-watch-mode #

  • Type: str.enum
  • Values: disarmed · targeted · machine-root-fallback · mixed
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How precisely the kernel is watching its own configuration in the registry. targeted means each kernel-read configuration key has its own watch. machine-root-fallback means none of those keys could be watched, so the kernel watches the whole Machine hive and re-reads everything on any change beneath it. mixed means some keys are watched precisely and the fallback covers the rest. disarmed means no watch is armed, so a configuration change will not be noticed until the next bootstrap.

Anything other than targeted is a degraded mode, cheaper to tolerate than to diagnose: configuration still loads, but from coarse rescans.

Carried by:

No event carries this field yet.

B.5.20 config.text #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

A setting's value in force, where the value is not an integer: a string, or the textual rendering of a value of another registry type. The registry type is config.type.

Carried by:

  • netd.hostname.changed
  • peipkg.repository.reconfigured

B.5.21 config.text-previous #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The text value a change replaced, beside config.text.

Carried by:

  • netd.hostname.changed
  • peipkg.repository.reconfigured

B.5.22 config.type #

  • Type: uint.enum
  • Values: 0 REG_NONE · 1 REG_SZ · 2 REG_EXPAND_SZ · 3 REG_BINARY · 4 REG_DWORD · 5 REG_DWORD_BIG_ENDIAN · 6 REG_LINK · 7 REG_MULTI_SZ · 8 REG_RESOURCE_LIST · 9 REG_FULL_RESOURCE_DESCRIPTOR · 10 REG_RESOURCE_REQUIREMENTS_LIST · 11 REG_QWORD
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry type of the value now in force, as the number of its REG_* constant. Absent when no value is in force. The same registry types, in the same numbering, as config.expected.type.

Carried by:

  • eventd.config.changed

B.5.23 config.type-previous #

  • Type: uint.enum
  • Values: 0 REG_NONE · 1 REG_SZ · 2 REG_EXPAND_SZ · 3 REG_BINARY · 4 REG_DWORD · 5 REG_DWORD_BIG_ENDIAN · 6 REG_LINK · 7 REG_MULTI_SZ · 8 REG_RESOURCE_LIST · 9 REG_FULL_RESOURCE_DESCRIPTOR · 10 REG_RESOURCE_REQUIREMENTS_LIST · 11 REG_QWORD
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry type of the value a change replaced. Absent when there was no value before.

Carried by:

  • eventd.config.changed

B.5.24 config.value #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The value in force after the event. On a rejection that is the last known-good value, not a corrected version of what was stored: configuration validation is reject-or-keep and never clamps.

The registry and this field can legitimately disagree. The registry shows what was written; this shows what the subsystem is actually using.

Carried by:

  • eventd.config.changed
  • kmes.config.value.rejected
  • lcs.config.value.rejected
  • peipkg.repository.reconfigured

B.5.25 config.value-previous #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The value that was in force before the change. With config.value, the before and after of a setting that took effect.

Carried by:

  • eventd.config.changed
  • peipkg.repository.reconfigured

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.6 counter.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under counter, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.6.1 counter.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The name of a counter stream, as the policy author wrote it in COUNT and Counter.<name>. At most 63 bytes.

Carried by:

No event carries this field yet.

B.6.2 counter.partition #

  • Type: uint.flags
  • Values: 0x1 source-address · 0x2 destination-address · 0x4 interface
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Which packet facts a counter view is partitioned by: one cell per distinct value of the facts set here. Zero is a single cell for the whole machine. A packet that lacks a partitioning fact, such as non-IP traffic in a view partitioned by address, counts nowhere.

Carried by:

No event carries this field yet.

B.6.3 counter.threshold #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The threshold a rule's counter condition compared counter.value against. The two together are the whole content of a crossing.

Carried by:

No event carries this field yet.

B.6.4 counter.value #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The value held in a counter cell for the window a rule read. Its unit is whatever the stream counts: emissions of COUNT, or bytes where the rule counts Length, which is the length the stack saw and not the wire's.

Carried by:

No event carries this field yet.

B.6.5 counter.windows #

  • Type: uint.duration[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The sliding-window lengths a counter table answers, at most eight. The kernel holds them to the whole second and approximates each window with eight buckets of an eighth of its length, so a window's value is accurate only to that bucket.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.7 destination.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under destination, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.7.1 destination.address #

  • Type: str.ip
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The address the traffic was going to, rendered in the textual form for its family.

Carried by:

  • ntfe.verdict.reported

B.7.2 destination.attribution #

  • Type: str.enum
  • Values: socket-stamp · no-kacs-state · unstamped · no-namespace · loopback-sender-lost · time-wait · stack-handled · no-sending-socket · multicast-or-broadcast · no-receiver · principal-unreadable
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Why the destination endpoint was given the attribution it has. Not emitted today: NTFE decides it on every flow and encodes it nowhere, so destination.endpoint and destination.unattributed are all a record carries. The values are those of source.attribution; multicast-or-broadcast and no-receiver are the inbound paths that give shared and none.

Carried by:

No event carries this field yet.

B.7.3 destination.endpoint #

  • Type: str.enum
  • Values: program · kernel · shared · none
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

What stands at the destination end of the traffic, when that end is on this machine. program is a process's socket, and the destination.socket.* fields then say whose. kernel is the network stack itself. shared is inbound multicast or broadcast, delivered to every socket bound to the port and so attributable to none of them. none means nothing on the machine will receive the traffic: a port nobody is listening on, which is the signature of a port scan. Present only on flow-layer records, and absent when the destination is a remote machine.

Carried by:

No event carries this field yet.

B.7.4 destination.file.parent.inode #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The inode number of the directory a rename moves an object into. Subject to the same caveats as object.file.inode.

Carried by:

No event carries this field yet.

B.7.5 destination.file.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The path an object went to, in an operation on two objects such as a rename or a link. Where it came from is source.file.path.

Carried by:

No event carries this field yet.

B.7.6 destination.mac #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The link-layer address the traffic was going to, written as six colon-separated lowercase hexadecimal octets. Known only from a frame's Ethernet header, so it is absent for outbound traffic judged at the IP seats, where the frame has not been built yet, even when source.mac is present.

Carried by:

No event carries this field yet.

B.7.7 destination.port #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The transport port the traffic was going to. Present only for protocols that have ports.

Carried by:

  • ntfe.verdict.reported

B.7.8 destination.socket.process.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The durable GUID of the process recorded on the destination endpoint's socket when it was stamped. Unlike the process ID it is never reused, so it still names the right process after that process has exited.

Carried by:

No event carries this field yet.

B.7.9 destination.socket.process.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The short name of the process recorded on the destination endpoint's socket when it was stamped. It is the kernel's command name, at most 15 characters and lossily sanitised, so two different programs can share it; it is a hint for a person, not an identity.

Carried by:

No event carries this field yet.

B.7.10 destination.socket.process.pid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The process ID recorded on the destination endpoint's socket when it was stamped. A socket can outlive the process that created it, so this process may have exited and its ID been reused; destination.socket.process.guid is the identity that survives that.

Carried by:

No event carries this field yet.

B.7.11 destination.socket.token.service-sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The per-service SID of the token stamped on the destination endpoint's socket, when that token belongs to a service. It is found among the token's enabled groups and is always the 32-byte S-1-5-80 form. Absent for a socket that no service stands behind.

Carried by:

No event carries this field yet.

B.7.12 destination.socket.token.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The user SID of the token KACS stamped on the destination endpoint's socket. It is the identity the socket was stamped with, not necessarily the identity of whoever reads from it now. Present only when destination.endpoint is program.

Carried by:

No event carries this field yet.

B.7.13 destination.stratum.flags #

  • Type: uint.flags
  • Values: 0x1 create · 0x2 read-only · 0x4 absent-may
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The configuration flags of the stratum an object was written into, as the mount option set them. Decoded as source.stratum.flags is. A copy-up always writes into the stratum flagged create, so on a copy-up record this field says nothing new; it matters where an object was written in place.

Carried by:

No event carries this field yet.

B.7.14 destination.stratum.index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

Which stratum an object was written into, by index within the mount's stack.

Carried by:

  • stratafs.file.copied-up

B.7.15 destination.stratum.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The filesystem path of the stratum an object was written into.

Carried by:

  • stratafs.file.copied-up

B.7.16 destination.token.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of a token the operation created, which did not exist before it: the result of a duplicate, a filter or a token creation.

Carried by:

No event carries this field yet.

B.7.17 destination.unattributed #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Whether NTFE confessed that it could not attribute the destination endpoint to a principal. When true, every rule condition on that endpoint's identity was false for this traffic rather than evaluated. False does not prove the endpoint was attributed: a program endpoint whose token could not be read still reads false here.

Carried by:

No event carries this field yet.

Generated from kernel.evman, ntfe.evman, stratafs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.8 emission.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under emission, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.8.1 emission.batch-index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The zero-based position, in a batch emit, of the entry that failed. A batch is emitted up to this entry and not from it: every earlier entry reached the ring, and this entry and every later one did not.

Carried by:

No event carries this field yet.

B.8.2 emission.buckets-clamped #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The number of per-process rate buckets a reconfiguration cut down. Lowering emission.rate-limit clamps the remaining budget of every live process to the new ceiling at once; this counts the processes whose budget was above it.

Carried by:

No event carries this field yet.

B.8.3 emission.budget #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The number of events a process could still emit before its rate limit stopped it: the tokens left in its bucket when the record was made. The bucket refills at emission.rate-limit events a second and holds no more than that, so a process's burst is one second's worth. On a throttled emit this is below emission.requested, which is why the emit was refused.

Carried by:

No event carries this field yet.

B.8.4 emission.emitted #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The number of events an emit operation actually wrote to the ring. Where it falls short of emission.requested, the difference is events the caller meant to record that are not in the stream.

Carried by:

No event carries this field yet.

B.8.5 emission.length #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The total size of one event as written to the ring: the fixed header, the event type and the payload together. It is the figure checked against the configured maximum event size, and against half the ring's capacity, the largest event a ring accepts.

Carried by:

No event carries this field yet.

B.8.6 emission.length-claimed #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

An event length read from a ring that failed KMES's sanity check: zero, larger than the ring, or larger than the bytes between the tail and the write position. It is not the size of any real event. It means the ring's framing is corrupt, and KMES recovered by discarding everything pending in that ring at once — a loss that is never added to the ring's dropped count and is bounded only by the ring's size.

Carried by:

No event carries this field yet.

B.8.7 emission.payload-length #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The byte length of an event's MessagePack payload, without the header or the event type.

Carried by:

  • peinit.event.dropped

B.8.8 emission.rate-limit #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The per-process emission ceiling KMES is running on, in events a second: the MaxEmitRatePerProcess registry value, 10 000 by default and accepted from 100 to 1 000 000. It applies to emission from userspace; kernel emitters are not limited, and a process holding SeTcbPrivilege is exempt.

Carried by:

  • kmes.config.applied

B.8.9 emission.rate-limit-previous #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The per-process emission ceiling before a reconfiguration, in events a second. Lowering the ceiling is a way to thin out the event stream, so a record where this exceeds emission.rate-limit deserves a look at who changed it.

Carried by:

No event carries this field yet.

B.8.10 emission.requested #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The number of events an emit operation asked to write: 1 for a single emit, or the entry count of a batch, which is at most 256.

Carried by:

No event carries this field yet.

B.8.11 emission.throttled #

  • Type: uint.duration
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

How long a producer was held back by its rate limit, from the first emit refused for want of budget to the first accepted again. A duration, not a flag. Every emit refused in that span was an event the producer meant to record that is not in the stream.

Carried by:

No event carries this field yet.

B.8.12 emission.type #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The event type an emitter was trying to emit, as it supplied it. It names what was attempted, not what was recorded: a record carrying it is about an emission that failed or was cut short, and no event of this type need exist. Absent where the type itself was the fault — empty, or not valid UTF-8 — in which case emission.type-length still gives its length.

Carried by:

  • peinit.event.dropped

B.8.13 emission.type-length #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The byte length of the event type an emitter supplied, at most 65 535.

Carried by:

No event carries this field yet.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.9 emitter.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under emitter, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.9.1 emitter.class #

  • Type: uint.enum
  • Values: 0 userspace · 1 kmes · 2 kacs · 3 lcs · 4 ntfe
  • Set: open
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The emission path that wrote the record: a kernel subsystem, or userspace through the emit system call. Set by the kernel, never by the emitter, so a record claiming a kernel event type with class userspace was written by a program, whatever its type says.

The class is the path, not the event type's root. StrataFS records are written through KACS and carry class kacs.

Carried by:

Every record, in the header.

B.9.2 emitter.process.executable #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

The path the emitting process was executed from, resolved at exec with symbolic links already followed. Left out when the process has no executable, as a kernel thread has none.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)

B.9.3 emitter.process.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The process the record was written from, as a durable GUID. A random v4 minted when the process's KACS state is allocated, so unlike a PID it is never reused and outlives the process. Zero on records written outside task context, where current names whatever task was interrupted rather than a real actor.

Carried by:

Every record, in the header.

B.9.4 emitter.process.init-ns-admin #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the acting credential held CAP_SYS_ADMIN in the initial user namespace at the time of the check. A Linux capability, so context for a decision and never the decision itself: it says whether the caller could have done the same thing from outside any user namespace, which is how an operator tells a container-local actor from a host-wide one.

Carried by:

No event carries this field yet.

B.9.5 emitter.process.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

The kernel's name for the emitting process, typically the executable's basename. Not argv[0] — a process that rewrote its argv is unaffected here. Lossy: two processes can share a name.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)

B.9.6 emitter.process.pid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

The process ID the record was written from. Reliable only in the short term: PIDs are reused, so a PID in a week-old record may name something unrelated. Correlate durably on emitter.process.guid.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)

B.9.7 emitter.process.userns-depth #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How deeply nested the acting credential's user namespace is. 0 is the initial namespace; each level of unshare(CLONE_NEWUSER) adds one. Read beside emitter.process.init-ns-admin: a capability held at depth 3 is held only over that namespace's own objects.

Carried by:

No event carries this field yet.

B.9.8 emitter.stamp-failure #

  • Type: str.enum
  • Values: no-task-context · effective-token-guid-read-failed · true-token-guid-read-failed · process-no-process-state
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which header identity stamp could not be filled, and why. A header GUID of zero is otherwise ambiguous: a kernel-originated record that correctly has no actor and one whose actor was lost read the same, and this field is what tells them apart. Absent when every stamp was filled.

no-task-context covers all three stamps at once: the record was written outside task context, where current is whatever task was interrupted, so the kernel deliberately writes no identity rather than a wrong one. The other values name one stamp each — the effective or true token's GUID could not be read, or the process had no KACS process state.

Carried by:

No event carries this field yet.

B.9.9 emitter.thread.tid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The thread that wrote the record, where the operation is scoped to a thread rather than to its process. Impersonation is per thread, so on an impersonation record this, not emitter.process.pid, names what took on the client's identity. Reused like a PID, so correlate durably on the header GUIDs.

Carried by:

  • kacs.impersonation.reverted
  • kacs.impersonation.started

B.9.10 emitter.token.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The effective token the emitting thread ran under, as a durable GUID. Under impersonation this is the client's token; emitter.true-token.guid is the thread's underlying one.

Carried by:

Every record, in the header.

B.9.11 emitter.true-token.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The emitting thread's own token, before any impersonation. Equal to emitter.token.guid when the thread is not impersonating, so a query for records where the two differ is a query for impersonated work.

Carried by:

Every record, in the header.

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.10 engine.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under engine, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.10.1 engine.abi-version #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The version of the NTFE device interface the running kernel implements. The interface is experimental and carries no stability promise, so a tool reading the device checks this before trusting anything else.

Carried by:

No event carries this field yet.

B.10.2 engine.enforcing #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Whether NTFE enforces anything at all: true when at least one rules layer has a published forest. False from boot until the first generation ingests, and whenever no layer has policy, in which case every traversal is waved through.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.11 evaluation.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under evaluation, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.11.1 evaluation.flags #

  • Type: uint.flags
  • Values: 0x1 backstop · 0x2 fail-closed · 0x4 reject-degraded · 0x8 rejudged · 0x10 identity-unresolved
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

How an evaluation reached its result. backstop means no rule yielded and the compiled-in DROP answered. fail-closed means evaluation could not finish, usually for want of atomic memory, and the packet was dropped regardless of policy. reject-degraded means a REJECT went out as a DROP because no answer could be built or sent. rejudged means a flow's cached verdict was stale, by generation or by time, and was judged again. identity-unresolved means an endpoint could not be attributed.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.12 event.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under event, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.12.1 event.boot.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The boot the record belongs to. Not in the record itself: the consumer supplies the boot it read the record in, which is what makes event.sequence unique across reboots.

Carried by:

Every record, in the header.

B.12.2 event.cpu #

  • Type: uint
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The CPU whose ring carried the record. Sequence numbers are per CPU, so event.cpu and event.sequence together identify a record within a boot.

Carried by:

Every record, in the header.

B.12.3 event.sequence #

  • Type: uint
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The record's sequence number within its CPU's ring for this boot. Sequence numbers on one ring are contiguous, so a gap between two records read from it is a count of records lost.

Carried by:

Every record, in the header.

B.12.4 event.time #

  • Type: uint.time
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

When the record was made, in nanoseconds since the Unix epoch. Stamped by the kernel at emission, so a payload never repeats it: an event carrying its own timestamp is carrying a second, forgeable one.

Carried by:

Every record, in the header.

B.12.5 event.type #

  • Type: str
  • Asserted: no
  • Carried in: the header
  • Defined in: kernel.evman

The event type, such as kacs.audit.access.checked. Stamped from the emitter's argument, so it names what the emitter claims happened; the emitter.* header fields are the evidence of who wrote it.

Carried by:

Every record, in the header.

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.13 fields.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under fields, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.13.1 fields.attestation.userspace #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Set on a kernel-originated record that carries a value userspace supplied, and absent otherwise. Such a value is the supplying component's claim: it is what the component says it enforced, which the kernel copied but did not observe. The fields that can hold one are marked asserted in their definitions.

A userspace-originated record never carries this field, because its emitter.class already says the whole payload is the emitter's word.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.14 firmware.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under firmware, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.14.1 firmware.policy-mode #

  • Type: str.enum
  • Values: enforce · log
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The firmware signature policy in force. enforce refuses a firmware blob that does not verify at the PeiosTcb tier; log loads it anyway and records the verdict.

The shipping default is log. On a stock system a failing firmware.result therefore does not mean the blob was refused; read this field before concluding that a device went without its firmware. The mode is fixed for the boot and never changes at runtime.

Carried by:

No event carries this field yet.

B.14.2 firmware.policy-origin #

  • Type: str.enum
  • Values: compiled-default · command-line
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Where firmware.policy-mode came from for this boot. compiled-default is the kernel build's own setting; command-line is a kacs_fwsig=enforce or kacs_fwsig=log override. An override lasts one boot and needs only access to the bootloader, which is why it is recorded apart from the mode itself. An unrecognised kacs_fwsig= value is ignored with a kernel warning and leaves the origin compiled-default.

Carried by:

No event carries this field yet.

B.14.3 firmware.result #

  • Type: str.enum
  • Values: allowed · unsigned · no-key-match · below-tcb · unverifiable · probe-failed
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The verdict on a firmware load, named for its KACS_FW_* code. allowed is the only passing verdict: the blob verified against a built-in key at the PeiosTcb tier. unsigned means the file carried no signature, no-key-match that it was signed but no built-in key verified it, below-tcb that a key verified it at a lower tier, unverifiable that verification could not run, and probe-failed that the signature material could not be read.

A failing verdict is not a refusal under log policy. Whether the blob was loaded is firmware.policy-mode's to say; this field is what the kernel concluded about the blob either way. unverifiable and probe-failed fail rather than pass on purpose: a verification that cannot run must not become the way around it.

Carried by:

No event carries this field yet.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.15 flow.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under flow, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.15.1 flow.endpoint #

  • Type: str.enum
  • Values: source · destination
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Which end of the flow the record concerns: the local endpoint the flow layer judged. Outbound traffic is judged for its source and inbound traffic for its destination; a loopback flow has two local ends and is judged once for each, and this field is what tells those two records apart.

Carried by:

No event carries this field yet.

B.15.2 flow.id #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Conntrack's identifier for the flow. Not emitted today: the flows dump carries it but the verdict record does not, so a verdict cannot be joined to the flow it was passed on. Unique only among flows alive at the same time.

Carried by:

No event carries this field yet.

B.15.3 flow.rule.hash #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The hash of the path of the rule behind a flow's cached verdict: the FNV-1a-64 hash of the whole registry path, kept in the flow's sentence. The sentence keeps no path, so after a re-judgment this is the only thing that survives about the rule that previously decided the flow. Resolve it against the generation that wrote the sentence, because a later generation may name its rules differently. It is the same value a report carries as rule.hash.

Carried by:

No event carries this field yet.

B.15.4 flow.state #

  • Type: str.enum
  • Values: new · established · related · invalid · untracked
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

How connection tracking classified this traffic. untracked means connection tracking gave the traffic no flow state NTFE recognises: tracking was not applied, or conntrack judged the packet incoherent. Absent at the ingress seat, which stands before connection tracking.

invalid is not produced today. It is reserved for traffic that tracking applied to and found fitting no known flow, but telling that apart needs conntrack's own verdict, which NTFE does not read yet, so incoherent traffic reports untracked. The value stays listed because the enumeration is closed and its values are part of the ABI.

Carried by:

  • ntfe.verdict.reported

B.15.5 flow.verdict-expiry #

  • Type: uint.time
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

When a flow's cached verdict stops being valid, because a time condition the judgment consulted will next change its answer. The flow is re-judged on its first packet after this time. Absent when the verdict has no time edge, though it is still re-judged when a new generation lands. The kernel holds this to the whole second.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.16 graph.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under graph, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.16.1 graph.context #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The graph execution context an event belongs to: one boot's start of its service set, or one on-demand start of a service and everything it needs. Records with the same context belong to one attempt to bring a set of services up.

Numbered from 0 in the order peinit creates contexts. Not durable: the numbering starts again when peinit does.

Carried by:

  • peinit.graph.operation.ended

B.16.2 graph.counts.added #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How many service definitions a configuration reload added: names that had no definition before.

Written only when the reload succeeded. A failed reload changed nothing, and carries no counts.

Carried by:

  • peinit.config.reload.applied

B.16.3 graph.counts.discarded #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How many definitions a configuration reload withdrew and dropped at once, because their services were not running. Written only when the reload succeeded, as graph.counts.added is.

Carried by:

  • peinit.config.reload.applied

B.16.4 graph.counts.marked-removed #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How many definitions a configuration reload withdrew from services that were still running. Such a service is left running, cannot be started again, and is discarded once it stops. Written only when the reload succeeded, as graph.counts.added is.

Carried by:

  • peinit.config.reload.applied

B.16.5 graph.counts.restored #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How many definitions a configuration reload brought back after an earlier reload had removed them while their services were still running. Written only when the reload succeeded, as graph.counts.added is.

Carried by:

  • peinit.config.reload.applied

B.16.6 graph.counts.undecodable #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How many definitions a configuration reload found in the registry but could not decode. Each such service is failed, or, if it was running, left running with its definition marked removed. Not counted under graph.counts.marked-removed or graph.counts.discarded, because the key is still there. Written only when the reload succeeded, as graph.counts.added is.

Carried by:

  • peinit.config.reload.applied

B.16.7 graph.counts.updated #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How many existing service definitions a configuration reload changed. Written only when the reload succeeded, as graph.counts.added is.

Carried by:

  • peinit.config.reload.applied

B.16.8 graph.phase #

  • Type: str.enum
  • Values: boot · reload-config · phase2-boot
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

When the service graph was validated. The phase changes what a finding did: at boot, the services it names are marked and the boot continues; at reload-config, the whole reload is rejected and nothing is applied; at phase2-boot, the boot plan itself could not be built.

Carried by:

  • peinit.graph.validation.failed
  • peinit.graph.validation.warned

B.16.9 graph.role #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The role no service fills. A role is a virtual name a service declares it provides, such as authn, and other services depend on the role rather than on a service name. The services that need it are in graph.services.

Carried by:

  • peinit.graph.validation.warned

B.16.10 graph.services #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The services a graph finding involves. For a dependency cycle, the services in the cycle, in the order the cycle runs; for an unfilled role, the services that need the role and cannot start; for a reload during the boot window, the services whose definitions were deferred.

Carried by:

  • peinit.boot.downgraded
  • peinit.config.reload.applied
  • peinit.config.reload.deferred
  • peinit.graph.validation.failed
  • peinit.graph.validation.warned

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.17 identity.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under identity, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.17.1 identity.sids #

  • Type: bin.sid[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The user SIDs of the well-known identities the kernel mints at boot: today SYSTEM (S-1-5-18) and Anonymous Logon (S-1-5-7), the roots of every identity on the system. A boot record without one of them means that token could not be built — a failure the code otherwise returns silently.

Carried by:

No event carries this field yet.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.18 kernel.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under kernel, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.18.1 kernel.build.disabled #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The security-relevant kernel build options this kernel was built without, by CONFIG_ name. They matter as much as those enabled: an option that should be off — a second packet-filtering framework, a mandatory access control module Peios does not use — would be a second, unratified policy surface, and a kernel built with it on is otherwise indistinguishable from one built correctly.

Carried by:

No event carries this field yet.

B.18.2 kernel.build.enabled #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The security-relevant kernel build options this kernel was built with, by CONFIG_ name, such as CONFIG_MODULE_SIG_FORCE and CONFIG_STRICT_DEVMEM. Only the options that bear on security are listed, not the whole configuration.

Carried by:

No event carries this field yet.

B.18.3 kernel.divergence.checks #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The checks stock Linux makes that this kernel does not, one name per check. Peios removes or replaces several upstream checks — the capability-based ptrace gate, the credential tests in signal delivery, the switch to real credentials in faccessat — because KACS makes those decisions instead. An investigator reasoning from Linux semantics will be wrong about each one, and this is where to find out which. Nothing emits the field yet, so the names it will carry are not yet fixed.

Carried by:

No event carries this field yet.

B.18.4 kernel.divergence.reports #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The values this kernel reports differently from stock Linux, one name per divergence. Where kernel.divergence.checks lists checks not made, this lists answers that differ: getuid and getgid reading the task's real credentials, SO_PEERCRED and the filesystem identity carrying the IDs KACS projects, the capability sets in /proc and from capget rewritten. Correlating Linux uids across sources fails silently without it, because a peer credential and a /proc entry can disagree in ways stock Linux never produces. Nothing emits the field yet, so the names it will carry are not yet fixed.

Carried by:

No event carries this field yet.

B.18.5 kernel.lockdown #

  • Type: str.enum
  • Values: none · integrity · confidentiality
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The kernel lockdown level in force. A Peios kernel is built to force integrity, which refuses the paths that write to the running kernel — /dev/mem, kexec, hibernation, raw MSR writes, unsigned BPF — to every principal however privileged; KACS has no say in it and no privilege lifts it. Any other value means the machine is not running a kernel built as Peios builds it.

Carried by:

No event carries this field yet.

B.18.6 kernel.lsms #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The Linux security modules active, in the order the kernel calls them; a Peios kernel runs landlock, lockdown, integrity and pkm. The list is fixed and checked when the kernel is built but stated nowhere at runtime, so without this field a machine booted on a kernel built some other way cannot be told apart from one that was not.

Carried by:

No event carries this field yet.

B.18.7 kernel.securityfs-node #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The securityfs node an initialisation concerned, as its path beneath the securityfs root (/sys/kernel/security), such as kacs/sessions. A node that fails to be created makes every tool that reads it fail with ENOENT, and this is where the cause is recorded. KACS creates its nodes all or nothing, so one failure leaves the whole kacs directory absent.

Carried by:

No event carries this field yet.

B.18.8 kernel.version #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The Linux kernel release actually running, as uname -r reports it. Peios pins the upstream version it builds on and checks it at build time, but nothing else states it at runtime.

Carried by:

No event carries this field yet.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.19 linux.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under linux, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.19.1 linux.cap #

  • Type: str.enum
  • Values: chown · dac-override · dac-read-search · fowner · fsetid · kill · setgid · setuid · setpcap · linux-immutable · net-bind-service · net-broadcast · net-admin · net-raw · ipc-lock · ipc-owner · sys-module · sys-rawio · sys-chroot · sys-ptrace · sys-pacct · sys-admin · sys-boot · sys-nice · sys-resource · sys-time · sys-tty-config · mknod · lease · audit-write · audit-control · setfcap · mac-override · mac-admin · syslog · wake-alarm · block-suspend · audit-read · perfmon · bpf · checkpoint-restore
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The Linux capability whose check prompted the record, named as its CAP_* constant with the prefix removed, in kebab case: CAP_NET_ADMIN is net-admin. Context, never the decision. On Peios every capability check is answered by KACS, either by mapping the capability to a privilege — net-admin to SeTcbPrivilege, for example — or with a fixed answer, so this says which Linux gate asked and privilege.name and the outcome say what was decided.

Two sets have fixed answers and never involve a privilege. Twelve are granted to every process unconditionally, because KACS makes the real decision elsewhere: chown, dac-override, dac-read-search, fowner, fsetid, kill, setgid, setuid, net-bind-service, net-broadcast, ipc-owner and lease. setpcap, setfcap and mac-override are refused whatever the token holds.

The set is open because new Linux releases add capabilities.

Carried by:

  • kacs.audit.privilege.used

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.20 loss.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under loss, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.20.1 loss.bytes #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The bytes of events a loss discarded. Reported in bytes where KMES cannot count events: when a ring's framing is found corrupt, everything pending is dropped at once without being parsed, and when a capacity swap skips an event too large for the smaller ring, only its size is known.

Carried by:

No event carries this field yet.

B.20.2 loss.class #

  • Type: uint.enum
  • Values: 0 userspace · 1 kmes · 2 kacs · 3 lcs · 4 ntfe
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The emission path of the events that were lost, numbered as emitter.class numbers it: the kernel subsystem, or userspace, that was writing them. A loss record is written by KMES, so its own emitter.class is always kmes; this is the field that says whose events went missing.

Carried by:

No event carries this field yet.

B.20.3 loss.count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The number of events lost in one occurrence. For a gap found in the sequence numbers, the size of that gap: loss.sequence-last minus loss.sequence, plus one.

Carried by:

  • eventd.events.lost

B.20.4 loss.preceding-time #

  • Type: uint.time
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The time of the last record received before a gap, in nanoseconds since the Unix epoch. With the time of the record that revealed the gap, it bounds when the lost events were written. Absent when no record preceded the gap on that ring, as at the start of a boot.

Carried by:

  • eventd.events.lost

B.20.5 loss.sequence #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The first sequence number a loss covers. Sequence numbers are contiguous per CPU ring, so with buffer.cpu this locates the gap exactly, and it is the field that reconciles a loss KMES reports with a gap a consumer infers from event.sequence.

Not every loss has one. An event dropped because its CPU had no usable ring, an event emitted before KMES started, and an emit refused at the system call consume no sequence number and leave no gap to point at.

Carried by:

  • eventd.events.lost

B.20.6 loss.sequence-last #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The last sequence number of a gap, where loss.sequence is the first. Both ends are included in the loss.

Carried by:

  • eventd.events.lost

B.20.7 loss.total #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kmes.evman

The cumulative count of events a ring has dropped. Not emitted today. KMES keeps the counter, but it is not in the ring's metadata page and nothing outside the kernel's own tests reads it, so no emitter has it to report. It also under-reports: a corrupt-ring discard, an event skipped by a capacity swap and an event lost for want of a usable ring are never added to it, so even once it is emitted it is a lower bound rather than a total.

Carried by:

No event carries this field yet.

Generated from kmes.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.21 machinery.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under machinery, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.21.1 machinery.collision.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The other name in a hash collision: a second tag or stream name whose hash equals that of the name the record carries. NTFE refuses a generation in which this happens, so that a hash stays a single identity while the policy runs.

Carried by:

No event carries this field yet.

B.21.2 machinery.hash #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The FNV-1a-64 hash by which the tag and counter stores know a tag name or a counter stream name. Tags and streams are hashed by the same function into separate namespaces, so one hash can name both a tag and a stream: read it with the record's event type. A hash maps to a name only within the generation that published it.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.22 memory.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under memory, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.22.1 memory.check-phase #

  • Type: str.enum
  • Values: mmap · mprotect · enable-time-scan
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

When a memory-protection check fired. mmap and mprotect are the calls a process makes. enable-time-scan is the sweep KACS makes over a process's existing mappings when a mitigation is turned on, and what it refuses is the mitigation, not a mapping: a refusal in that phase leaves the process unprotected rather than short of memory.

Carried by:

No event carries this field yet.

B.22.2 memory.protection #

  • Type: uint.flags
  • Values: 0x1 PROT_READ · 0x2 PROT_WRITE · 0x4 PROT_EXEC · 0x8 PROT_SEM · 0x1000000 PROT_GROWSDOWN · 0x2000000 PROT_GROWSUP
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The protection bits a mapping call asked for: the prot argument to mmap or mprotect. Write-XOR-execute refuses any request that carries both PROT_WRITE and PROT_EXEC.

Carried by:

No event carries this field yet.

B.22.3 memory.protection-previous #

  • Type: uint.flags
  • Values: 0x1 PROT_READ · 0x2 PROT_WRITE · 0x4 PROT_EXEC
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The protection an existing mapping carried before an mprotect, in the same bit encoding as memory.protection. Read from the mapping's own flags, so only the read, write and execute bits are ever set. Absent on mmap, which has no earlier mapping.

It matters because write-XOR-execute judges the transition, not just the request: an mprotect to PROT_EXEC alone is refused when the mapping is currently writable, and one to PROT_WRITE alone when it is currently executable.

Carried by:

No event carries this field yet.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.23 mitigation.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under mitigation, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.23.1 mitigation.action #

  • Type: str.enum
  • Values: enable · disable · lock · unlock
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The direction of a change to a process mitigation's state. enable and lock harden a process; disable and unlock loosen it, and are the ones to read closely. A Peios mitigation is meant to persist once set, so a permitted disable or unlock is unusual, and a refused one is a process trying to weaken its own protection.

Carried by:

No event carries this field yet.

B.23.2 mitigation.name #

  • Type: str.enum
  • Values: wxp · tlp · lsv · ui-access · no-child · cfif · cfib · pie · sml
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The single process mitigation a record is about, named for its KACS_MIT_* bit: wxp write-XOR-execute, tlp trusted library paths, lsv library signature verification, no-child the ban on creating processes, cfif and cfib forward- and backward-edge control-flow integrity, pie the refusal of non-PIE executables, sml the speculation mitigation lock, and ui-access, which is reserved.

There is no cfi. The legacy KACS_MIT_CFI bit is an alias that sets both cfif and cfib and is not itself kept, so a record names whichever of the two it concerns.

A request for cfif fails today on every live process, because the kernel offers no way to turn on IBT for a running task. A service that asks for it is not protected by it, whatever it believes.

Carried by:

No event carries this field yet.

B.23.3 mitigation.trusted-prefixes #

  • Type: str.path[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The path prefixes the trusted library paths mitigation (tlp) accepts. A process under it may map a file executable only if the file's path begins with one of these. Each entry begins and ends with / and is compared byte for byte with the start of the path, without normalisation. At most 64, held in one table for the whole system.

These are prefixes, not files: a search for a file's path does not match the prefix that admitted it. An empty list trusts nothing rather than checking nothing, so a process under tlp is then refused every file-backed executable mapping.

Carried by:

No event carries this field yet.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.24 mutation.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under mutation, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.24.1 mutation.sequence #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The sequence number LCS stamped on a registry mutation. Allocated from the kernel's global monotonic counter, so sequences order writes across every hive and source, and the higher sequence wins when two writes land in layers of equal precedence.

The counter resumes at boot from one past the highest sequence any registered source reports. A record's sequence is therefore comparable with any other from the same registry, not only those from the same boot.

Carried by:

  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.value.set

B.24.2 mutation.sequence-expected #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The sequence number a conditional write asserted as the value's current one, the precondition of a compare-and-swap. The write proceeds only if the value still carries this sequence, and fails with cas-failed from the source otherwise. Absent on an unconditional write.

Carried by:

  • lcs.audit.value.set

B.24.3 mutation.sequence-watermark #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The next sequence number the kernel would allocate, at the moment of the record. Every sequence legitimately stored in the registry is below it, so a source reporting a sequence at or above the watermark is claiming a write the kernel never allocated, which is the future-sequence check that lcs.source.response.rejected records.

Carried by:

No event carries this field yet.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.25 network.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under network, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.25.1 network.bridge.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The name of the bridge device an interface was enslaved to or released from. Enslaving an interface to a bridge moves its traffic off the IP seats and onto its device seats alone, which changes which rules can apply to it.

Carried by:

No event carries this field yet.

B.25.2 network.direction #

  • Type: str.enum
  • Values: in · out
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Which way the traffic was moving relative to this machine.

Carried by:

  • ntfe.verdict.reported

B.25.3 network.ether-type #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The link-layer protocol number of the frame.

Carried by:

  • ntfe.verdict.reported

B.25.4 network.family #

  • Type: uint.enum
  • Values: 0 AF_UNSPEC · 2 AF_INET · 10 AF_INET6
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The address family of the addresses in this record. AF_UNSPEC when the traffic was evaluated below the layer where addresses exist, in which case no address, port or protocol field is present.

Carried by:

  • ntfe.verdict.reported

B.25.5 network.hop-limit #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The packet's remaining hop count: the IPv4 TTL or the IPv6 hop limit, as the packet carried it at the seat that judged it. Absent below the layer where an IP header exists.

Carried by:

No event carries this field yet.

B.25.6 network.interface.disposition #

  • Type: str.enum
  • Values: policed · bridge-port · seats-failed · other-namespace
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

How NTFE stands towards a network device. policed has its device seats in place, and its IP traffic also reaches the IP seats, where the flow layer and conntrack facts exist. bridge-port has its device seats, but its frames are switched at the link layer and never reach the IP seats, so only the device seats judge them and no flow-state or identity rule applies. seats-failed is a device that registered but whose seats could not be attached: its raw-packet traffic is never judged. other-namespace is outside the initial network namespace and is not policed at all.

Carried by:

No event carries this field yet.

B.25.7 network.interface.disposition-previous #

  • Type: str.enum
  • Values: policed · bridge-port · seats-failed · other-namespace
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The disposition a network device had before the change a record reports, in the terms of network.interface.disposition. A change from policed to bridge-port is the one that quietly withdraws every flow-layer rule from the device.

Carried by:

No event carries this field yet.

B.25.8 network.interface.index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The kernel's index for that interface. Zero when no interface was determined. Indexes are reused across interface teardown, so network.interface.name is the durable one.

Carried by:

  • ntfe.verdict.reported

B.25.9 network.interface.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The network interface the traffic was seen on.

Carried by:

  • ntfe.verdict.reported

B.25.10 network.length #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The length of the traffic unit evaluated.

Carried by:

  • ntfe.verdict.reported

B.25.11 network.namespace #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The network namespace a device or flow belongs to, by the kernel's namespace number. NTFE polices only the initial namespace, so today this field exists to say that something was in a different one and was not judged at all.

Carried by:

No event carries this field yet.

B.25.12 network.protocol #

  • Type: uint.enum
  • Values: 1 ICMP · 2 IGMP · 6 TCP · 17 UDP · 47 GRE · 50 ESP · 51 AH · 58 IPv6-ICMP · 132 SCTP · 136 UDPLite
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The transport protocol number, from the IANA protocol numbers registry. A number not listed is still a protocol, rendered as its number.

Carried by:

  • ntfe.verdict.reported

B.25.13 network.tcp-flags #

  • Type: uint.flags
  • Values: 0x1 FIN · 0x2 SYN · 0x4 RST · 0x8 PSH · 0x10 ACK · 0x20 URG · 0x40 ECE · 0x80 CWR
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The flag bits of the TCP header, taken whole from the flags byte at offset 13. Absent on any protocol other than TCP, and also absent on a TCP packet whose header NTFE could not read, which a reader cannot otherwise tell from a protocol without flags.

Carried by:

No event carries this field yet.

B.25.14 network.vlan #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The VLAN id the traffic belongs to. At the device seats it is the tag on the frame; at the IP seats the tag has already been stripped and it is the id of the VLAN device the packet arrived on or leaves by. Absent when the traffic is not on a VLAN.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.26 notify.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under notify, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.26.1 notify.errno #

  • Type: int.errno
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The error number a service sent as ERRNO=, as a negative errno. Services send it positive, by convention; this field holds it negated.

The field is the service's claim about itself, informational only; peinit neither acts on nor retains it. The protocol does not require the text to be a number: text that is not a positive number has no errno to carry, and the record is written without this field.

Carried by:

  • peinit.notify.errno.reported

B.26.2 notify.exit-status #

  • Type: int
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The exit status a service sent as EXIT_STATUS=, informationally. Not the exit code of any process: a service may send it while still running, and its real exit appears in object.process.exit-code. Text that is not an integer is not carried, and the record is written without this field.

Carried by:

  • peinit.notify.exit-status.reported

B.26.3 notify.progress.bounded #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

Whether the progress a service or submitted job reported declares an end: true for PROGRESS=N/ and PROGRESS=N/M, false for a bare PROGRESS=N, which counts with no end (PSPU §4.19). It is what tells a viewer to draw a bar or to expect one rather than show a rising count.

True with notify.progress.total absent means the end is declared but not yet known. Absent when no progress figure has been reported, as when a service has sent only PROGRESS_UNIT=.

Not implied by notify.progress.total: PROGRESS=N and PROGRESS=N/ both leave the total absent, and PSPU §4.19 has a viewer draw them differently.

Carried by:

  • peinit.job.status.reported
  • peinit.notify.progress.reported

B.26.4 notify.progress.current #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How far a service or submitted job has got, as it reported with PROGRESS=: the count before any /. Its unit is notify.progress.unit. It may fall from one record to the next; do not read motion from the difference between two.

Carried by:

  • peinit.job.status.reported
  • peinit.notify.progress.reported

B.26.5 notify.progress.total #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The end notify.progress.current is counting towards, as reported after the / of PROGRESS=. At least 1, and never less than the current value. The total may change between records, because a job that rescans has learned something.

Absent when the service gave no total, and absence alone does not say whether one is coming. PROGRESS=N counts with no end, while PROGRESS=N/ counts towards an end not yet known, and both leave this field absent; notify.progress.bounded is what tells them apart.

Carried by:

  • peinit.job.status.reported
  • peinit.notify.progress.reported

B.26.6 notify.progress.unit #

  • Type: str.enum
  • Values: bytes · items · percent
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

What notify.progress.current and notify.progress.total count, as reported with PROGRESS_UNIT=. Absent when the service gave no unit.

Carried by:

  • peinit.job.status.reported
  • peinit.notify.progress.reported

B.26.7 notify.status #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The text a service sent as STATUS=: free text describing what it is doing. The service's own words, unvalidated; never read it as a statement by peinit.

Carried by:

  • peinit.job.status.reported
  • peinit.notify.status.reported

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.27 object.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under object, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.27.1 object.account.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: lpsd.evman

The SID of the account a record is about: a principal a principal source holds, whose credential was checked or changed, or which was created, deleted or modified. The SID, never the name: an account can be renamed, and a record that named it would then describe someone else.

Not object.token.sid, which is the user of a token. A token speaks for an account, but an account changed while nobody is signed in has no token to name it by.

Carried by:

  • lpsd.account.created
  • lpsd.account.deleted
  • lpsd.account.modified
  • lpsd.credential.changed
  • lpsd.credential.verified
  • lpsd.group.member.added
  • lpsd.group.member.removed

B.27.2 object.certificate.digest #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: trustd.evman

The SHA-256 digest of the certificate's DER encoding: its fingerprint, the name a distrust gives it and the one trust list prints, carried as 32 bytes rather than as hexadecimal. The name to search by, because it is the only one that identifies a certificate: two certificates can share a subject name, and a subject name can be forged.

Carried by:

  • gxwid.certificate.renewed
  • trustd.root.added
  • trustd.root.distrusted
  • trustd.root.removed

B.27.3 object.certificate.digest-previous #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: gxwid.evman

The SHA-256 digest of the DER encoding of the certificate this one replaced: its fingerprint, as 32 bytes, in the form of object.certificate.digest. With it, the record answers "what was this machine's certificate before?" without going back to an older record.

Carried by:

  • gxwid.certificate.renewed

B.27.4 object.certificate.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: trustd.evman

The certificate's subject distinguished name, in the form trust show prints it, such as CN=DigiCert TLS ECC P384 Root G5,O=DigiCert\, Inc.,C=US. For a person to read; it does not identify the certificate on its own. Search by object.certificate.digest.

Carried by:

  • gxwid.certificate.renewed
  • trustd.root.added
  • trustd.root.distrusted
  • trustd.root.removed

B.27.5 object.certificate.purposes #

  • Type: str.enum[]
  • Values: server-auth · code-signing
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: trustd.evman

What the certificate is trusted for, one value per purpose, each once. The registry spells a purpose in the form ServerAuth; the record carries it in kebab-case, a hyphen at each change from lower to upper case and in place of anything that is not a letter or a digit, so ServerAuth is server-auth and CodeSigning is code-signing. A root from the shipped bundle is trusted for server-auth. An administrator may record any other purpose, and it appears here in the same form.

Carried by:

  • trustd.root.added
  • trustd.root.distrusted
  • trustd.root.removed

B.27.6 object.cgroup.generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The cgroup generation of the service the cgroup belongs to. peinit advances it when a service's tree is leaked, so that the next run gets a fresh tree; it is the number in a path's %gen suffix. Not the same counter as object.service.generation, which advances on every start.

Carried by:

  • peinit.job.ended

B.27.7 object.cgroup.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The cgroup the event is about, as its full path under /sys/fs/cgroup/peinit. A service's cgroup is named for the service, with any byte outside letters, digits, ., _ and - written as % and two hexadecimal digits, so the path can differ from the service name. Once a service's tree has leaked, later trees carry a %gen suffix and the cgroup generation, so that a new run never shares a tree with an unkillable process. A submitted job's cgroup is under jobs/, named by the job's GUID.

Carried by:

  • peinit.cgroup.leaked
  • peinit.job.ended
  • peinit.job.started
  • peinit.service.abandoned

B.27.8 object.cgroup.type #

  • Type: str.enum
  • Values: service-tree · health · hooks · helper
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

Which part of a service's process containment the cgroup is. service-tree is the whole of it and the most serious to lose; health and hooks hold its health checks and hooks; helper is a pre-start check helper's cgroup.

Carried by:

  • peinit.cgroup.leaked

B.27.9 object.claim.holder #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The package that holds object.claim.role after the event, by name. Absent when the event left the role unheld, as revoking a claim does.

Carried by:

  • peipkg.claim.changed

B.27.10 object.claim.role #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The role a claim event changed the holder of. A role is a virtual name that several installed packages may contend to own on the filesystem, with at most one holding it at a time (PSPU §5.23).

Carried by:

  • peipkg.claim.changed

B.27.11 object.device.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The device a firmware blob was being loaded for.

Not emitted today. The firmware check runs in the hook on the file read, which sees the file and not the device that requested it, so the kernel has no device to report.

Carried by:

No event carries this field yet.

B.27.12 object.event-namespace.pattern #

  • Type: str
  • Asserted: yes
  • Carried in: the payload
  • Defined in: eventd.evman

The event-namespace pattern whose security descriptor eventd checked a caller's access against. It is the pattern the descriptor was written for, not the event type the caller asked about: eventd looks for a descriptor under the event type itself, then under each shorter dotted prefix of it, then under *, and uses the first it finds. A read of kacs.audit.access.checked therefore records kacs or * when that is where the descriptor lives, so a search for one event type by its full name misses checks made under a broader pattern.

The value is eventd's claim, copied by the kernel from the check's audit context, so a record carrying it also carries fields.attestation.userspace.

Carried by:

No event carries this field yet.

B.27.13 object.fd-store.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The name a service gave a file descriptor it asked peinit to keep, with FDNAME=. A descriptor sent without a name is stored as stored. Names are not unique: a service may store several descriptors under one name, and two services may use the same one, so a name identifies nothing on its own without object.service.name.

Carried by:

  • peinit.fd-store.rejected

B.27.14 object.file.code-kind #

  • Type: str.enum
  • Values: exec-image · mapped-library · firmware-blob
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

What kind of code load the record concerns: an image being executed, a library being mapped executable, or a firmware blob being loaded for a device. A search on object.file.path returns all three; this tells them apart.

Carried by:

No event carries this field yet.

B.27.15 object.file.delete-on-close-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many delete-on-close requests are armed on the file's inode. The file is removed when the last handle carrying one is closed, so a count above zero on an open says the file is already scheduled to disappear.

Carried by:

No event carries this field yet.

B.27.16 object.file.device #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The device number of the filesystem the object lives on, as stat reports it in st_dev. With object.file.inode it names a file where no path can be resolved. A device number is assigned when a filesystem is mounted, so the pair names a file only while that filesystem stays mounted, and not at all across a reboot.

Carried by:

  • kacs.descriptor.rejected

B.27.17 object.file.digest #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The SHA-256 digest of a file whose signature was checked. The strongest identifier of "this exact binary" a record can carry: unlike a path or an inode it survives a rename and changes when the content does.

Carried by:

No event carries this field yet.

B.27.18 object.file.elf-type #

  • Type: str.enum
  • Values: none · rel · exec · dyn · core
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The ELF type of an executable, from e_type, with the ET_ prefix removed and the name folded to lower case. exec is a fixed-address executable, dyn a position-independent one or a shared object. The PIE mitigation refuses exec. Open because the ELF standard reserves ranges for operating-system and processor-specific types.

Carried by:

No event carries this field yet.

B.27.19 object.file.fs-type #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The type of filesystem the file lives on, by name, such as ext4. Mount policy is derived from the filesystem type, so this explains why a file on proc was never checked at all.

Carried by:

No event carries this field yet.

B.27.20 object.file.gid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The Linux GID that owns the file, as stat reports it. Like object.file.uid, a projection rather than anything KACS decides on.

Carried by:

No event carries this field yet.

B.27.21 object.file.inode #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The inode number the object presents. The best object identifier a filesystem record has, and neither stable nor unique: StrataFS builds a private inode for every open that shares the number of the outer one, a mount root's number follows whichever stratum provides it, and numbers are re-derived at mount time. Expect both false joins and false splits when correlating on it.

Carried by:

  • kacs.descriptor.rejected

B.27.22 object.file.inode-lower #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The inode number of the real object in the underlying filesystem, beneath a stacking filesystem's own. Stable, but unique only within that filesystem. Carried beside object.file.inode; the two differing is how a record shows that the object a caller holds has been rebound to a different backing object.

Carried by:

No event carries this field yet.

B.27.23 object.file.inode-replacement #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The inode number of the object that took this one's place: the new object in a supersede, or the object found where the expected one should have been. A record carrying both this and object.file.inode names the object that was meant and the object that was there.

Carried by:

No event carries this field yet.

B.27.24 object.file.integrity #

  • Type: uint.integrity
  • Values: 0 Untrusted · 4096 Low · 8192 Medium · 12288 High · 16384 System
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mandatory integrity label on the file, as an integrity RID. Distinct from any principal's integrity: a record about lowering a file's label carries both, and subject.token.integrity is the caller's.

Carried by:

No event carries this field yet.

B.27.25 object.file.integrity-capped #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the label an exec would have taken from the file's signature was capped at the process's current label instead of applied. The kernel does this when a traced process, or one running with no_new_privs, execs a binary whose signature would raise its PIP label: the exec goes ahead, but a tracer that no longer dominated the process must not keep control of it. True means the binary ran with less trust than its signing key grants.

The label capped is the PIP label, object.process.pip.type and object.process.pip.trust, despite the field's name.

Carried by:

No event carries this field yet.

B.27.26 object.file.mode #

  • Type: uint.flags
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The object's POSIX permission bits, as stat reports them in the low twelve bits of st_mode: the read, write and execute triples, set-user-ID, set-group-ID and sticky. A projection for Linux compatibility; access is decided by the security descriptor, never by these bits. The object's type is object.file.type, not the high bits of this field.

Carried by:

No event carries this field yet.

B.27.27 object.file.mount-owner.cookie #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mount that owns an on-disk staging object, where that is not the mount inspecting it. Two mounts can share a create stratum, so a mount recovering orphans can meet another mount's staging; this, against object.file.mount.cookie, is the ownership check that decides whether the object is left alone.

Carried by:

No event carries this field yet.

B.27.28 object.file.mount.cookie #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mount instance the file lives on, as the 64-bit random cookie StrataFS assigns each mount. Two mounts sharing a stratum produce otherwise indistinguishable records, which only this separates.

Not emitted today. Only the StrataFS ftrace tracepoints carry the cookie; no event does yet.

Carried by:

No event carries this field yet.

B.27.29 object.file.parent.inode #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The inode number of the directory that holds the file. Subject to the same caveats as object.file.inode: neither stable nor unique.

Carried by:

No event carries this field yet.

B.27.30 object.file.parent.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The path of the directory that holds the file the operation acted on. Carried where the parent is what was decided on — creating or removing an entry is authorised against the directory, not the entry.

Carried by:

No event carries this field yet.

B.27.31 object.file.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The absolute path of the file the operation acted on, resolved at the enforcement point.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • kacs.descriptor.rejected
  • peipkg.action.authorised

B.27.32 object.file.path-relative #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The path of the object within its mount, /-prefixed. Not an absolute system path — deliberately a separate field from object.file.path, because a search for an absolute path would otherwise match KACS records and silently miss these.

StrataFS events fire from inside the filesystem, below the layer where a mount is known, so there is no absolute path for them to resolve against. The KACS events covering the same operation do carry the caller's absolute path, joined by the header's emitter.process.guid and time.

An absolute path to the backing object is derivable from this record alone: join this onto destination.stratum.path for a copy-up, or onto source.stratum.path for a refusal. That join is unavailable on a refusal raised before any provider was determined, where the stratum path is absent.

Carried by:

  • stratafs.file.copied-up
  • stratafs.mutation.refused

B.27.33 object.file.size #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The size of the object in bytes or, on a copy, how many bytes the copy moved. Distinguishes a copy-up of a large file from one of a symlink, which otherwise produce the same record.

Carried by:

No event carries this field yet.

B.27.34 object.file.size-previous #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The size first observed, where the record compares it against a later one. On a signature check this is the size when probing began and object.file.size the size when it ended: a difference means the file was written to while its signature was being read.

Carried by:

No event carries this field yet.

B.27.35 object.file.tcb-signed #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the executed binary was signed by a key trusted at the TCB tier, the floor for code that runs with full system trust. A usermodehelper exec below the floor is refused; an ordinary exec below it is allowed, at the lower trust its signature earns.

Carried by:

No event carries this field yet.

B.27.36 object.file.type #

  • Type: str.enum
  • Values: directory · regular · symlink · device · fifo · socket
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

What kind of filesystem object the file is. Some operations are refused by type alone — StrataFS will not copy a socket, FIFO or device up into a writable stratum — and a copy-up of a directory moves no contents, so the type is needed to read the rest of the record.

device covers both character and block devices.

Carried by:

No event carries this field yet.

B.27.37 object.file.type-previous #

  • Type: str.enum
  • Values: directory · regular · symlink · device · fifo · socket
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The type the object had before it changed, beside object.file.type. The pair records an object replaced by one of a different kind under the same name, such as a stratum root that was a directory and is now a file.

Carried by:

No event carries this field yet.

B.27.38 object.file.uid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The Linux UID that owns the file, as stat reports it. A copy-up preserves the provider's owner, so this is the UID a disk quota is charged to, whoever caused the copy. Ownership for access control is the descriptor's owner SID, object.sd.owner.

Carried by:

No event carries this field yet.

B.27.39 object.group.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: lpsd.evman

The SID of the group a record is about: one a principal source created or deleted, or whose membership it changed. It may be a group of the source's own domain or a well-known one such as BUILTIN\Administrators, which a local source records memberships of.

Carried by:

  • lpsd.account.modified
  • lpsd.group.created
  • lpsd.group.deleted
  • lpsd.group.member.added
  • lpsd.group.member.removed

B.27.40 object.handle.enforced #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the handle, or the object behind it, is under KACS enforcement. False on a handle to an object on an unmanaged mount, where no descriptor is checked and every later operation through the handle is allowed.

Carried by:

No event carries this field yet.

B.27.41 object.handle.mode #

  • Type: uint.flags
  • Values: 0x1 FMODE_READ · 0x2 FMODE_WRITE · 0x4 FMODE_LSEEK · 0x8 FMODE_PREAD · 0x10 FMODE_PWRITE · 0x20 FMODE_EXEC
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The kernel's open-mode bits on the file handle (f_mode). Only the bits listed are stable meanings; the kernel sets others for its own bookkeeping, and a consumer should ignore them. Distinct from access.granted, which is what KACS allowed the handle; this is what the handle was opened for.

Carried by:

No event carries this field yet.

B.27.42 object.handle.origin-readable #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether reading the StrataFS layer-origin attribute through the handle was permitted when its view of the directory was settled. Decided once, at open, and enforced at a much later call, so a refusal names a decision made earlier than the record that reports it.

Carried by:

No event carries this field yet.

B.27.43 object.hive.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The name of the registry hive an operation acted on, such as Machine or Users. A hive is the unit a registry source registers to serve, so this names which source's namespace the operation reached.

Carried by:

No event carries this field yet.

B.27.44 object.ipc.id #

  • Type: int
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The System V IPC identifier of the object, as semget, shmget or msgget returned it. Small, reused once the object is removed, and scoped to an IPC namespace, so it identifies an object only briefly and only within one namespace.

Carried by:

  • kacs.audit.descriptor.changed

B.27.45 object.ipc.type #

  • Type: str.enum
  • Values: sem · shm · msg
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which kind of System V IPC object the operation acted on: a semaphore set, a shared-memory segment or a message queue.

Carried by:

  • kacs.audit.descriptor.changed

B.27.46 object.job.activation-generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The activation generation of the service the job belongs to, at the time the job was created. The same counter as object.service.generation, so it tells which run of a service a job served. Absent for a submitted job, which belongs to no service.

Carried by:

  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started

B.27.47 object.job.arguments #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The job's argument vector, including argv[0]. Kept whole up to 32 KiB of encoded arguments; past that, the arguments are cut at the last whole argument that fits, never inside one, and object.job.arguments-truncated is true. A cut argument vector is a prefix of the real one, so do not read its last element as the last argument the job was given.

Carried by:

  • peinit.job.ended

B.27.48 object.job.arguments-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How many arguments the job was given, before any were cut. Equal to the length of object.job.arguments unless that was cut.

Carried by:

  • peinit.job.ended

B.27.49 object.job.arguments-truncated #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

Whether object.job.arguments was cut to fit the record. When true, object.job.arguments-count says how many arguments there really were.

Carried by:

  • peinit.job.ended

B.27.50 object.job.created-time #

  • Type: uint.time
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

When peinit created the job, in nanoseconds since the Unix epoch. Creation is when peinit decided to run it, before its process exists.

peinit times a job on the monotonic clock, and writes the instant as the wall-clock time it was when it builds the record. If the wall clock was stepped between the job's creation and its end, the time is reported on the clock as it stood at the end.

Carried by:

  • peinit.job.ended

B.27.51 object.job.duration #

  • Type: uint.duration
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How long the job lasted, in nanoseconds, from its creation to its end. Measured from creation, not from start, so it includes any time spent waiting to start; subtract object.job.created-time from object.job.started-time to find that part.

Carried by:

  • peinit.job.ended

B.27.52 object.job.executable #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The path of the executable the job runs.

Carried by:

  • peinit.job.created
  • peinit.job.ended

B.27.53 object.job.guid #

  • Type: bin.guid
  • Asserted: yes
  • Carried in: the payload
  • Defined in: peinit.evman

The job the event is about. A job is one process peinit runs: a service's main process, one of its hooks or health checks, or a job a client submitted. The GUID is a UUIDv7, so it also orders jobs by when they were created.

On a kacs.audit.access.checked record the value is peinit's claim, copied by the kernel from the check's audit context {kind: "job", job: {guid}}, so that record also carries fields.attestation.userspace.

Carried by:

  • peinit.cgroup.leaked
  • peinit.event.dropped
  • peinit.internal-error.contained
  • peinit.job.created
  • peinit.job.ended
  • peinit.job.output.dropped
  • peinit.job.started
  • peinit.job.status.reported

B.27.54 object.job.started-time #

  • Type: uint.time
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

When the job's process started, in nanoseconds since the Unix epoch. Absent if the job never started, which is how a job that failed before its process existed shows itself. Projected from the monotonic clock as object.job.created-time is.

Carried by:

  • peinit.job.ended

B.27.55 object.job.state #

  • Type: str.enum
  • Values: created · running · completed · failed · abandoned
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The job's state after the event. completed, failed and abandoned are terminal. abandoned means its process survived SIGKILL: the job is over but the process is still there.

Carried by:

  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started

B.27.56 object.job.submitter.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The user SID of the client that submitted the job. Present only on a submitted job.

Carried by:

  • peinit.job.status.reported

B.27.57 object.job.token.groups #

  • Type: bin.sid[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The group SIDs of the token the job's process runs as, in the token's order.

Carried by:

  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started

B.27.58 object.job.token.privileges #

  • Type: uint.flags
  • Values: 0x4 KACS_SE_CREATE_TOKEN_PRIVILEGE · 0x8 KACS_SE_ASSIGN_PRIMARY_TOKEN_PRIVILEGE · 0x10 KACS_SE_LOCK_MEMORY_PRIVILEGE · 0x20 KACS_SE_INCREASE_QUOTA_PRIVILEGE · 0x80 KACS_SE_TCB_PRIVILEGE · 0x100 KACS_SE_SECURITY_PRIVILEGE · 0x200 KACS_SE_TAKE_OWNERSHIP_PRIVILEGE · 0x400 KACS_SE_LOAD_DRIVER_PRIVILEGE · 0x800 KACS_SE_SYSTEM_PROFILE_PRIVILEGE · 0x1000 KACS_SE_SYSTEMTIME_PRIVILEGE · 0x2000 KACS_SE_PROFILE_SINGLE_PROCESS_PRIVILEGE · 0x4000 KACS_SE_INCREASE_BASE_PRIORITY_PRIVILEGE · 0x20000 KACS_SE_BACKUP_PRIVILEGE · 0x40000 KACS_SE_RESTORE_PRIVILEGE · 0x80000 KACS_SE_SHUTDOWN_PRIVILEGE · 0x100000 KACS_SE_DEBUG_PRIVILEGE · 0x200000 KACS_SE_AUDIT_PRIVILEGE · 0x800000 KACS_SE_CHANGE_NOTIFY_PRIVILEGE · 0x1000000 KACS_SE_REMOTE_SHUTDOWN_PRIVILEGE · 0x10000000 KACS_SE_MANAGE_VOLUME_PRIVILEGE · 0x20000000 KACS_SE_IMPERSONATE_PRIVILEGE · 0x100000000 KACS_SE_RELABEL_PRIVILEGE · 0x800000000 KACS_SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The privileges present on the token the job's process runs as, as the flags of the 64-bit privilege word of uapi/pkm/token.h, one KACS_SE_*_PRIVILEGE bit each. Present is not enabled: read object.job.token.privileges-enabled for which ones the process can use without enabling them first.

Flags, as the kernel's subject.token.privileges are, not an access mask: a uint.mask is decoded against object.kind (PGSS §6.5), which means nothing on a job event.

Carried by:

  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started

B.27.59 object.job.token.privileges-enabled #

  • Type: uint.flags
  • Values: 0x4 KACS_SE_CREATE_TOKEN_PRIVILEGE · 0x8 KACS_SE_ASSIGN_PRIMARY_TOKEN_PRIVILEGE · 0x10 KACS_SE_LOCK_MEMORY_PRIVILEGE · 0x20 KACS_SE_INCREASE_QUOTA_PRIVILEGE · 0x80 KACS_SE_TCB_PRIVILEGE · 0x100 KACS_SE_SECURITY_PRIVILEGE · 0x200 KACS_SE_TAKE_OWNERSHIP_PRIVILEGE · 0x400 KACS_SE_LOAD_DRIVER_PRIVILEGE · 0x800 KACS_SE_SYSTEM_PROFILE_PRIVILEGE · 0x1000 KACS_SE_SYSTEMTIME_PRIVILEGE · 0x2000 KACS_SE_PROFILE_SINGLE_PROCESS_PRIVILEGE · 0x4000 KACS_SE_INCREASE_BASE_PRIORITY_PRIVILEGE · 0x20000 KACS_SE_BACKUP_PRIVILEGE · 0x40000 KACS_SE_RESTORE_PRIVILEGE · 0x80000 KACS_SE_SHUTDOWN_PRIVILEGE · 0x100000 KACS_SE_DEBUG_PRIVILEGE · 0x200000 KACS_SE_AUDIT_PRIVILEGE · 0x800000 KACS_SE_CHANGE_NOTIFY_PRIVILEGE · 0x1000000 KACS_SE_REMOTE_SHUTDOWN_PRIVILEGE · 0x10000000 KACS_SE_MANAGE_VOLUME_PRIVILEGE · 0x20000000 KACS_SE_IMPERSONATE_PRIVILEGE · 0x100000000 KACS_SE_RELABEL_PRIVILEGE · 0x800000000 KACS_SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

Which of the privileges in object.job.token.privileges are enabled, as flags in the same 64-bit word. Always a subset of it.

Carried by:

  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started

B.27.60 object.job.token.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The user SID of the token the job's process runs as.

Carried by:

  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started

B.27.61 object.job.type #

  • Type: str.enum
  • Values: service-main · pre-exec-hook · post-exec-hook · reload-hook · health-check · submitted
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

What the job is for. Every type except submitted belongs to a service, named in object.service.name; a submitted job belongs to the client that submitted it, named in object.job.submitter.sid, and has no service.

Carried by:

  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started

B.27.62 object.key.created #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a create-key request made a new key. False means the key already existed and the request opened it instead, so the security descriptor and volatility the caller asked for were not applied: the key keeps the ones it already had.

Carried by:

  • lcs.audit.key.created

B.27.63 object.key.cross-source #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a registry lookup crossed from one source's hive into another's by following a symbolic link. When true, the key reached is served by a different backend from the one the path began in.

Carried by:

No event carries this field yet.

B.27.64 object.key.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry key an operation acted on. Keys are identified by GUID rather than by path, so a record names the key durably but not legibly — nothing in the event stream currently binds a key GUID to the path an administrator would recognise.

key means a registry key and nothing else. A cryptographic key is a signing-key.

Carried by:

  • lcs.audit.backup.ended
  • lcs.audit.backup.started
  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.opened
  • lcs.audit.key.tombstoned
  • lcs.audit.restore.ended
  • lcs.audit.restore.started
  • lcs.audit.value.deleted
  • lcs.audit.value.set
  • lcs.source.response.rejected

B.27.65 object.key.layer.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The name of the registry layer a key operation resolved in: the layer whose entry the operation read or wrote. Distinct from object.layer.name, which names a layer the operation acted on as a whole.

Carried by:

  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.27.66 object.key.parent.volatile #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the parent of a key being created is volatile. A volatile key may not have a non-volatile child, so a create that asks for a non-volatile key beneath a volatile parent is refused.

Carried by:

No event carries this field yet.

B.27.67 object.key.path #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES. Carried beside object.key.guid so a record is legible as well as durable. Resolved: a %CURRENT_USER% substitution has already been made, and the path as the caller wrote it is object.key.path-requested.

Carried by:

  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.27.68 object.key.path-requested #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry path as the caller wrote it, before LCS rewrote it. A path whose first component is the alias CurrentUser is rewritten to the caller's own key under Users, named by the caller's SID; this field keeps the original, and object.key.path holds the rewritten path.

The same requested path therefore names different keys for different callers. Search on object.key.path to find which key was actually reached.

Carried by:

No event carries this field yet.

B.27.69 object.key.reference-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The number of references held on a key's entry in the kernel's key cache, at the moment of the record. Each open handle holds one, so a count that reaches zero is the point at which LCS tells the source it may drop the key.

Carried by:

No event carries this field yet.

B.27.70 object.key.symlink #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a registry key is a symbolic link to another key. A lookup that passes through a link key is redirected to its target, named by object.key.target.guid.

Carried by:

  • lcs.audit.key.created

B.27.71 object.key.symlink-depth #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many registry symbolic links a lookup followed before stopping. The walk is bounded by the configured symlink depth limit, so a value at that limit means the lookup was refused for following too many links.

Carried by:

No event carries this field yet.

B.27.72 object.key.target.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The key a registry symbolic link redirects to, by GUID. Necessarily separate from object.key.guid: a record of a link being followed names the link and its target at once.

Carried by:

No event carries this field yet.

B.27.73 object.key.target.rsi.slot #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The registry source slot that owns the target of a symbolic link, present when it differs from the source that owns the link itself. A link that leads into another source's hive is the registry's equivalent of a filesystem symlink crossing a trust boundary; see object.key.cross-source.

Carried by:

No event carries this field yet.

B.27.74 object.key.value.digest #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The SHA-256 digest of a registry value's data, so that two records can be compared to see whether a value changed without either carrying the data. Recorded in place of the raw bytes, which an event never carries by default. Equal digests mean equal data; the type is a separate field, so compare object.key.value.type too.

A digest is not a secret-keeping device. A value drawn from a small set, such as a flag or a short PIN, can be recovered by hashing each candidate and comparing.

Carried by:

  • lcs.audit.value.set

B.27.75 object.key.value.digest-previous #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The SHA-256 digest of the data of the value a write replaced or a delete removed. Equal to object.key.value.digest on a write that stored what was already there.

Carried by:

  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.27.76 object.key.value.length #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The byte length of a registry value's data. Recorded in place of the data itself, which an event never carries by default because values can be large and can hold secrets.

Carried by:

  • lcs.audit.value.set

B.27.77 object.key.value.length-previous #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The byte length of the value a write replaced or a delete removed. Read with object.key.value.length.

Carried by:

  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.27.78 object.key.value.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The name of the registry value an operation acted on. The empty string is a legal name, identifying the key's default value, so an empty field and an absent one mean different things: absent means the record concerns no value at all.

Carried by:

  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.27.79 object.key.value.type #

  • Type: uint.enum
  • Values: 0 REG_NONE · 1 REG_SZ · 2 REG_EXPAND_SZ · 3 REG_BINARY · 4 REG_DWORD · 5 REG_DWORD_BIG_ENDIAN · 6 REG_LINK · 7 REG_MULTI_SZ · 8 REG_RESOURCE_LIST · 9 REG_FULL_RESOURCE_DESCRIPTOR · 10 REG_RESOURCE_REQUIREMENTS_LIST · 11 REG_QWORD · 65535 REG_TOMBSTONE
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The type of a registry value, as the number of its REG_* constant. REG_TOMBSTONE is LCS's own marker for a value deleted within one layer: it hides the value from lower layers rather than holding data, and appears only on a write that deletes.

Carried by:

  • lcs.audit.value.set

B.27.80 object.key.value.type-previous #

  • Type: uint.enum
  • Values: 0 REG_NONE · 1 REG_SZ · 2 REG_EXPAND_SZ · 3 REG_BINARY · 4 REG_DWORD · 5 REG_DWORD_BIG_ENDIAN · 6 REG_LINK · 7 REG_MULTI_SZ · 8 REG_RESOURCE_LIST · 9 REG_FULL_RESOURCE_DESCRIPTOR · 10 REG_RESOURCE_REQUIREMENTS_LIST · 11 REG_QWORD · 65535 REG_TOMBSTONE
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The type of the value a write replaced or a delete removed, in the terms of object.key.value.type. It is the value readers resolved before the operation, across every layer, so it can come from a different layer from the one written.

Carried by:

  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.27.81 object.key.volatile #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a registry key is volatile, meaning it lives only in memory and does not survive a reboot.

Carried by:

  • lcs.audit.key.created

B.27.82 object.key.volatile-requested #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The volatility a create-key caller asked for. It can differ from object.key.volatile when the request opened an existing key, whose volatility a create request does not change.

Carried by:

  • lcs.audit.key.created

B.27.83 object.kind #

  • Type: str.enum
  • Values: file · process · token · key · socket · ipc · mount-namespace · event-namespace · metric-namespace · log-namespace · eventd-admin · service · job · peinit-system · authd-session-end
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

What sort of thing the operation acted on. Load-bearing rather than descriptive: it names the table an access mask in the same record decodes against, and without it access.granted has no defined meaning.

The mask spaces genuinely collide. 0x0001 is FILE_READ_DATA on a file and PROCESS_TERMINATE on a process; the socket mapping reuses FILE_WRITE_DATA as a socket's write right.

event-namespace, metric-namespace, log-namespace and eventd-admin come from eventd's audit context, on access checks eventd asks KACS to make against its own descriptors. The first three are checks against a namespace pattern; eventd-admin is eventd's check of whether a caller may administer it, the administer() check in eventd's query/security.rs.

service, job and peinit-system come from peinit's audit context, on the access checks peinit makes against its own descriptors: a service's, a job's, and the descriptor guarding peinit's system-wide operations.

authd-session-end comes from authd's audit context, on its check against the SessionEndSecurity descriptor of whether a caller may end another principal's logon session.

mount-namespace is a mount table, checked when a process changes it. A namespace has no name or identifier a record could carry, so a record names it by its kind alone.

socket has no identity fields yet, and neither has ipc on an access check: such a record names the object only by its kind, until those enforcement points are plumbed to supply one. A change to an IPC object's descriptor does name it, by object.ipc.type and object.ipc.id.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • kacs.descriptor.rejected
  • kacs.impersonation.reverted
  • kacs.impersonation.started
  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.opened
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.27.84 object.layer.base #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether an operation targeted the base layer, the bottom of every key's resolution order. The base layer always exists at precedence 0 and cannot be disabled.

Carried by:

No event carries this field yet.

B.27.85 object.layer.enabled #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether a registry layer is enabled, after the change the record describes. A disabled layer takes no part in resolution: its values exist but no reader sees them.

Carried by:

No event carries this field yet.

B.27.86 object.layer.enabled-previous #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether a registry layer was enabled before the change the record describes. Read with object.layer.enabled: a record where the two differ is a layer being switched on or off.

Carried by:

No event carries this field yet.

B.27.87 object.layer.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The name of the registry layer an operation acted on, as written when the layer was created. Layer names are compared without regard to case, so two records whose names differ only in case name the same layer. The base layer is named base.

Carried by:

  • lcs.audit.key.deleted

B.27.88 object.layer.precedence #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

A registry layer's precedence, after the change the record describes. Where two layers define the same value, the one with the higher precedence wins, and the higher sequence breaks a tie. This number therefore decides which value the whole system sees.

Carried by:

No event carries this field yet.

B.27.89 object.layer.precedence-previous #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

A registry layer's precedence before the change the record describes. Read with object.layer.precedence: raising a layer above another silently changes which of their values every reader resolves.

Carried by:

No event carries this field yet.

B.27.90 object.layer.resolution-changed #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether a change to a layer altered what any reader of the registry actually resolves, as opposed to changing a layer whose values were already outranked. LCS computes this and discards it today, so it is not yet emitted on any record.

Carried by:

No event carries this field yet.

B.27.91 object.log-namespace.pattern #

  • Type: str
  • Asserted: yes
  • Carried in: the payload
  • Defined in: eventd.evman

The log-store namespace pattern whose security descriptor eventd checked a caller's access against. As with object.event-namespace.pattern, it is the pattern the descriptor was written for, not the log origin the caller asked about: eventd tries the origin, then each shorter dotted prefix, then *, and uses the first that has a descriptor.

An origin may name a producer within a service after a /, such as jobs/<guid>, and that part is never a pattern: the walk starts at the service. A service's hooks, reloads and health checks therefore record the service's own pattern, and a search for the full origin finds none of them.

The value is eventd's claim, copied by the kernel from the check's audit context, so a record carrying it also carries fields.attestation.userspace.

Carried by:

No event carries this field yet.

B.27.92 object.metric-namespace.pattern #

  • Type: str
  • Asserted: yes
  • Carried in: the payload
  • Defined in: eventd.evman

The metric-namespace pattern whose security descriptor eventd checked a caller's access against. As with object.event-namespace.pattern, it is the pattern the descriptor was written for, not the metric name: eventd tries the name, then each shorter dotted prefix, then *, and uses the first that has a descriptor.

eventd checks metric namespaces for two different things, reading stored metrics and publishing a sample, and this field is the same for both. Which one was checked is in access.requested, not here.

The value is eventd's claim, copied by the kernel from the check's audit context, so a record carrying it also carries fields.attestation.userspace.

Carried by:

No event carries this field yet.

B.27.93 object.mount.cookie #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mount instance the operation acted on, as the 64-bit random cookie StrataFS assigns each mount.

Not emitted today. Only the StrataFS ftrace tracepoints carry the cookie, and no superblock identifier exists for other filesystems: their tracepoints carry the superblock's magic number, which names a filesystem type rather than an instance.

Carried by:

No event carries this field yet.

B.27.94 object.mount.cookie-epoch #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The boot a mount cookie belongs to. A cookie read back from an on-disk marker can name a live mount only if it was written in this boot, and this is what decides that.

Carried by:

No event carries this field yet.

B.27.95 object.mount.depth #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The filesystem stacking depth of a StrataFS mount: one more than the deepest stacking filesystem among its strata. Linux permits a depth of at most 2, so a mount whose strata are themselves stacked filesystems can be refused with ELOOP.

Carried by:

No event carries this field yet.

B.27.96 object.mount.fs-type #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The type of filesystem mounted, by name, such as ext4 or tmpfs. Mount policy is derived from it: the kernel decides from the type alone that a proc or sysfs mount is unmanaged.

Carried by:

  • kacs.mount.policy.changed

B.27.97 object.mount.options #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The stack option string of a StrataFS mount exactly as the caller supplied it, whether or not it could be parsed. That is what makes it useful on a rejected mount: it shows what was asked for, where object.mount.strata could only show what was understood.

Carried by:

No event carries this field yet.

B.27.98 object.mount.options-previous #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The stack option string a StrataFS mount was created with, recorded on a remount beside the string the remount supplied in object.mount.options. A remount may not change the stack, and the test is a byte-for-byte comparison of the two strings, so a stack that is equivalent but written differently is refused.

Carried by:

No event carries this field yet.

B.27.99 object.mount.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The directory the mount was attached at, as an absolute path.

Carried by:

No event carries this field yet.

B.27.100 object.mount.policy #

  • Type: str.enum
  • Values: unmanaged · deny-missing · synthesize-ephemeral · synthesize-persistent
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The KACS mount policy in force, which decides what happens to an object with no stored descriptor. unmanaged means no access control at all: every check on the mount is skipped. deny-missing refuses access to an object without a descriptor. The two synthesize policies build one from the parent and the mount's template, and differ in whether it is written back to disk.

Changing a mount from deny-missing to a synthesize policy with a chosen template makes the template's author the author of every unlabelled object's access control on that volume.

Carried by:

  • kacs.mount.policy.changed

B.27.101 object.mount.policy-generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mount-policy generation in force. Every policy change increments it, and every descriptor cached under an older generation is then stale, so a change invalidates the cached descriptors of a whole volume at once.

Carried by:

  • kacs.mount.policy.changed

B.27.102 object.mount.policy-previous #

  • Type: str.enum
  • Values: unmanaged · deny-missing · synthesize-ephemeral · synthesize-persistent
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mount policy a change replaced, beside object.mount.policy, the one it put in force. A move away from deny-missing, or to unmanaged, is the one to read closely: the first lets objects without a descriptor be reached, and the second turns access control off for the whole filesystem.

Carried by:

  • kacs.mount.policy.changed

B.27.103 object.mount.policy-requested #

  • Type: str.enum
  • Values: unmanaged · deny-missing · synthesize-ephemeral · synthesize-persistent
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mount policy a caller asked for, beside object.mount.policy. On a refused change, the policy that stayed in force and the one that was wanted.

Carried by:

No event carries this field yet.

B.27.104 object.mount.root #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The filesystem root that was captured when the mount was made, and against which every later layer path is resolved. Fixed for the life of the mount, so a mounter in a chroot binds the mount to that chroot's view of the filesystem for good.

Carried by:

No event carries this field yet.

B.27.105 object.mount.strata #

  • Type: str.path[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The configured stack of strata of a StrataFS mount, as an ordered list of directory paths. Index 0 is the highest-precedence stratum: where several strata hold the same name, the one with the lowest index provides it. At most 16 entries. Each entry's position is the index that source.stratum.index and its relatives refer to.

Carried by:

No event carries this field yet.

B.27.106 object.operation.duration #

  • Type: uint.duration
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How long the operation lasted, in nanoseconds, from when it was requested to when it ended. Measured from the request, not from when it started running, so it includes any time it spent pending behind other work.

Carried by:

  • peinit.operation.ended

B.27.107 object.operation.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The peinit operation the event is about: a start, stop, restart, reload or reset of one service, from the moment it is requested to the moment it ends. The GUID is a UUIDv7.

Not the generic operation domain. operation.name and its siblings describe what any event attempted; object.operation is a thing peinit manages, and a search for one does not find the other.

Carried by:

  • peinit.graph.operation.ended
  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started
  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started

B.27.108 object.operation.merged-into.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The operation that absorbed this one. A merged operation's work is done, or not, by the operation named here, so follow it to learn the outcome.

Carried by:

  • peinit.operation.merged

B.27.109 object.operation.source #

  • Type: str.enum
  • Values: admin · boot · shutdown · dependency-propagation · restart-policy · timer · binds-to-recovery · binds-to-propagation · conflict-resolution · on-failure · tty-release
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

Who or what asked for the operation. admin is the only source a client's command produces; every other source is peinit acting for its own reasons. An admin operation is the one to tie to a person, through the access check that admitted the command.

Carried by:

  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started

B.27.110 object.operation.state #

  • Type: str.enum
  • Values: pending · running · completed · failed · merged · cancelled · aborted
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The operation's state after the event. completed, failed, merged, cancelled and aborted are terminal. cancelled means it ended while still pending and never ran; aborted means it ended while running; merged means another operation absorbed it, named in object.operation.merged-into.guid.

Carried by:

  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started

B.27.111 object.operation.type #

  • Type: str.enum
  • Values: start · stop · restart · reload · reset
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

What the operation does to its service.

Carried by:

  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started

B.27.112 object.package.architecture #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The architecture of the package an event is about: an identifier of PSPU §5.8, such as x86_64, aarch64 or noarch. noarch is a real architecture, not the absence of one. Absent when the plan did not carry one, as for a package being uninstalled.

Carried by:

  • peipkg.package.installed
  • peipkg.package.upgraded

B.27.113 object.package.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The name of the package the event is about. A package's name is its identity across every repository that serves it (PSPU §5.3), so the same package from two repositories has the same value here; source.repository.name says which one an install drew from.

A transaction that touches several packages writes one record for each, so every record names at most one package.

Carried by:

  • peipkg.action.authorised
  • peipkg.package.installed
  • peipkg.package.uninstalled
  • peipkg.package.upgraded

B.27.114 object.package.version #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The version of the package an event is about: the version installed, the version an upgrade or downgrade moved to, or the version an uninstall removed. A version of PSPU §5.5, compared by PSPU §5.6.

Carried by:

  • peipkg.package.installed
  • peipkg.package.uninstalled
  • peipkg.package.upgraded

B.27.115 object.package.version-previous #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The version a package moved from, beside object.package.version, on an upgrade, downgrade or undo. Absent on a fresh install and on an uninstall, which replace no version.

A -previous variant, which PGSS §6.4 permits without a definition. It is defined anyway so that the Events book generator, which does not apply that allowance, can resolve it.

Carried by:

  • peipkg.package.upgraded

B.27.116 object.process.core-dump #

  • Type: str.enum
  • Values: disable · user · root
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the process may dump core, as Linux's dumpable setting: disable forbids a dump, user dumps as the process's user, and root dumps readable only by root. The kernel forces disable on a PIP-protected process at exec, because a core file is a copy of the memory the protection exists to keep private.

Carried by:

No event carries this field yet.

B.27.117 object.process.core-dump-previous #

  • Type: str.enum
  • Values: disable · user · root
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The core-dump setting before the operation changed it. The pair is the whole content of a record that hardens a process at exec.

Carried by:

No event carries this field yet.

B.27.118 object.process.executable #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The executable of the process the operation acted on, resolved at exec with symbolic links followed.

Carried by:

No event carries this field yet.

B.27.119 object.process.exit-code #

  • Type: int
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The exit code of the job's process, as it passed it to exit. Present only when the process exited of its own accord; a process ended by a signal has object.process.exit-signal instead, and never both.

A non-zero code is not necessarily a failure, because a definition may name other codes as success. Whether the job failed is object.job.state.

Carried by:

  • peinit.job.ended

B.27.120 object.process.exit-signal #

  • Type: int
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The number of the signal that ended the job's process. Present only when a signal ended it; a process that exited has object.process.exit-code instead, and never both. A signal peinit sent to stop the job, such as SIGTERM or SIGKILL, appears here like any other.

Carried by:

  • peinit.job.ended

B.27.121 object.process.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the process the operation acted on. Distinct from emitter.process.guid — one record carries both when a process opens another process.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged

B.27.122 object.process.mitigations #

  • Type: uint.flags
  • Values: 0x1 WXP · 0x2 TLP · 0x4 LSV · 0x8 CFI · 0x10 UI_ACCESS · 0x20 NO_CHILD · 0x40 CFIF · 0x80 CFIB · 0x100 PIE · 0x200 SML
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The process mitigations in force after the operation, from uapi/pkm/psb.h. Applying mitigations only ever adds bits to the set. CFI is a legacy alias for CFIF and CFIB together and is never set in this field, and UI_ACCESS is reserved.

Carried by:

No event carries this field yet.

B.27.123 object.process.mitigations-added #

  • Type: uint.flags
  • Values: 0x1 WXP · 0x2 TLP · 0x4 LSV · 0x8 CFI · 0x10 UI_ACCESS · 0x20 NO_CHILD · 0x40 CFIF · 0x80 CFIB · 0x100 PIE · 0x200 SML
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The bits this operation newly turned on. Requesting a mitigation already in force is not an error, so this can be empty on a successful request.

Carried by:

No event carries this field yet.

B.27.124 object.process.mitigations-normalised #

  • Type: uint.flags
  • Values: 0x1 WXP · 0x2 TLP · 0x4 LSV · 0x8 CFI · 0x10 UI_ACCESS · 0x20 NO_CHILD · 0x40 CFIF · 0x80 CFIB · 0x100 PIE · 0x200 SML
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The request after the kernel normalised it: the CFI alias replaced by CFIF and CFIB. A request naming an unknown bit, or a CFI half the CPU does not support, fails normalisation and is refused outright.

Carried by:

No event carries this field yet.

B.27.125 object.process.mitigations-requested #

  • Type: uint.flags
  • Values: 0x1 WXP · 0x2 TLP · 0x4 LSV · 0x8 CFI · 0x10 UI_ACCESS · 0x20 NO_CHILD · 0x40 CFIF · 0x80 CFIB · 0x100 PIE · 0x200 SML
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mitigations the caller asked for, as written. Compare against object.process.mitigations-normalised to see how the kernel read the request.

Carried by:

No event carries this field yet.

B.27.126 object.process.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The kernel's name (comm) for the process the operation acted on. Lossy and truncated to 15 bytes; two processes can share a name.

Carried by:

No event carries this field yet.

B.27.127 object.process.parent.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the parent of a newly created process. Correlate on this rather than object.process.parent.pid.

Carried by:

No event carries this field yet.

B.27.128 object.process.parent.pid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The process ID of the parent of a newly created process. A fork record is written by the process that called fork or clone, so this usually equals emitter.process.pid; it differs under CLONE_PARENT, which makes the child a sibling of its creator.

Carried by:

No event carries this field yet.

B.27.129 object.process.pid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The process ID of the process the operation acted on. As with emitter.process.pid, correlate durably on the GUID instead.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • peinit.job.ended
  • peinit.job.started

B.27.130 object.process.pip.trust #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The PIP trust level of the process the operation acted on. Compared against the caller's subject.pip.trust for dominance: a caller whose trust does not dominate this is denied before the DACL is reached.

Carried by:

No event carries this field yet.

B.27.131 object.process.pip.type #

  • Type: uint.enum
  • Values: 0 None · 512 Protected · 1024 Isolated
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The Protected Isolated Process type of the process the operation acted on. Compared against the caller's subject.pip.type for dominance, so a record carrying both shows which side of the boundary each stood on.

Carried by:

No event carries this field yet.

B.27.132 object.process.shares-security #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a newly created task shares its creator's security state rather than receiving its own copy. True for a new thread (CLONE_THREAD), which shares one process state and therefore one process GUID; false for a fork, which gets a new process state and a new GUID.

Carried by:

No event carries this field yet.

B.27.133 object.process.threads #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many threads the process had when the operation ran. Read with object.process.threads-switched.

Carried by:

No event carries this field yet.

B.27.134 object.process.threads-switched #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many of the process's threads took on a new identity in the operation. A primary token install applies to every thread; a value below object.process.threads means some threads still run under the old token, a process split between two identities.

Carried by:

No event carries this field yet.

B.27.135 object.process.token-previous.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the primary token a token install displaced. With object.process.token.guid, the before and after of the process's identity.

Carried by:

No event carries this field yet.

B.27.136 object.process.token-previous.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The user SID of the token a token install displaced. Comparing it against the new token's SID is how a record shows a process changing which principal it runs as, rather than only replacing its token.

Carried by:

No event carries this field yet.

B.27.137 object.process.token.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the primary token the process holds after the operation. Carried on a token install, where it names the token the process now runs as; the token it replaced is object.process.token-previous.guid.

Carried by:

No event carries this field yet.

B.27.138 object.repository.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The repository the event is about, by the name it is configured under. The name is local configuration, not an identity: a repository is identified by its base URL, in object.repository.url, and two systems may call one repository by different names.

Carried by:

  • peipkg.action.authorised
  • peipkg.repository.added
  • peipkg.repository.reconfigured
  • peipkg.repository.removed

B.27.139 object.repository.url #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The base URL of the repository the event is about, which is what identifies it (PSPU §5.36). An HTTPS URL unless the repository was given an insecure-transport allowance, so an http: value here marks a repository whose indexes are fetched without transport security.

Carried by:

  • peipkg.repository.added

B.27.140 object.sd.cache-state #

  • Type: str.enum
  • Values: valid · missing · corrupt
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The state of the descriptor KACS holds cached for the inode. Anything but valid means the normal check could not run against the object's own descriptor; what happened instead depends on the mount policy, and a caller with SeRestorePrivilege can replace a missing or corrupt one outright.

Carried by:

No event carries this field yet.

B.27.141 object.sd.components #

  • Type: uint.flags
  • Values: 0x1 OWNER · 0x2 GROUP · 0x4 DACL · 0x8 SACL · 0x10 LABEL
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which parts of the descriptor the operation addressed, as the KACS_SECINFO_* bits of uapi/pkm/sd.h. Each part is guarded by a different right — WRITE_OWNER for the owner, WRITE_DAC for the DACL, ACCESS_SYSTEM_SECURITY for the SACL — so a record about a descriptor change is read with this.

Carried by:

  • kacs.audit.descriptor.changed
  • lcs.audit.key.descriptor.changed

B.27.142 object.sd.digest #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The SHA-256 digest of the object's security descriptor in its binary form, so that two records can be compared for "same descriptor" without either carrying the descriptor itself.

Carried by:

  • kacs.audit.descriptor.changed
  • lcs.audit.key.descriptor.changed

B.27.143 object.sd.digest-previous #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The digest of the descriptor a change replaced. Equal to object.sd.digest on a change that rewrote the descriptor without altering it.

Carried by:

  • kacs.audit.descriptor.changed
  • lcs.audit.key.descriptor.changed

B.27.144 object.sd.length #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The byte length of the object's security descriptor. Where a record names two descriptors, this is the object's own.

Carried by:

  • kacs.audit.descriptor.changed
  • kacs.descriptor.rejected
  • lcs.audit.key.created
  • lcs.audit.key.descriptor.changed

B.27.145 object.sd.length-previous #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The byte length of the descriptor a change replaced.

Carried by:

  • kacs.audit.descriptor.changed
  • lcs.audit.key.descriptor.changed

B.27.146 object.sd.mount-generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The mount-policy generation stamped on the cached descriptor when it was cached. Compared with object.mount.policy-generation: a descriptor from an older generation is stale and is discarded on next use.

Carried by:

No event carries this field yet.

B.27.147 object.sd.owner #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The owner SID on the object's security descriptor. Not the token's default owner, object.token.default-owner, which is the owner a token gives the objects it creates.

Carried by:

  • kacs.audit.descriptor.changed
  • lcs.audit.key.created
  • lcs.audit.key.descriptor.changed

B.27.148 object.sd.owner-previous #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The owner SID a change replaced. Taking ownership is how a principal gains the right to rewrite an object's DACL, so the pair is the record of who lost control of the object to whom.

Carried by:

  • kacs.audit.descriptor.changed
  • lcs.audit.key.descriptor.changed

B.27.149 object.sd.provenance #

  • Type: str.enum
  • Values: xattr · missing · synthetic · synthetic-pending · corrupt · stratafs-root
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Where the cached descriptor came from. xattr was read from the object's stored descriptor; synthetic was built from the parent and the mount's template; synthetic-pending was synthesised on a persistent mount and has not yet been written back; stratafs-root is a StrataFS root's descriptor, read through the outer inode and re-read on every check. A different vocabulary from object.sd.cache-state, held beside it on the same entry.

Carried by:

No event carries this field yet.

B.27.150 object.sd.synthesis-depth #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many ancestor directories a descriptor synthesis walked. An object with no stored descriptor inherits from its parent, which may itself need synthesising, so the walk climbs until it finds a labelled ancestor.

Carried by:

No event carries this field yet.

B.27.151 object.sd.synthesis-depth-limit #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The ceiling on object.sd.synthesis-depth, 32 levels in this kernel. A synthesis that reaches it fails closed: no descriptor is built and the access is refused, however the object's ancestors are labelled.

Carried by:

No event carries this field yet.

B.27.152 object.service.conflict.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The name of the service this one conflicts with, on a finding that two services both triggered at boot declare a conflict and so cannot both start. Which of the pair is object.service.name and which is this field carries no meaning: the conflict is mutual.

Carried by:

  • peinit.boot.downgraded
  • peinit.graph.validation.failed

B.27.153 object.service.dependency.kind #

  • Type: str.enum
  • Values: requires · wants · binds-to
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How the service depends on object.service.dependency.name. requires and binds-to are hard: the service cannot start without the dependency. binds-to is also tied to it afterwards, and stops and recovers with it.

Carried by:

  • peinit.graph.validation.failed

B.27.154 object.service.dependency.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The name of the dependency a graph finding is about: the service this one requires and cannot have, or the one whose block has blocked it. Read object.service.dependency.kind for how this service depends on it.

The name is as the definition wrote it. A missing-dependency finding names a service that does not exist, so do not expect to find any other record about it.

Carried by:

  • peinit.graph.validation.failed

B.27.155 object.service.dependents #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The services that hard-depend on this one, by name. Hard dependencies are requires and binds-to; a wants dependent is not listed, because it starts whether or not this service does.

Carried by:

  • peinit.graph.validation.warned

B.27.156 object.service.failed #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

Whether an internal error in peinit failed the service it occurred on. False means peinit contained the error without changing the service's state. Either way the fault was peinit's, not the service's.

Carried by:

  • peinit.internal-error.contained

B.27.157 object.service.generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The service's activation generation: a counter peinit advances each time the service enters starting, so that every incarnation of a service has its own number. Records with the same object.service.name and the same generation describe one run of the service.

The same counter as object.job.activation-generation, seen from the service rather than from one of its jobs. It is held in memory and starts again when peinit does, so it orders runs within one boot only.

Carried by:

  • peinit.service.abandoned

B.27.158 object.service.health-check.interval #

  • Type: uint.duration
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The configured interval between health checks, in nanoseconds. Configured in whole seconds, so it is always a whole number of seconds.

Carried by:

  • peinit.graph.validation.failed

B.27.159 object.service.health-check.restart-window #

  • Type: uint.duration
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The configured restart window of a health check, in nanoseconds. Configured in whole seconds, so it is always a whole number of seconds. A validation finding carries it beside object.service.health-check.interval and object.service.health-check.retries, because it is their combination that a definition gets wrong.

Carried by:

  • peinit.graph.validation.failed

B.27.160 object.service.health-check.retries #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The configured number of consecutive health-check failures at which peinit stops reporting the service unhealthy and acts on it. Failures short of this count change nothing but the service's health.

Carried by:

  • peinit.graph.validation.failed

B.27.161 object.service.name #

  • Type: str
  • Asserted: yes
  • Carried in: the payload
  • Defined in: peinit.evman

The name of the service the event is about, as its definition names it. The same value peinit passes as the object name in the KACS audit context when it checks a caller's access to a service, so a peinit record and the access-check record for the same command join on it.

On a kacs.audit.access.checked record the value is peinit's claim, copied by the kernel from the check's audit context {kind: "service", service: {name}}, so that record also carries fields.attestation.userspace.

A name, not a durable identity: a service removed and later redefined under the same name is a different service with the same object.service.name. Read object.service.generation beside it to tell one activation from the next.

Carried by:

  • authd.service.attested
  • peinit.boot.downgraded
  • peinit.cgroup.leaked
  • peinit.critical-service.failed
  • peinit.event.dropped
  • peinit.fd-store.rejected
  • peinit.graph.operation.ended
  • peinit.graph.validation.failed
  • peinit.graph.validation.warned
  • peinit.internal-error.contained
  • peinit.job.created
  • peinit.job.ended
  • peinit.job.started
  • peinit.on-failure.suppressed
  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started
  • peinit.service.abandoned
  • peinit.service.reload.timed-out

B.27.162 object.service.on-failure-chain #

  • Type: str[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The OnFailure handlers already started in the chain that peinit cut short, in the order they were started. A chain is cut when the next handler is already in it, which is a loop, or when it has reached sixteen handlers.

Carried by:

  • peinit.on-failure.suppressed

B.27.163 object.service.on-failure.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The OnFailure handler peinit declined to start, because starting it would have looped or gone too deep. The failure the handler was meant to handle went unhandled, so look for it here when a handler did not run.

Carried by:

  • peinit.on-failure.suppressed

B.27.164 object.service.state #

  • Type: str.enum
  • Values: inactive · starting · active · reloading · stopping · completed · backoff · failed · abandoned · skipped
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The service's state after the event, in the vocabulary of the control channel (PSPU §4.B). Exactly four states satisfy dependents: active, reloading, completed and skipped. Use that set and no other when asking whether something depending on this service could be running.

abandoned means a process survived SIGKILL and is still there, unkillably. It is not a stopped service.

Carried by:

  • peinit.service.abandoned

B.27.165 object.service.state-previous #

  • Type: str.enum
  • Values: inactive · starting · active · reloading · stopping · completed · backoff · failed · abandoned · skipped
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The service's state before the event, with the same values as object.service.state. The two together are the transition; a record carrying only one of them says where the service is, not how it got there.

Carried by:

  • peinit.service.abandoned

B.27.166 object.service.timer.schedule #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The service's timer schedule, exactly as its definition wrote it. On a finding that the schedule does not parse, this is the text that failed, so it may not be a valid schedule at all.

Carried by:

  • peinit.graph.validation.failed

B.27.167 object.service.transition-cause #

  • Type: str.enum
  • Values: explicit-start · dependency-start · restart-policy · binds-to-recovery · timer · explicit-stop · explicit-reload · explicit-reset · conflict-eviction · binds-to-propagation · shutdown-wave · process-crash · clean-exit · clean-exit-restart · readiness-timeout · watchdog-timeout · health-check-failure · pre-hook-failure · parent-setup-failure · pre-exec-failure · dependency-failure · restart-budget-exhausted · cycle-detected · validation-error · assertion-error · condition-skipped · tty-unavailable · process-unkillable · internal-error
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

Why the service's state changed. The causes beginning explicit- follow an operator's command; the rest are peinit's own reasons, and an operator reading one has learned what the manager did, not what anyone asked for.

internal-error is a fault in peinit, not in the service. The service was failed because peinit could not carry out a step on its behalf; the service itself may have been healthy.

Carried by:

  • peinit.service.abandoned

B.27.168 object.service.type #

  • Type: str.enum
  • Values: simple · oneshot
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How the service's main process is supervised. A simple service is up while its process runs; a oneshot service runs to completion and is then completed. Health checks are scheduled for simple services only, which is why a validation finding names the type.

Carried by:

  • peinit.graph.validation.failed

B.27.169 object.session.auth-package #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The name of the authentication package that established the session, as the creator supplied it. Not interpreted by the kernel.

Carried by:

  • authd.logon.attempted
  • kacs.session.destroyed

B.27.170 object.session.id #

  • Type: uint.luid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The LUID of the logon session the operation acted on. The same value as subject.token.auth-id and object.token.auth-id on records about tokens in that session, which is how a session's records are joined to everything done under it.

Carried by:

  • authd.logon.attempted
  • authd.service.attested
  • authd.session.ended
  • kacs.session.destroyed

B.27.171 object.session.logon-time #

  • Type: uint.time
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

When the session was established.

Carried by:

  • kacs.session.destroyed

B.27.172 object.session.logon-type #

  • Type: str.enum
  • Values: interactive · network · batch · service · network-cleartext · new-credentials · remote-interactive
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

What kind of logon the session represents, from the KACS_LOGON_TYPE_* values in uapi/pkm/token.h. The kernel refuses to create a session of any other type.

Carried by:

  • authd.logon.attempted
  • authd.session.ended
  • kacs.session.destroyed

B.27.173 object.session.reference-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many live tokens or other references the session still holds. A session is destroyed when this reaches zero; on a refused destroy, a non-zero count is why.

Carried by:

No event carries this field yet.

B.27.174 object.session.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The logon SID the kernel synthesised for the session. Derived from object.session.id, but it appears in descriptors as a principal in its own right, so a search by SID has to find it here.

Carried by:

No event carries this field yet.

B.27.175 object.session.user.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The user SID of the principal the logon session belongs to: whose session it is. Not object.session.sid, which is the logon SID synthesised for the session itself; a search for what one user's sessions did matches this field, and a search for one session matches that one.

Carried by:

  • authd.session.ended
  • kacs.session.destroyed

B.27.176 object.socket.address #

  • Type: str.ip
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The address a listening socket is bound to. A wildcard address (0.0.0.0 or ::) is a legitimate value: it means every address on the machine.

Carried by:

No event carries this field yet.

B.27.177 object.socket.id #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The identity of the socket the operation acted on.

Not emitted today. Peios publishes no stable socket identifier; the kernel's inode number and pointer are both unsuitable, so records name a socket only by its kind and, for a listener, its address and port.

Carried by:

No event carries this field yet.

B.27.178 object.socket.identity-dropped #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a conveyed identity was dropped because the receiver's control buffer was too small to hold it. The message is delivered either way, so true means the receiver got data with no identity attached and could not tell.

Carried by:

No event carries this field yet.

B.27.179 object.socket.impersonation-limit #

  • Type: uint.enum
  • Values: 0 Anonymous · 1 Identification · 2 Impersonation · 3 Delegation
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The highest impersonation level the socket will convey to a peer. Raising it to Impersonation or Delegation lets a receiver act as the sender, not merely identify it.

Carried by:

No event carries this field yet.

B.27.180 object.socket.options #

  • Type: uint.flags
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The options of a listening socket: whether it is one of an SO_REUSEPORT group, whether an IPv6 socket refuses IPv4-mapped traffic, and whether a bound UDP socket is also connected to one peer. The kernel reports these today as three separate booleans, and no bit assignment for them is defined yet.

Carried by:

No event carries this field yet.

B.27.181 object.socket.port #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The port a listening socket is bound to. A listener has one port, which is neither a source nor a destination, so it is not source.port or destination.port; a search for a port number should cover all three.

Carried by:

No event carries this field yet.

B.27.182 object.socket.principal-kind #

  • Type: str.enum
  • Values: unstamped · program · kernel
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

What kind of principal governs the socket for network policy. program is a process, whose token and process facts were stamped on the socket; kernel is a kernel socket, with no token. unstamped is a socket that was never stamped, so network policy has nobody to attribute its traffic to.

Carried by:

No event carries this field yet.

B.27.183 object.socket.reservation #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The port-reservation selector a bind matched, naming the reservation whose descriptor decided whether the caller could bind the port. Peios replaces the privileged-port floor with these reservations entirely, so this is the rule that let a process listen on its port.

Carried by:

No event carries this field yet.

B.27.184 object.socket.state #

  • Type: str.enum
  • Values: free · unconnected · connecting · connected · disconnecting
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The socket's connection state, from the Linux SS_* value with its prefix removed and folded to lower case. A listening socket reads unconnected here: listening is a transport state, not a connection state.

Carried by:

No event carries this field yet.

B.27.185 object.socket.token-delivered #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the conveyed token actually reached the receiver. False means the message arrived and the identity did not.

Carried by:

No event carries this field yet.

B.27.186 object.socket.token-derived #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the token conveyed on a send was derived from the sender's token rather than passed as is, so the receiver did not get the sender's token itself.

Carried by:

No event carries this field yet.

B.27.187 object.socket.token-passing #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether automatic per-send token passing is on for the socket: whether every send carries the sender's identity to the receiver without being asked.

Carried by:

No event carries this field yet.

B.27.188 object.socket.type #

  • Type: str.enum
  • Values: stream · dgram · raw · rdm · seqpacket
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The socket's type, from the Linux SOCK_* value with its prefix removed and folded to lower case.

Carried by:

No event carries this field yet.

B.27.189 object.thread.tid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

A thread the operation acted on, where it is not the emitting thread: the target of a per-thread impersonation or of a thread-token open.

Carried by:

No event carries this field yet.

B.27.190 object.token.auth-id #

  • Type: uint.luid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The LUID of the logon session the token the operation acted on belongs to. The same value as object.session.id on that session's own records.

Carried by:

  • kacs.impersonation.started

B.27.191 object.token.capabilities #

  • Type: bin.sid[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The confinement capability SIDs (S-1-15-3-…) of the token the operation acted on. Unrelated to Linux capabilities.

Carried by:

No event carries this field yet.

B.27.192 object.token.default-owner #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The owner SID the token stamps on objects it creates. Changing it changes who owns everything the token makes from then on, which is why a default adjustment is worth a record.

Carried by:

No event carries this field yet.

B.27.193 object.token.elevation #

  • Type: str.enum
  • Values: default · full · limited
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The token's role in a split elevation pair. full is the elevated half and limited the filtered one; default is a token that belongs to no pair. The other half of a pair is object.token.linked.guid.

Carried by:

No event carries this field yet.

B.27.194 object.token.gid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The Linux GID the token the operation acted on projects onto.

Carried by:

No event carries this field yet.

B.27.195 object.token.group-attributes #

  • Type: uint.flags[]
  • Values: SE_GROUP_MANDATORY · SE_GROUP_ENABLED_BY_DEFAULT · SE_GROUP_ENABLED · SE_GROUP_OWNER · SE_GROUP_USE_FOR_DENY_ONLY · SE_GROUP_INTEGRITY · SE_GROUP_INTEGRITY_ENABLED · SE_GROUP_RESOURCE · SE_GROUP_LOGON_ID
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Per-group attribute bitmasks of the token the operation acted on, positionally parallel to object.token.groups: groups[i] is described by group-attributes[i]. A group adjustment changes these and not the SIDs, so a record of one is read here.

Carried by:

No event carries this field yet.

B.27.196 object.token.groups #

  • Type: bin.sid[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The group SIDs of the token the operation acted on. Read with object.token.group-attributes, which says which of them are enabled.

Carried by:

No event carries this field yet.

B.27.197 object.token.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the token the operation acted on. Distinct from emitter.token.guid — one record carries both when a token is used to open or adjust another token.

Carried by:

  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • kacs.impersonation.reverted
  • kacs.impersonation.started

B.27.198 object.token.id #

  • Type: uint.luid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The LUID of the token the operation acted on, for token-open and token-adjust checks.

Carried by:

  • authd.logon.attempted
  • authd.service.attested
  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.privilege.used
  • kacs.caap.sacl.skipped
  • kacs.caap.staging.diverged
  • kacs.impersonation.started

B.27.199 object.token.impersonation #

  • Type: uint.enum
  • Values: 0 Anonymous · 1 Identification · 2 Impersonation · 3 Delegation
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The impersonation level of the token the operation acted on. A primary token reports 0, so read object.token.type before reading 0 as Anonymous.

Carried by:

  • kacs.impersonation.started

B.27.200 object.token.impersonation-permitted #

  • Type: uint.enum
  • Values: 0 Anonymous · 1 Identification · 2 Impersonation · 3 Delegation
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The impersonation level a gate computed as permitted. Where it is below object.token.impersonation, the level was silently reduced: the caller lacked the privilege to impersonate at the full level, or the client's integrity was higher than the caller's. The operation still succeeds, at the lower level.

Carried by:

  • kacs.impersonation.started

B.27.201 object.token.integrity #

  • Type: uint.integrity
  • Values: 0 Untrusted · 4096 Low · 8192 Medium · 12288 High · 16384 System
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The integrity level of the token the operation acted on, as an integrity RID.

Carried by:

  • kacs.impersonation.started

B.27.202 object.token.interactive-session #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The interactive-session scope the token is bound to, which separates the interactive sessions of one machine from each other. 0 means the token is bound to no interactive session.

Carried by:

No event carries this field yet.

B.27.203 object.token.linked.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the other token in a linked elevation pair. Carried where two tokens are linked, so the record names both halves.

Carried by:

No event carries this field yet.

B.27.204 object.token.primary-group #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The primary-group SID the token stamps on objects it creates, beside object.token.default-owner.

Carried by:

No event carries this field yet.

B.27.205 object.token.privileges #

  • Type: uint.flags
  • Values: 0x4 KACS_SE_CREATE_TOKEN_PRIVILEGE · 0x8 KACS_SE_ASSIGN_PRIMARY_TOKEN_PRIVILEGE · 0x10 KACS_SE_LOCK_MEMORY_PRIVILEGE · 0x20 KACS_SE_INCREASE_QUOTA_PRIVILEGE · 0x80 KACS_SE_TCB_PRIVILEGE · 0x100 KACS_SE_SECURITY_PRIVILEGE · 0x200 KACS_SE_TAKE_OWNERSHIP_PRIVILEGE · 0x400 KACS_SE_LOAD_DRIVER_PRIVILEGE · 0x800 KACS_SE_SYSTEM_PROFILE_PRIVILEGE · 0x1000 KACS_SE_SYSTEMTIME_PRIVILEGE · 0x2000 KACS_SE_PROFILE_SINGLE_PROCESS_PRIVILEGE · 0x4000 KACS_SE_INCREASE_BASE_PRIORITY_PRIVILEGE · 0x20000 KACS_SE_BACKUP_PRIVILEGE · 0x40000 KACS_SE_RESTORE_PRIVILEGE · 0x80000 KACS_SE_SHUTDOWN_PRIVILEGE · 0x100000 KACS_SE_DEBUG_PRIVILEGE · 0x200000 KACS_SE_AUDIT_PRIVILEGE · 0x800000 KACS_SE_CHANGE_NOTIFY_PRIVILEGE · 0x1000000 KACS_SE_REMOTE_SHUTDOWN_PRIVILEGE · 0x10000000 KACS_SE_MANAGE_VOLUME_PRIVILEGE · 0x20000000 KACS_SE_IMPERSONATE_PRIVILEGE · 0x100000000 KACS_SE_RELABEL_PRIVILEGE · 0x800000000 KACS_SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The privileges the token the operation acted on holds, as the flags of its 64-bit privilege word: bit n is the privilege whose LUID is n.

Carried by:

  • authd.service.attested

B.27.206 object.token.privileges-enabled #

  • Type: uint.flags
  • Values: 0x4 KACS_SE_CREATE_TOKEN_PRIVILEGE · 0x8 KACS_SE_ASSIGN_PRIMARY_TOKEN_PRIVILEGE · 0x10 KACS_SE_LOCK_MEMORY_PRIVILEGE · 0x20 KACS_SE_INCREASE_QUOTA_PRIVILEGE · 0x80 KACS_SE_TCB_PRIVILEGE · 0x100 KACS_SE_SECURITY_PRIVILEGE · 0x200 KACS_SE_TAKE_OWNERSHIP_PRIVILEGE · 0x400 KACS_SE_LOAD_DRIVER_PRIVILEGE · 0x800 KACS_SE_SYSTEM_PROFILE_PRIVILEGE · 0x1000 KACS_SE_SYSTEMTIME_PRIVILEGE · 0x2000 KACS_SE_PROFILE_SINGLE_PROCESS_PRIVILEGE · 0x4000 KACS_SE_INCREASE_BASE_PRIORITY_PRIVILEGE · 0x20000 KACS_SE_BACKUP_PRIVILEGE · 0x40000 KACS_SE_RESTORE_PRIVILEGE · 0x80000 KACS_SE_SHUTDOWN_PRIVILEGE · 0x100000 KACS_SE_DEBUG_PRIVILEGE · 0x200000 KACS_SE_AUDIT_PRIVILEGE · 0x800000 KACS_SE_CHANGE_NOTIFY_PRIVILEGE · 0x1000000 KACS_SE_REMOTE_SHUTDOWN_PRIVILEGE · 0x10000000 KACS_SE_MANAGE_VOLUME_PRIVILEGE · 0x20000000 KACS_SE_IMPERSONATE_PRIVILEGE · 0x100000000 KACS_SE_RELABEL_PRIVILEGE · 0x800000000 KACS_SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which of the privileges in object.token.privileges are enabled, as flags in the same bit layout. A privilege adjustment changes this, not the held set.

Carried by:

No event carries this field yet.

B.27.207 object.token.restricted #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the token is restricted: whether it carries restricting SIDs that every access check must also satisfy.

Carried by:

  • kacs.impersonation.started

B.27.208 object.token.restricting-sids #

  • Type: bin.sid[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The restricting SIDs on a filtered token: the second list an access check must also satisfy before a restricted token is granted anything. Carried where a token is filtered, or where a filtered token is acted on.

Carried by:

No event carries this field yet.

B.27.209 object.token.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The user SID of the token the operation acted on. On a record where one principal handles another's token — duplicating, filtering or installing it — this is the principal the token speaks for, and subject.token.sid the one who handled it.

Carried by:

  • authd.service.attested
  • kacs.impersonation.reverted
  • kacs.impersonation.started

B.27.210 object.token.supplementary-gid-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many supplementary GIDs the token's Linux projection carries. A token naming more groups than Linux can hold fails projection with -E2BIG, and this is the count that was too many.

Carried by:

No event carries this field yet.

B.27.211 object.token.type #

  • Type: str.enum
  • Values: primary · impersonation
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the token the operation acted on is a primary token or an impersonation token. As with subject.token.type, needed to read object.token.impersonation: a primary token also reports 0 there.

Carried by:

  • kacs.impersonation.started

B.27.212 object.token.uid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The Linux UID the token the operation acted on projects onto. A projection for interoperability, never the identity KACS decides on.

Carried by:

No event carries this field yet.

B.27.213 object.token.user-deny-only #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the token's user SID is deny-only: it matches deny ACEs but never allow ACEs, so the token gets nothing through its own user identity.

Carried by:

No event carries this field yet.

B.27.214 object.token.write-restricted #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the token is write-restricted: its restricting SIDs apply only to write access, and reads are decided as for an unrestricted token.

Carried by:

No event carries this field yet.

B.27.215 object.watch.depth-limit #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The maximum depth beneath its key at which a subtree watch reports changes. 0 means unbounded, and 0 is the default. The limit is the machine-wide MaxSubtreeWatchDepth setting rather than anything the watcher chose, so changes deeper than it are suppressed for every subtree watch at once.

Carried by:

No event carries this field yet.

B.27.216 object.watch.effects #

  • Type: uint.flags
  • Values: 0x1 layer-delete
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The internal effects that a registry commit triggered through the kernel's own configuration watches. layer-delete means the watch dispatch for the commit already handled a layer deletion, so the commit skips its own separate layer-delete step. Absent when the commit triggered none.

Carried by:

No event carries this field yet.

B.27.217 object.watch.event #

  • Type: str.enum
  • Values: value-set · value-deleted · subkey-created · subkey-deleted · sd-changed · key-deleted · overflow
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The type of a registry watch event, named from its REG_WATCH_* constant with the prefix removed. overflow replaces individual events when they could not all be delivered, telling the watcher only that it missed something and must re-read the key.

An overflow does not always mean a full queue. It is also queued when a single event could not be encoded, so a watcher seeing one cannot tell which happened.

Carried by:

No event carries this field yet.

B.27.218 object.watch.filter #

  • Type: uint.flags
  • Values: 0x1 REG_NOTIFY_VALUE · 0x2 REG_NOTIFY_SUBKEY · 0x4 REG_NOTIFY_SD
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The categories of change a process asked a registry watch to report: value changes, subkey creation and deletion, and security descriptor changes. A watcher is told only of changes in the categories it set.

Carried by:

No event carries this field yet.

B.27.219 object.watch.subtree #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether a registry watch covers the whole subtree beneath its key rather than the key alone. How deep a subtree watch reaches is object.watch.depth-limit, and that limit is unbounded by default.

Carried by:

No event carries this field yet.

B.27.220 object.xattr.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The name of an extended attribute the operation acted on, in full with its namespace prefix, such as security.capability. The names Peios reserves for its own descriptors and markers are refused or hidden whatever the caller's access.

Carried by:

No event carries this field yet.

Generated from eventd.evman, gxwid.evman, kernel.evman, lcs.evman, lpsd.evman, peinit.evman, peipkg.evman, stratafs.evman, trustd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.28 operation.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under operation, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.28.1 operation.adopted #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether an operation took over an object that already existed in the target stratum instead of creating a new one. An adopted object keeps whatever it already had, so an adoption where a creation was expected is worth reading closely.

Carried by:

No event carries this field yet.

B.28.2 operation.anonymous #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether an object was created through the anonymous path, an unnamed temporary file (O_TMPFILE) that has no name in any stratum until it is linked in.

Carried by:

No event carries this field yet.

B.28.3 operation.arguments #

  • Type: uint[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The numeric arguments of the command in operation.code, in order, such as the prctl arguments after the option.

Carried by:

No event carries this field yet.

B.28.4 operation.attempts #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many attempts the operation made before it gave up.

Carried by:

No event carries this field yet.

B.28.5 operation.attributes-copied #

  • Type: uint.flags
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The metadata attributes a copy-up carried across from the original object to the copy. Copy-up carries the modification time, the mode (except on a symbolic link, whose mode the VFS fixes), the owning UID and GID, and the extended attributes other than StrataFS's own. The bit assignments are not yet defined, so this field declares no values until they are.

Carried by:

No event carries this field yet.

B.28.6 operation.available #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many items existed for the operation to return. Read with operation.returned.

Carried by:

No event carries this field yet.

B.28.7 operation.bytes #

  • Type: uint.bytes
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many bytes the operation moved before it stopped. On a Unix stream socket, a read is cut short where the sender's conveyed identity changes, and this is the only explanation the reader has for a short read.

Carried by:

No event carries this field yet.

B.28.8 operation.clone-flags #

  • Type: uint.flags
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The Linux CLONE_* flags a new task was created with. CLONE_THREAD decides whether the new task shares its creator's security state, which object.process.shares-security records.

Carried by:

No event carries this field yet.

B.28.9 operation.code #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The command or opcode within the operation, such as an ioctl command or a prctl option. Its vocabulary depends on operation.name, so the two are read together.

Carried by:

No event carries this field yet.

B.28.10 operation.compat #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the call came in through the 32-bit compatibility entry point.

Carried by:

No event carries this field yet.

B.28.11 operation.contents-copied #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a copy-up copied an object's contents or only created the node. Always false for a directory, whose entries are not copied. Read with the object's type before assuming a copy-up moved any data.

Carried by:

No event carries this field yet.

B.28.12 operation.copy-up-generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The generation of the current copy-up phase. Incremented each time a phase is armed, so a handle carrying an older generation is stale. Unrelated to object.mount.policy-generation.

Carried by:

No event carries this field yet.

B.28.13 operation.copy-up-phase #

  • Type: str.enum
  • Values: none · source-read · create · populate · publish-link · publish-rename · cleanup · orphan-marker
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The phase of an in-flight StrataFS copy-up. KACS admits the copy-up's own operations without a caller check only while they match the armed phase, so a refusal here is a copy-up that tried something its phase does not allow.

Carried by:

No event carries this field yet.

B.28.14 operation.create-disposition #

  • Type: str.enum
  • Values: supersede · open · create · open-if · overwrite · overwrite-if
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

What a native open was told to do about an existing or missing file, from the KACS_DISPOSITION_* values. supersede and overwrite destroy an existing file's content; open fails if the file is missing and create fails if it exists.

Carried by:

No event carries this field yet.

B.28.15 operation.create-options #

  • Type: uint.flags
  • Values: 0x1 DIRECTORY · 0x2 DELETE_ON_CLOSE
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The create options of a native open, from the KACS_CREATE_OPT_* bits. DELETE_ON_CLOSE schedules the file's removal when the last handle that requested it is closed.

Carried by:

No event carries this field yet.

B.28.16 operation.decision #

  • Type: str.enum
  • Values: primary · parent-fallback · source · dest · delete-existing
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which sub-decision of a namespace operation the record concerns, from the KACS_NS_* codes. A single-decision operation reports primary; a delete refused on the object can still be allowed by DELETE_CHILD on the parent, parent-fallback; a rename produces up to three records, for the source, the destination parent, and an existing destination it replaces.

Carried by:

No event carries this field yet.

B.28.17 operation.duration #

  • Type: uint.duration
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How long the operation took.

Carried by:

No event carries this field yet.

B.28.18 operation.entry-point #

  • Type: str.enum
  • Values: mount · directory-open · rmdir · staging-lookup · copy-up
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The operation that set off recovery of orphaned staging entries, the partial copies an interrupted copy-up leaves in the create stratum. mount sweeps the create stratum's root when the mount is made; directory-open and rmdir sweep the directory concerned; copy-up sweeps the destination's parent first; staging-lookup fires when a path lookup names an entry that looks like a staging name.

staging-lookup is the one an unprivileged process can trigger at will, by looking up such a name.

Carried by:

No event carries this field yet.

B.28.19 operation.exec-unsafe #

  • Type: uint.flags
  • Values: 0x1 LSM_UNSAFE_SHARE · 0x2 LSM_UNSAFE_PTRACE · 0x4 LSM_UNSAFE_NO_NEW_PRIVS
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The kernel's unsafe-exec flags (bprm->unsafe) at an exec. Under PTRACE or NO_NEW_PRIVS, an exec may not raise the process's trust, and a signature-derived label is capped instead.

Carried by:

No event carries this field yet.

B.28.20 operation.failed-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many items in a batch operation failed. With operation.succeeded-count, the whole batch; a non-zero count here on a record whose outcome.success is true is a partial success.

Carried by:

  • peipkg.repository.refreshed

B.28.21 operation.fd #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The file descriptor a bulk operation transferred through — the sink a backup was written to, or the source a restore was read from. Direction is given by the event, not by this field.

Carried by:

  • lcs.audit.backup.started
  • lcs.audit.restore.started

B.28.22 operation.gid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The GID a setgid-family call asked for.

Carried by:

No event carries this field yet.

B.28.23 operation.linux-projection #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the Linux identity projection — UID, GID and supplementary groups — was recomputed as part of a token install. False means the process's Linux credentials still reflect the previous token.

Carried by:

No event carries this field yet.

B.28.24 operation.lsm-flags #

  • Type: uint.flags
  • Values: 0x1 LSM_SETID_ID · 0x2 LSM_SETID_RE · 0x4 LSM_SETID_RES · 0x8 LSM_SETID_FS
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which variant of a legacy set-identity call was made, as the kernel's LSM_SETID_* flags: setuid, setreuid, setresuid or setfsuid, and the gid equivalents. 0 for setgroups.

Carried by:

No event carries this field yet.

B.28.25 operation.name #

  • Type: str.enum
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which operation was attempted. Each event declares the names its enforcement point uses, and the sets are disjoint where two points could be confused: FACS names operations on an already-open handle with a file. prefix, and StrataFS names its own without one.

Carried by:

  • kacs.audit.handle.used
  • kacs.audit.privilege.used
  • kacs.caap.policy.changed
  • kacs.impersonation.reverted
  • lcs.audit.key.tombstoned
  • lpsd.account.modified
  • lpsd.credential.changed
  • lpsd.credential.verified
  • peipkg.action.authorised
  • stratafs.mutation.refused
  • timed.clock.stepped

B.28.26 operation.name-truncated #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a name in the record could not be carried in full and was cut short. When true, do not search for the name exactly: the full name is longer than what the record holds.

Carried by:

No event carries this field yet.

B.28.27 operation.non-blocking #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a path walk was in RCU mode, the kernel's non-blocking lookup. StrataFS refuses every RCU-mode step, so the kernel retries the walk in blocking mode; a record with this set is the refusal, not a failure the caller sees.

Carried by:

No event carries this field yet.

B.28.28 operation.open-flags #

  • Type: uint.flags
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The open flags the caller asked for, as the Linux O_* bits of the flags argument. The rights these imply are what KACS checks; access.requested-minimum records the least of them.

Carried by:

No event carries this field yet.

B.28.29 operation.open-flags-effective #

  • Type: uint.flags
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The open flags StrataFS used against the stratum below, after rewriting the flags the caller asked for, which operation.open-flags holds and whose O_* values decode this one too. Where the object is not written in place, a write open of a regular file is reopened read-only without O_APPEND, and O_TRUNC is dropped, until a write copies the object up.

The difference between the two fields is the finding: a caller that asked to truncate a file may hold a descriptor on which nothing has been truncated yet.

Carried by:

No event carries this field yet.

B.28.30 operation.profiling-scope #

  • Type: str.enum
  • Values: single-process · system-wide
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The scope of a profiling authorisation. system-wide samples every process, PIP-protected ones included, and needs SeSystemProfilePrivilege; single-process profiles one other process and needs SeProfileSingleProcessPrivilege.

Carried by:

No event carries this field yet.

B.28.31 operation.ptrace-initiator #

  • Type: str.enum
  • Values: tracer · tracee
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which side began a ptrace relationship. tracer is a debugger attaching to another process; tracee is a process inviting its parent to control it, with PTRACE_TRACEME.

Carried by:

No event carries this field yet.

B.28.32 operation.reentry-depth #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The nesting depth of the kernel's own re-entry into descriptor storage: a read or write of a descriptor attribute that passes back through the security hooks, as happens through a stacking filesystem. Not the depth of a directory walk, which is object.sd.synthesis-depth.

Carried by:

No event carries this field yet.

B.28.33 operation.rename-flags #

  • Type: uint.flags
  • Values: 0x1 RENAME_NOREPLACE · 0x2 RENAME_EXCHANGE · 0x4 RENAME_WHITEOUT
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The flags a caller passed to renameat2. StrataFS always refuses RENAME_WHITEOUT with EINVAL, so a record carrying that bit is a refusal however the rest of the rename looked.

Carried by:

No event carries this field yet.

B.28.34 operation.replaced #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the operation silently replaced something that was already there, such as a link between tokens that displaced an existing pair.

Carried by:

No event carries this field yet.

B.28.35 operation.returned #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many items the operation returned. Fewer than operation.available means the result was truncated.

Carried by:

No event carries this field yet.

B.28.36 operation.route #

  • Type: str.enum
  • Values: in-place · copy-up · read-only
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How StrataFS routed a mutation of an existing object. in-place wrote the object in the stratum that provides it. copy-up first copied it into the create stratum and wrote the copy. read-only refused it with EROFS, because the object's stratum does not accept writes and no copy-up was possible.

read-only has several causes, among them a read-only mount, no create stratum, and an object that cannot be copied, and this field does not say which.

Carried by:

No event carries this field yet.

B.28.37 operation.setattr-mask #

  • Type: uint.flags
  • Values: 0x1 ATTR_MODE · 0x2 ATTR_UID · 0x4 ATTR_GID · 0x8 ATTR_SIZE · 0x10 ATTR_ATIME · 0x20 ATTR_MTIME · 0x40 ATTR_CTIME · 0x80 ATTR_ATIME_SET · 0x100 ATTR_MTIME_SET · 0x200 ATTR_FORCE · 0x400 ATTR_CTIME_SET · 0x800 ATTR_KILL_SUID · 0x1000 ATTR_KILL_SGID · 0x2000 ATTR_FILE · 0x4000 ATTR_KILL_PRIV · 0x8000 ATTR_OPEN · 0x10000 ATTR_TIMES_SET · 0x20000 ATTR_TOUCH · 0x40000 ATTR_DELEG
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which attributes a setattr asked to change, as the kernel's ATTR_* bits. These bits are internal to the Linux kernel rather than part of its ABI, so they are decoded against the kernel version that wrote the record. ATTR_SIZE with ATTR_OPEN is a truncate from open with O_TRUNC, not an explicit truncate call.

Carried by:

No event carries this field yet.

B.28.38 operation.settled-view #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a record concerns a directory view settled when its descriptor was opened, rather than a live resolution of the merged path. A settled view keeps the listing and strata it was opened with, and goes on answering from them after a rename and when the descriptor is passed to another process, so it can disagree with what the path resolves to now.

Carried by:

No event carries this field yet.

B.28.39 operation.signal #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The signal number of a signal delivery decision. The signal decides which process right is required, so a refusal is read with it.

Carried by:

No event carries this field yet.

B.28.40 operation.site #

  • Type: str.enum
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which system call or kernel gate the record came from. Peios adds about thirty access checks to Linux call sites — many of them re-checks on an already-open file descriptor, added because an open descriptor used to be a way round the check — and a refusal is only useful if it says which one fired. Each event declares the sites it can come from.

Carried by:

No event carries this field yet.

B.28.41 operation.stacked-create #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the object's real inode was created by a stacking filesystem below StrataFS rather than directly by the stratum's own filesystem. When true, a different filesystem's hooks ran on the creation, which changes which hook stamped the object's security descriptor.

Carried by:

No event carries this field yet.

B.28.42 operation.stage #

  • Type: str.enum
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which internal stage of a multi-step operation the record concerns. Several unrelated operations have stages, with nothing in common between their vocabularies, so each event declares its own.

Carried by:

  • peinit.internal-error.contained

B.28.43 operation.stage-requested #

  • Type: str.enum
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The stage that was asked for while another, operation.stage, was still active. Drawn from the same vocabulary as operation.stage on the same event, which declares it.

Carried by:

No event carries this field yet.

B.28.44 operation.strata #

  • Type: uint.flags
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The set of strata taking part in a merged operation, as flags with one bit per stratum: bit 0 is the stratum at index 0, the highest-precedence one. A merged directory's listing, for example, draws on every stratum whose bit is set.

Carried by:

No event carries this field yet.

B.28.45 operation.succeeded-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

How many items in a batch operation succeeded.

Carried by:

  • peipkg.repository.refreshed
  • peipkg.transaction.recovered

B.28.46 operation.timeout #

  • Type: uint.duration
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The timeout that applied to the operation. On an operation that timed out, operation.duration will have reached it.

Carried by:

No event carries this field yet.

B.28.47 operation.uid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The UID a setuid-family call asked for. Peios does not let such a call change identity; the record shows what was attempted.

Carried by:

No event carries this field yet.

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.29 outcome.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under outcome, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.29.1 outcome.address #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The user-space address that faulted when the kernel tried to copy from or to it. Meaningful only within the faulting process's address space, and only until that address space changes.

Carried by:

No event carries this field yet.

B.29.2 outcome.cleanup #

  • Type: str.enum
  • Values: succeeded · failed · declined
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The outcome of the compensating action StrataFS took to undo part of a failed operation, such as removing an object it had just created. declined means StrataFS deliberately did not undo it, because the name no longer referred to the object it had created and removing it could have removed someone else's.

Both failed and declined leave an object behind in the stratum that nothing in the merged view accounts for.

Carried by:

No event carries this field yet.

B.29.3 outcome.data-lost #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the outcome a record describes destroyed data, rather than only failing to do what was asked. Set this aside from ordinary failures: a data-losing outcome is not recovered by retrying.

Carried by:

No event carries this field yet.

B.29.4 outcome.deferred #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a refusal was raised after the caller had already been told the operation succeeded. A deferred refusal has nobody left to receive an error, which is why it is recorded unconditionally rather than only for the arrangement errors.

Carried by:

  • stratafs.mutation.refused

B.29.5 outcome.detail #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Free text about the outcome, for a person to read. Optional, and never parsed: anything a consumer would filter on belongs in outcome.reason or a field of its own. Never the output of a language's debug formatter.

Carried by:

  • eventd.store.quarantined
  • peinit.config.reload.applied
  • peinit.critical-service.failed
  • peinit.graph.validation.failed
  • peinit.job.ended
  • peinit.operation.ended
  • peinit.recovery.entered
  • peipkg.action.authorised
  • peipkg.claim.changed
  • peipkg.package.installed
  • peipkg.package.uninstalled
  • peipkg.package.upgraded
  • peipkg.repository.added
  • peipkg.repository.removed
  • peipkg.transaction.recovered

B.29.6 outcome.errno #

  • Type: int.errno
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The error the operation failed with, as a negative errno. Absent on success. Present where an event records an outcome that has a specific failure rather than only a boolean.

Carried by:

  • kacs.audit.descriptor.changed
  • kacs.caap.policy.changed
  • kacs.config.value.rejected
  • kacs.impersonation.reverted
  • kacs.impersonation.started
  • kacs.signature.crypto.failed
  • kmes.buffer.swap.failed
  • kmes.config.refresh.failed
  • lcs.audit.backup.ended
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.restore.ended
  • lcs.audit.transaction.committed
  • lcs.audit.value.deleted
  • lcs.audit.value.set
  • ntfe.policy.rejected
  • peinit.event.dropped
  • stratafs.file.copied-up
  • stratafs.mutation.refused

B.29.7 outcome.errno-cleanup #

  • Type: int.errno
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The error a compensating action failed with, when an operation failed and its undo failed too. Read with outcome.errno, the error of the operation itself: the pair is how orphaned objects come to exist. Absent when the undo succeeded or was not attempted.

Carried by:

No event carries this field yet.

B.29.8 outcome.errno-masked #

  • Type: int.errno
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The error an underlying step actually failed with, where StrataFS returned a different one to the caller. outcome.errno holds the error the caller saw; this field holds the one it replaced, which is usually the one that explains the failure.

Carried by:

No event carries this field yet.

B.29.9 outcome.fallback #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the operation took a fallback path because the mechanism it prefers was unavailable. The operation still completed, by a slower or coarser route.

Carried by:

No event carries this field yet.

B.29.10 outcome.field #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The name of the structure field an error was attributed to, such as the member of an argument structure that was out of range.

Carried by:

No event carries this field yet.

B.29.11 outcome.invariant-violated #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether an internal invariant was found broken and execution continued anyway. A record with this set describes a state the code assumes cannot happen, so treat whatever follows it on the same mount as suspect.

Carried by:

No event carries this field yet.

B.29.12 outcome.offset #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The byte offset within the input at which parsing failed. Read with outcome.field where the input is a structure.

Carried by:

No event carries this field yet.

B.29.13 outcome.reason #

  • Type: str.enum
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Why the operation resolved the way it did. Each event declares its own values: a list, or a curated subset of a uapi/pkm/trace.h family, which carries codes that are never event reasons. A trace code is rendered with the family prefix stripped and case folded, so KACS_FSR_GRANT_DENY presents as grant-deny, and an investigation escalating from the event stream to a live trace sees the same decision described in the same terms.

Carried by:

  • authd.logon.attempted
  • authd.service.attested
  • authd.session.ended
  • kacs.audit.handle.used
  • kacs.caap.sacl.skipped
  • kacs.config.value.rejected
  • kacs.descriptor.rejected
  • kacs.impersonation.started
  • lcs.audit.transaction.committed
  • lcs.source.response.rejected
  • lpsd.account.created
  • lpsd.account.deleted
  • lpsd.account.modified
  • lpsd.credential.changed
  • lpsd.credential.verified
  • lpsd.group.created
  • lpsd.group.deleted
  • lpsd.group.member.added
  • lpsd.group.member.removed
  • ntfe.policy.rejected
  • ntfe.verdict.reported
  • peinit.boot.downgraded
  • peinit.critical-service.failed
  • peinit.fd-store.rejected
  • peinit.graph.validation.failed
  • peinit.graph.validation.warned
  • peinit.notify.rejected
  • peinit.on-failure.suppressed
  • peinit.recovery.entered
  • peipkg.claim.changed
  • peipkg.package.installed
  • peipkg.package.uninstalled
  • peipkg.package.upgraded
  • peipkg.repository.added

B.29.14 outcome.result-raw #

  • Type: int
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

A raw result from an internal step that was neither zero nor a valid negative errno, recorded instead of being passed on. Deliberately not outcome.errno: a value outside the errno range returned from an open could reach the caller as a pointer to a file, so StrataFS converts it to EIO, and this field holds what it caught.

Carried by:

No event carries this field yet.

B.29.15 outcome.reverted #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a credential change the kernel had prepared was silently undone, so that the call returned success having changed nothing. The caller is told it worked; this is the only record that it did not.

Carried by:

No event carries this field yet.

B.29.16 outcome.success #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the operation succeeded. What counts as success narrows per event; read the event's own note before computing a rate over it.

Carried by:

  • authd.logon.attempted
  • authd.service.attested
  • authd.session.ended
  • kacs.audit.access.checked
  • kacs.audit.descriptor.changed
  • kacs.audit.handle.used
  • kacs.audit.privilege.used
  • kacs.caap.policy.changed
  • kacs.impersonation.reverted
  • kacs.impersonation.started
  • kacs.mount.policy.changed
  • lcs.audit.backup.ended
  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.opened
  • lcs.audit.key.tombstoned
  • lcs.audit.restore.ended
  • lcs.audit.transaction.committed
  • lcs.audit.value.deleted
  • lcs.audit.value.set
  • lpsd.account.created
  • lpsd.account.deleted
  • lpsd.account.modified
  • lpsd.credential.changed
  • lpsd.credential.verified
  • lpsd.group.created
  • lpsd.group.deleted
  • lpsd.group.member.added
  • lpsd.group.member.removed
  • peinit.config.reload.applied
  • peinit.graph.operation.ended
  • peinit.job.ended
  • peinit.operation.ended
  • peipkg.action.authorised
  • peipkg.claim.changed
  • peipkg.package.installed
  • peipkg.package.uninstalled
  • peipkg.package.upgraded
  • peipkg.repository.added
  • peipkg.repository.refreshed
  • peipkg.repository.removed
  • peipkg.transaction.recovered
  • stratafs.file.copied-up

B.29.17 outcome.verdict #

  • Type: str.enum
  • Values: pass · reject · drop
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The decision a policy engine reached, where the decision has more than two states and outcome.success cannot express it. reject and drop both refuse, and differ in whether the refusal is signalled back to the sender or the traffic is discarded silently.

Carried by:

  • ntfe.verdict.reported

B.29.18 outcome.verdict-previous #

  • Type: str.enum
  • Values: pass · reject · drop
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The verdict a flow's cached judgment held before it was judged again. Set beside outcome.verdict, the pair is what tells a reload that changed a live connection's fate, such as pass to drop, from the far commoner re-judgment that changed nothing.

Carried by:

No event carries this field yet.

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.30 policy.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under policy, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.30.1 policy.fallback #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the compiled-in fallback policy was answering rather than a loaded rule set. Makes a silent fall-back to built-in security policy visible: the system keeps working, on rules no administrator wrote.

Carried by:

  • kacs.config.value.rejected

B.30.2 policy.generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The generation counter of the rule set in force when the decision was made. Increments on every policy load, so a record can be tied to the exact rule set that produced it rather than to whatever is loaded when the record is read.

Carried by:

  • ntfe.policy.published
  • ntfe.policy.rejected
  • ntfe.verdict.reported

B.30.3 policy.generation-previous #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The generation that was in force before a policy load replaced it. On a failed load, compare with policy.previous-retained.

Carried by:

  • ntfe.policy.published

B.30.4 policy.layers #

  • Type: str.enum[]
  • Values: raw-packet · packet · flow
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The rules layers the active generation loaded a forest for. A layer missing from the list judges nothing and waves every traversal past it. A missing flow layer also turns off endpoint attribution for the whole machine, so no flow carries an owner and every identity field is absent.

Carried by:

  • ntfe.policy.published

B.30.5 policy.previous-retained #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a failed policy load left the previous rule set in force. True is the safe outcome: the old policy still applies. False means the previous rule set is not in force either; policy.fallback says what is answering instead.

Carried by:

  • kacs.config.value.rejected
  • ntfe.policy.rejected

B.30.6 policy.report-threshold #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The machine's reporting threshold, CurrentReportingLevel: a rule's report fires only when its level is at least this. It runs from 1 to 6 and is 1 when the registry has no value. Rules may only declare levels 1 to 5, so a threshold of 6 silences every report on the machine, and a silent stream then means nothing about the traffic.

Carried by:

  • ntfe.policy.published

B.30.7 policy.report-threshold-previous #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The machine's reporting threshold before the change a record reports, in the terms of policy.report-threshold. A move to 6 is a change to the audit volume itself and turns every network report off.

Carried by:

  • ntfe.policy.published

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.31 privilege.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under privilege, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.31.1 privilege.authority #

  • Type: str.enum
  • Values: privilege · administrators
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Which rung of a privileged gate let the operation through. privilege means the caller's token held the privilege the gate asks for, enabled, and the use was marked against it. administrators means it did not, and the gate fell back to the caller's enabled membership of Administrators.

The second is an authorisation by group membership rather than by privilege. From outside the kernel the two look identical, so this field is the only way to tell a gate passed by SeTcbPrivilege from one passed by an administrator who never held it.

Carried by:

No event carries this field yet.

B.31.2 privilege.contributed #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The access bits this privilege supplied to the check, intersected with what the caller actually asked for. Distinct from access.granted, which is the whole check's result rather than this privilege's part in it.

Carried by:

  • kacs.audit.privilege.used

B.31.3 privilege.held #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Whether the caller's effective token held privilege.name, enabled, at the moment the gate asked. Every privilege gate tests for an enabled privilege, so a privilege present on the token but disabled counts as not held: false here, with the privilege visible in the token, is a caller that did not enable it, not one that lacked it.

Carried by:

  • kacs.impersonation.started

B.31.4 privilege.name #

  • Type: str.enum
  • Values: SeSecurityPrivilege · SeTakeOwnershipPrivilege · SeBackupPrivilege · SeRestorePrivilege · SeRelabelPrivilege · SeCreateTokenPrivilege · SeAssignPrimaryTokenPrivilege · SeLockMemoryPrivilege · SeIncreaseQuotaPrivilege · SeTcbPrivilege · SeLoadDriverPrivilege · SeSystemProfilePrivilege · SeSystemtimePrivilege · SeProfileSingleProcessPrivilege · SeIncreaseBasePriorityPrivilege · SeShutdownPrivilege · SeDebugPrivilege · SeAuditPrivilege · SeChangeNotifyPrivilege · SeRemoteShutdownPrivilege · SeManageVolumePrivilege · SeImpersonatePrivilege · SeCreateSymbolicLinkPrivilege
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The privilege a record is about, by its Windows name. On an access check it is the privilege that contributed access, and only the first five can influence an access check. At a Linux capability gate it is the privilege the capability maps to — SeTcbPrivilege for most, SeDebugPrivilege for sys-ptrace, SeShutdownPrivilege for sys-boot and so on — and SeManageVolumePrivilege or SeTcbPrivilege at the volume gate. SeImpersonatePrivilege appears on an impersonation that needed it. The set is open because new privileges may be defined.

Carried by:

  • kacs.audit.privilege.used
  • kacs.impersonation.started

B.31.5 privilege.required-held #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Whether the operation the caller asked for was the privileged variant, so that a privilege had to be spent to perform it. Several KACS operations have an ordinary form and a privileged one — installing a primary token for a different identity rather than the caller's own, for example — and this says which the caller reached for.

A boolean, not a privilege name: the privilege in question is privilege.name.

Carried by:

No event carries this field yet.

B.31.6 privilege.surviving #

  • Type: uint.mask
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The subset of privilege.contributed that reached the final granted mask. Empty means the privilege fired and a later layer stripped it — a confinement, a CAAP rule, or PIP non-dominance — which is usually the more interesting record of the two, because it shows a boundary doing its job.

Carried by:

  • kacs.audit.privilege.used

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.32 prompt.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under prompt, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.32.1 prompt.handler #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The name of the handler a PROMPT action addressed. NTFE has no handler transport yet, so every prompt falls back at once; the handler's name is the operator's only clue to which integration is missing.

Carried by:

No event carries this field yet.

B.32.2 prompt.handler-fallback #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

What a PROMPT fell back to when its handler did not answer: the action its fallback resolved to, as the rule wrote it. Fallbacks can themselves be prompts, up to four deep, and this is the action at the end of the chain.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.33 reject.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under reject, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.33.1 reject.delivered-to #

  • Type: str.enum
  • Values: wire · self
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Where NTFE sent a refusal. wire answers the remote peer on the link, from the ingress seat. self routes the answer back into this machine, from every other seat, so the stack fails the local socket at once rather than leaving it to time out.

Carried by:

No event carries this field yet.

B.33.2 reject.packet #

  • Type: str.enum
  • Values: tcp-reset · icmp-port-unreachable · icmp-admin-prohibited
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The packet NTFE built to deliver a refusal: a TCP reset for refused TCP, an ICMP or ICMPv6 port-unreachable for refused anything else, or an ICMP or ICMPv6 administratively-prohibited for every prohibited refusal. It decides what the refused program sees: ECONNREFUSED for a reset or a port-unreachable, EHOSTUNREACH for an IPv4 prohibition, and EACCES for an IPv6 one. Absent when the REJECT degraded to a DROP.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.34 request.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under request, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.34.1 request.deferred-effect #

  • Type: str.enum
  • Values: restore-commit · key-mutation
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The kind of kernel-side work attached to a source request, to be applied when the source's reply arrives rather than when the caller returns. restore-commit completes a registry restore; key-mutation publishes the effects of a key write, such as watch notifications and generation updates. Absent when the request carries no deferred work.

Deferred work is what makes a late reply consequential. When the caller has already given up (request.waiter-detached), the effect is still applied, so a change the caller was told had failed can land afterwards.

Carried by:

No event carries this field yet.

B.34.2 request.id #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The identifier of the source request this record concerns, for joining a record to the exchange that produced it. A pure correlation key.

Carried by:

  • lcs.source.response.rejected

B.34.3 request.op-code #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The source-protocol operation code of the request this record concerns. Identifies which kind of exchange returned unusable data.

Carried by:

  • lcs.source.response.rejected

B.34.4 request.op-code-expected #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The source-protocol operation code the kernel expected a response to carry, recorded where the source answered with a different one. Read it beside request.op-code, which holds the code that actually arrived; the disagreement between the two is the finding.

A response code is the request code with the high bit 0x8000 set, so an expected code of 0x8021 answers a request of 0x0021 (RSI_SET_VALUE).

Carried by:

No event carries this field yet.

B.34.5 request.status #

  • Type: str.enum
  • Values: ok · not-found · already-exists · storage-error · not-empty · too-large · txn-busy · invalid · cas-failed · txn-not-supported
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The RSI status code a registry source returned for a request, named from the RSI_* status constants with the prefix removed. The kernel maps each status to an errno before the caller sees it, and the errno loses the source's own account: storage-error and a response the kernel could not use at all both reach the caller as EIO, and only this field says which it was.

A status code outside this list is never carried here. It is rejected as malformed source data and recorded on lcs.source.response.rejected with the reason unknown-rsi-status-code.

Carried by:

No event carries this field yet.

B.34.6 request.timed-out #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether a request's wait for the source's reply ran out before the reply arrived. The deadline is the configured request timeout. A timed-out request is not cancelled at the source: its reply may still arrive, and any deferred effect attached to it may still be applied.

Carried by:

  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.value.deleted
  • lcs.audit.value.set

B.34.7 request.waited #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether the kernel blocked waiting for the source's reply to a request. False for a request dispatched without a waiter, whose outcome no caller will see directly.

Carried by:

No event carries this field yet.

B.34.8 request.waiter-detached #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Whether the caller that issued a request had stopped waiting by the time the source's reply arrived. True means the operation had already reported failure to userspace, typically a timeout, so any effect the reply carries lands after the caller was told it did not. This is the entry condition for the kernel's late-effect replay.

Carried by:

No event carries this field yet.

Generated from lcs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.35 rule.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under rule, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.35.1 rule.action-error #

  • Type: str.enum
  • Values: unknown-action · bad-arity · bad-argument · unknown-reject-kind · malformed
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Why one action expression in a rule's Actions value failed to parse. unknown-action is a name the language does not have; bad-arity is the wrong number of arguments; bad-argument is an argument of the wrong shape, such as a REPORT level outside 1 to 5; unknown-reject-kind is a REJECT story that is not minted; malformed is unbalanced parentheses or trailing text. A rule with a bad action refuses the whole generation, not just itself.

Carried by:

  • ntfe.policy.rejected

B.35.2 rule.contender.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

A second rule named on the same record as rule.name: the rule that lost a contest to it, or a rule that collided with it, such as one reading a tag that a higher layer writes. Like rule.name, it is the rule's registry path relative to its layer key.

Carried by:

No event carries this field yet.

B.35.3 rule.hash #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The FNV-1a-64 hash of the rule's whole registry path. Always carried, even when rule.name was cut short, so a reader can resolve a rule the record could not name in full. Resolve it against the policy generation the record names, because a later generation may name its rules differently.

A 64-bit integer rather than a digest: it identifies a path, and is not a cryptographic summary of anything.

Carried by:

  • ntfe.verdict.reported

B.35.4 rule.layer #

  • Type: str.enum
  • Values: raw-packet · packet · flow
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Which evaluation layer the rule sat in. The layers see progressively more context — a raw frame, a parsed packet, a tracked connection — so the layer bounds what the rule could possibly have matched on.

Carried by:

  • ntfe.policy.rejected
  • ntfe.verdict.reported

B.35.5 rule.lint #

  • Type: str.enum
  • Values: fact-never-present-at-layer
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

A non-fatal finding about a rule that ingested but is almost certainly wrong. fact-never-present-at-layer is a condition on a fact that never exists at the rule's layer, which the absent-fact law makes permanently false, so the rule occupies its place in the tree and never matches. A lint never blocks ingestion and never appears beside a failure.

Carried by:

No event carries this field yet.

B.35.6 rule.match-value #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The literal match value written in a rule, exactly as its author wrote it in the registry. It is the text the rule compares a fact against, such as 10.0.0.0/8 or 22, before NTFE parsed it. It matters most where the value would not parse, because then the rule key alone does not say what was wrong.

Carried by:

No event carries this field yet.

B.35.7 rule.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The policy rule that produced this record, by name. Rules are the unit an administrator writes and edits, so this is the field that connects a record back to something a person can change.

Carried by:

  • ntfe.policy.rejected
  • ntfe.verdict.reported

B.35.8 rule.name-truncated #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Whether rule.name was cut short because the rule's path did not fit in the record. The cut falls at a character boundary, so the name is valid text, but it is not the whole path: do not search for it exactly. rule.hash still identifies the whole path, and is the value to resolve the rule by.

Absent when the name was carried in full.

Carried by:

  • ntfe.policy.rejected
  • ntfe.verdict.reported

B.35.9 rule.priority #

  • Type: int
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The effective priority of a rule, with any priority it inherits from its ancestors in the rule tree already resolved. When several rules in one layer yield a verdict, the highest priority wins and a tie goes to the stricter verdict, so this is the number that explains why one rule beat another. It is a signed 64-bit integer, as the rules language holds it, and negative values are legal: a lower value means a rule loses to any rule with a higher one.

Carried by:

No event carries this field yet.

B.35.10 rule.report-level #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The reporting level the matching rule asked for. Records exist only because a rule contained an explicit report directive, and this is the level it named.

Carried by:

  • ntfe.verdict.reported

B.35.11 rule.seat #

  • Type: str.enum
  • Values: ingress · egress · local-in · local-out
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Where in the path evaluation happened. Distinguishes traffic entering or leaving the machine from traffic terminating at or originating from a local socket, which is the difference between forwarding policy and host policy.

Carried by:

  • ntfe.verdict.reported

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.36 shutdown.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under shutdown, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.36.1 shutdown.finalization-state #

  • Type: str.enum
  • Values: waiting-for-services · ready · failed · completed
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

How far the system shutdown had got when the event was written. waiting-for-services means services were still being stopped; ready means they had stopped and the final action had not yet run; failed means finalisation itself went wrong; completed means it finished.

Carried by:

  • peinit.critical-service.failed

Generated from peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.37 signature.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under signature, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.37.1 signature.algorithm #

  • Type: str.enum
  • Values: ml-dsa-65
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The algorithm a signature was made with. Peios code signatures are ML-DSA-65 over a SHA-256 digest of the file, and that is the only value today; the set is open so that a second algorithm can be added.

Carried by:

No event carries this field yet.

B.37.2 signature.crypto-stage #

  • Type: str.enum
  • Values: alloc-transform · set-pubkey · boot-probe
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Where the signature machinery failed, when verification could not run. alloc-transform means the kernel could not obtain an ML-DSA-65 transform; set-pubkey that the transform rejected a key from the built-in table, which is a fault in the table rather than a signature that did not match; boot-probe that the one-off check made once the crypto subsystem is up found the algorithm unavailable.

Each makes verification impossible rather than negative. The exec path refuses a signed binary it cannot verify rather than run it unlabelled, so a crypto failure shows as refused execs across the whole system.

Carried by:

  • kacs.signature.crypto.failed

B.37.3 signature.location #

  • Type: str.enum
  • Values: none · elf-section · xattr
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Where a file's signature was found. elf-section is the .peios.sig section of an ELF file, xattr the security.peios.sig extended attribute, and none means the file carried neither and is unsigned. The ELF section is looked for first; an ELF file whose headers are malformed is not then checked for the attribute.

Carried by:

No event carries this field yet.

B.37.4 signature.parse-error #

  • Type: str.enum
  • Values: elf-magic-read · elf-short-ehdr · elf-ehdr-read · elf-bad-ident · elf-bad-shtable · elf-shdrs-range · elf-shstr-read · elf-strtab-range · elf-shdr-read · elf-name-read · elf-bad-sig-section · elf-bad-blob · elf-hash-fail · xattr-bad-blob · xattr-hash-fail · size-changed
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

Why the signature material on a file could not be read, named for its KACS_SIG_* code. The elf- values are failures walking the ELF header and section table to the .peios.sig section, or reading and hashing the signature inside it; the xattr- values are the same for the security.peios.sig attribute. size-changed is not a parsing failure: the file changed size while it was being read, and the kernel discarded what it had found.

Every value leaves the file treated as unsigned. The binary runs without the integrity label its signature would have given it, so a record carrying this field is the only thing that tells a damaged or tampered signature from no signature at all.

Carried by:

No event carries this field yet.

B.37.5 signature.result #

  • Type: str.enum
  • Values: unsigned · bad-key-table · no-key-match · verified · crypto-unavailable · crypto-mismatch
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The outcome of checking a signature against the built-in signing keys, named for its KACS_SIG_* code. verified means a key verified it and the file takes that key's integrity tier; no-key-match that it was signed but no built-in key verified it; unsigned that there was nothing to check. bad-key-table and crypto-unavailable mean verification could not run at all, and the exec path treats both as a refusal, never as unsigned. crypto-mismatch is the result for one key that did not verify the signature on the way to the next; the whole check then ends in verified or no-key-match.

no-key-match runs the binary unlabelled, exactly as unsigned does. It is a stronger signal than it looks: something was signed with a key this system does not trust.

Carried by:

No event carries this field yet.

B.37.6 signature.signing-key.fingerprint #

  • Type: bin
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The fingerprint of a signing key: the SHA-256 digest of its public key, the value the kacs/signing_keys listing shows as key_sha256. Not emitted today. The verification path identifies a key only by its position in the built-in table and never digests it, so nothing at the point of decision can supply this value; signature.signing-key.index is all a record carries. Until it is, a no-key-match verdict cannot say which key a binary was expected to match.

Carried by:

No event carries this field yet.

B.37.7 signature.signing-key.index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kacs.evman

The zero-based position of a signing key in the kernel's built-in key table, which is all that identifies a key at the point of verification today. The table is compiled into the kernel, so an index means something only against the same kernel build: compare it with the kacs/signing_keys listing in securityfs, whose lines are in table order, on a machine running that build. The same index on another build may be a different key.

Carried by:

No event carries this field yet.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.38 source.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under source, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.38.1 source.address #

  • Type: str.ip
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The address the traffic came from, rendered in the textual form for its family.

Carried by:

  • authd.logon.attempted
  • ntfe.verdict.reported

B.38.2 source.attribution #

  • Type: str.enum
  • Values: socket-stamp · no-kacs-state · unstamped · no-namespace · loopback-sender-lost · time-wait · stack-handled · no-sending-socket · multicast-or-broadcast · no-receiver · principal-unreadable
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Why the source endpoint was given the attribution it has. Not emitted today: NTFE decides it on every flow and encodes it nowhere, so source.endpoint and source.unattributed are all a record carries. The values name the paths the attribution can take: socket-stamp is the principal KACS stamped on the socket; no-kacs-state, unstamped and no-namespace fell back to the kernel because no stamp could be read; loopback-sender-lost is the sender of a loopback flow that the inbound seat cannot see; time-wait, stack-handled and no-sending-socket are the stack answering for itself; principal-unreadable is a program endpoint whose token could not be read.

Carried by:

No event carries this field yet.

B.38.3 source.endpoint #

  • Type: str.enum
  • Values: program · kernel · shared · none
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

What stands at the source end of the traffic, when that end is on this machine. program is a process's socket, and the source.socket.* fields then say whose. kernel is the network stack itself: a reset, an ICMP error, a protocol the stack consumes, or a socket nobody could attribute. shared and none arise only at a receiving end, as destination.endpoint describes. Present only on flow-layer records, and absent when the source is a remote machine. Read source.unattributed before taking kernel at its word.

Carried by:

No event carries this field yet.

B.38.4 source.file.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The path an object came from, in an operation on two objects such as a rename or a link. The object is at destination.file.path afterwards. Neither is the record's object.file.path: the operation acted on both.

Carried by:

No event carries this field yet.

B.38.5 source.mac #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The link-layer address the traffic came from, written as six colon-separated lowercase hexadecimal octets. Known only where an Ethernet header exists: from the frame at the device seats, and, for outbound traffic at the IP seats, the sending device's own address. Absent on a device with no Ethernet header.

Carried by:

No event carries this field yet.

B.38.6 source.port #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The transport port the traffic came from. Present only for protocols that have ports.

Carried by:

  • ntfe.verdict.reported

B.38.7 source.repository.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peipkg.evman

The repository a package was installed or upgraded from, by the name it is configured under. One transaction can draw from several repositories, which is why this is per package. It is how a bad install is traced back to the repository that served it.

Absent when the package came from a local file, which is the only way an install or upgrade has no repository. An uninstall has no source and never carries it. The role is source because the repository is where the package came from; object.repository.name is the field for events about a repository itself.

Carried by:

  • peipkg.package.installed
  • peipkg.package.upgraded

B.38.8 source.rsi.generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The restart generation of a registry source slot: how many times the slot has been resumed by a re-registering source after going down. Zero for a source that has never been restarted. A count that climbs quickly is a source crash-looping.

Carried by:

No event carries this field yet.

B.38.9 source.rsi.generation-validated #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The source restart generation that a cached key handle was last validated against. A handle whose validated generation is behind source.rsi.generation has outlived a source restart and must be revalidated before use, because the key it names may no longer exist.

Carried by:

No event carries this field yet.

B.38.10 source.rsi.hive #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The hive the offending source data belonged to, where the failure could be attributed to one. Absent when the data was malformed before a hive could be determined.

Carried by:

  • lcs.source.response.rejected

B.38.11 source.rsi.in-flight #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The number of requests dispatched to a registry source and still awaiting a reply, at the moment of the record. Bounded by the configured concurrency ceiling per source, so a value at that ceiling means new requests are queuing behind slow ones.

Carried by:

No event carries this field yet.

B.38.12 source.rsi.queued #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

The number of requests queued for a registry source and not yet delivered to it, at the moment of the record. Distinct from source.rsi.in-flight: a queued request has not reached the source at all, so it is discarded rather than failed if the source goes down.

Carried by:

No event carries this field yet.

B.38.13 source.rsi.slot #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: lcs.evman

Which registry source slot supplied the data, by index. Sources are the userspace backends that serve registry content to the kernel, so this names the backend rather than anything about the caller.

Carried by:

  • lcs.source.response.rejected

B.38.14 source.socket.process.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The durable GUID of the process recorded on the source endpoint's socket when it was stamped. Unlike the process ID it is never reused, so it still names the right process after that process has exited.

Carried by:

No event carries this field yet.

B.38.15 source.socket.process.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The short name of the process recorded on the source endpoint's socket when it was stamped. It is the kernel's command name, at most 15 characters and lossily sanitised, so two different programs can share it; it is a hint for a person, not an identity.

Carried by:

No event carries this field yet.

B.38.16 source.socket.process.pid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The process ID recorded on the source endpoint's socket when it was stamped. A socket can outlive the process that created it, so this process may have exited and its ID been reused; source.socket.process.guid is the identity that survives that.

Carried by:

No event carries this field yet.

B.38.17 source.socket.token.service-sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The per-service SID of the token stamped on the source endpoint's socket, when that token belongs to a service. It is found among the token's enabled groups and is always the 32-byte S-1-5-80 form. Absent for a socket that no service stands behind.

Carried by:

No event carries this field yet.

B.38.18 source.socket.token.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The user SID of the token KACS stamped on the source endpoint's socket. It is the identity the socket was stamped with, not necessarily the identity of whoever writes to it now. Present only when source.endpoint is program.

Carried by:

No event carries this field yet.

B.38.19 source.stratum-previous.index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The position, within the mount's stack, of the stratum that provided an object before the change the record describes. Present exactly when source.stratum-previous.path is.

Carried by:

No event carries this field yet.

B.38.20 source.stratum-previous.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The filesystem path of the stratum that provided an object before the change the record describes. Read with source.stratum.path: a record where the two differ is an object that now comes from a different layer, so a reader of the merged path sees different contents without the path having changed.

Carried by:

No event carries this field yet.

B.38.21 source.stratum.flags #

  • Type: uint.flags
  • Values: 0x1 create · 0x2 read-only · 0x4 absent-may
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The configuration flags of the stratum an object was read from, as the mount option set them: +create, +ro and +am. create marks the one stratum new objects and copy-ups are written into, read-only forbids writing into the stratum in place, and absent-may lets the mount succeed while the stratum's directory does not exist.

Carried by:

No event carries this field yet.

B.38.22 source.stratum.index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

Which stratum an object was read from, by index within the mount's stack. Absent when no provider was determined, as source.stratum.path is.

Carried by:

  • stratafs.file.copied-up
  • stratafs.mutation.refused

B.38.23 source.stratum.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The filesystem path of the stratum an object was read from. Absent when the refusal was raised before any provider was determined — creation, tmpfile, and the heads of link and rename — in which case source.stratum.index is absent too, and the two agree that no provider was involved.

Carried by:

  • stratafs.file.copied-up
  • stratafs.mutation.refused

B.38.24 source.token.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the token an operation derived a new one from, by duplicating or filtering it. The new token is destination.token.guid.

Carried by:

No event carries this field yet.

B.38.25 source.token.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The user SID of the token of the process that asked for an operation on someone else's behalf: the program that originated a logon, such as login, sshd or a graphical greeter, as against the principal being signed in. The emitter reads it from the connected peer's token, never from anything the peer sent.

Not subject.token.sid, which is the principal the record is about. Several originators run as SYSTEM, so this field says which principal asked, not which program; the kernel-stamped header names the emitter, not the originator, so nothing else in the record does.

Carried by:

  • authd.logon.attempted

B.38.26 source.unattributed #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Whether NTFE confessed that it could not attribute the source endpoint to a principal. When true, every rule condition on that endpoint's identity was false for this traffic rather than evaluated. False does not prove the endpoint was attributed: a program endpoint whose token could not be read still reads false here, and its identity conditions failed just the same.

Carried by:

No event carries this field yet.

Generated from kernel.evman, lcs.evman, ntfe.evman, peipkg.evman, stratafs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.39 store.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under store, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.39.1 store.committed.cpus #

  • Type: uint[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

The CPUs whose KMES rings eventd was reading when it shut down, one entry per logical CPU in ascending order. Parallel to store.committed.sequences.

Carried by:

  • eventd.daemon.stopped

B.39.2 store.committed.sequences #

  • Type: uint[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

For each CPU in store.committed.cpus, the highest event sequence of this boot committed with no gap before it, taken during a graceful shutdown after eventd had stopped reading the rings and committed everything it had read. Parallel to store.committed.cpus. It is diagnostic only: when eventd next starts it works out where to resume from the store itself, never from this record.

0 means no unbroken run from sequence 1 exists for that CPU, as in store.resume.sequences. When eventd cannot read its record of what was committed, it leaves both arrays out of the shutdown record rather than write zeroes (PEI-1394), so a 0 here is always a real value.

Carried by:

  • eventd.daemon.stopped

B.39.3 store.kind #

  • Type: str.enum
  • Values: event · log · metric
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

Which of eventd's stores a record is about: the sharded event store, the log store or the metric store. On a storage error this is the store eventd found corrupt and quarantined, and with store.shard it is the field worth alerting on. The set is open because the database eventd keeps its own metadata in may be reported on separately later; today eventd rebuilds that database when it is damaged, and writes no record of it.

Carried by:

  • eventd.store.quarantined

B.39.4 store.restarted #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

Whether this boot's events were already in the store when eventd started, which is to say eventd had already run during this boot and this start is a restart. It is false on eventd's first start in a boot. Counting the records where it is true answers how often eventd restarted during a boot, without inferring it from gaps.

A historical shard that cannot be opened at startup is left out of the decision, so on a damaged store a restart can be reported as false.

Carried by:

  • eventd.daemon.started

B.39.5 store.resume.cpus #

  • Type: uint[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

The CPUs whose KMES rings eventd resumed reading at startup, one entry per logical CPU in ascending order. Parallel to store.resume.sequences: entry i of that array is where reading resumed for the CPU in entry i of this one.

Carried by:

  • eventd.daemon.started

B.39.6 store.resume.sequences #

  • Type: uint[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

For each CPU in store.resume.cpus, the highest event sequence of this boot already committed with no gap before it, which is where eventd resumed reading that CPU's ring. Parallel to store.resume.cpus.

0 is a value, not an absence. It means no unbroken run of committed events starting at sequence 1 exists for that CPU in this boot: nothing was committed yet, or the first events were lost. Events committed after a gap are not reflected here.

Carried by:

  • eventd.daemon.started

B.39.7 store.shard #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

The index of the event-store shard a record is about, counting from 0. Present only when store.kind is event; the log and metric stores are not sharded, so a record about either has no shard.

Carried by:

  • eventd.store.quarantined

B.39.8 store.shard-count #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: eventd.evman

How many active event-store shards eventd is running with, after resolving its configured shard count. Historical shards kept only for reading are not counted.

Carried by:

  • eventd.daemon.started

Generated from eventd.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.40 subject.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under subject, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.40.1 subject.job.activation-generation #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it. A message from an earlier run of a service carries an older generation.

Carried by:

  • peinit.notify.errno.reported
  • peinit.notify.exit-status.reported
  • peinit.notify.progress.reported
  • peinit.notify.rejected
  • peinit.notify.status.reported
  • peinit.notify.stopping.reported

B.40.2 subject.job.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The job whose process sent a notification message: the service's main process, or a submitted job.

Carried by:

  • peinit.notify.errno.reported
  • peinit.notify.exit-status.reported
  • peinit.notify.progress.reported
  • peinit.notify.rejected
  • peinit.notify.status.reported
  • peinit.notify.stopping.reported

B.40.3 subject.operation.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes. Absent when the job serves none.

Carried by:

  • peinit.notify.errno.reported
  • peinit.notify.exit-status.reported
  • peinit.notify.progress.reported
  • peinit.notify.rejected
  • peinit.notify.status.reported
  • peinit.notify.stopping.reported

B.40.4 subject.pip.trust #

  • Type: uint
  • Asserted: yes
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

The PIP trust level in force for the access check. Compared for dominance: a caller whose trust does not dominate the target's is denied before the DACL is reached. Caller-influenced on ioctl-originated events, as subject.pip.type is.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)

B.40.5 subject.pip.type #

  • Type: uint.enum
  • Values: 0 None · 512 Protected · 1024 Isolated
  • Set: closed
  • Asserted: yes
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

The Protected Isolated Process type in force for the access check. Held in process state rather than on the token, and a caller of the access-check ioctl may supply its own value — so on ioctl-originated events this is caller-influenced, and kernel-observed everywhere else.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)

B.40.6 subject.process.executable #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The executable of the process that acted, where that is not the emitter, resolved at exec with symbolic links followed.

Carried by:

No event carries this field yet.

B.40.7 subject.process.guid #

  • Type: bin.guid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The durable GUID of the process that acted, where that is not the emitter. Never reused, so it identifies the actor across PID reuse and after the process has exited.

Carried by:

No event carries this field yet.

B.40.8 subject.process.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The kernel's name (comm) for the process that acted, where that is not the emitter. Lossy and truncated to 15 bytes; two processes can share a name.

Carried by:

No event carries this field yet.

B.40.9 subject.process.pid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The process ID of the process that acted, where that is not the emitter: a daemon reporting what a client did names the client here and itself in emitter.process.pid. Same meaning and same caveat as emitter.process.pid — PIDs are reused, so correlate on subject.process.guid.

Carried by:

  • peinit.notify.rejected

B.40.10 subject.service.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: peinit.evman

The service whose job sent a notification message. The sender is authenticated by its process, so this is the service peinit established, not one the message claimed.

Carried by:

  • peinit.notify.errno.reported
  • peinit.notify.exit-status.reported
  • peinit.notify.progress.reported
  • peinit.notify.rejected
  • peinit.notify.status.reported
  • peinit.notify.stopping.reported

B.40.11 subject.token.auth-id #

  • Type: uint.luid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: caller, subject

The LUID of the logon session the effective token belongs to. The join key to kacs.session.destroyed and to /sys/kernel/security/kacs/sessions, and the way to gather every event from one sign-on.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)
  • lcs.audit.backup.ended (via caller)
  • lcs.audit.backup.started (via caller)
  • lcs.audit.key.created (via caller)
  • lcs.audit.key.deleted (via caller)
  • lcs.audit.key.descriptor.changed (via caller)
  • lcs.audit.key.hidden (via caller)
  • lcs.audit.key.opened (via caller)
  • lcs.audit.key.tombstoned (via caller)
  • lcs.audit.restore.ended (via caller)
  • lcs.audit.restore.started (via caller)
  • lcs.audit.transaction.committed (via caller)
  • lcs.audit.value.deleted (via caller)
  • lcs.audit.value.set (via caller)

B.40.12 subject.token.capabilities #

  • Type: bin.sid[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The confinement capability SIDs (S-1-15-3-…) the effective token carries. Access to an object from a confined token turns on these: a confined token reaches only what its capabilities, as well as its user and groups, are granted. Unrelated to Linux capabilities, which are linux.cap. Absent on an unconfined token.

Carried by:

No event carries this field yet.

B.40.13 subject.token.gid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The Linux GID the effective token projects onto, for correlating with Linux-side data such as file ownership and /proc. A projection for interoperability, never the identity KACS decides on.

Carried by:

No event carries this field yet.

B.40.14 subject.token.group-attributes #

  • Type: uint.flags[]
  • Values: SE_GROUP_MANDATORY · SE_GROUP_ENABLED_BY_DEFAULT · SE_GROUP_ENABLED · SE_GROUP_OWNER · SE_GROUP_USE_FOR_DENY_ONLY · SE_GROUP_INTEGRITY · SE_GROUP_INTEGRITY_ENABLED · SE_GROUP_RESOURCE · SE_GROUP_LOGON_ID
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

Per-group attribute bitmasks, positionally parallel to subject.token.groups. The two arrays are always the same length, and groups[i] is described by group-attributes[i].

SE_GROUP_INTEGRITY is present for ABI parity only — mandatory integrity control reads subject.token.integrity, never this flag.

The attributes are the token's as held, not as requested when the token was made: creation derives SE_GROUP_ENABLED from SE_GROUP_ENABLED_BY_DEFAULT.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)

B.40.15 subject.token.groups #

  • Type: bin.sid[]
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

The group SIDs carried by the effective token. Access is frequently granted through one of these rather than to the user SID directly, so a search by principal that ignores them misses most of what that principal actually did.

Reconstructing membership as the access check sees it means applying the check's own rule: SE_GROUP_ENABLED set and SE_GROUP_USE_FOR_DENY_ONLY clear, for allow-side matching, read from subject.token.group-attributes.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)
  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started

B.40.16 subject.token.id #

  • Type: uint.luid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: caller, subject

The token's own LUID, identifying this specific token rather than the logon session it belongs to. Correlates every event produced under one token.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)
  • lcs.audit.backup.ended (via caller)
  • lcs.audit.backup.started (via caller)
  • lcs.audit.key.created (via caller)
  • lcs.audit.key.deleted (via caller)
  • lcs.audit.key.descriptor.changed (via caller)
  • lcs.audit.key.hidden (via caller)
  • lcs.audit.key.opened (via caller)
  • lcs.audit.key.tombstoned (via caller)
  • lcs.audit.restore.ended (via caller)
  • lcs.audit.restore.started (via caller)
  • lcs.audit.transaction.committed (via caller)
  • lcs.audit.value.deleted (via caller)
  • lcs.audit.value.set (via caller)

B.40.17 subject.token.impersonation #

  • Type: uint.enum
  • Values: 0 Anonymous · 1 Identification · 2 Impersonation · 3 Delegation
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: caller, subject

The impersonation level of the effective token. A primary token also reports 0, so read subject.token.type before reading 0 as Anonymous. An impersonation token means subject.token and emitter.process describe different principals.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)
  • lcs.audit.backup.ended (via caller)
  • lcs.audit.backup.started (via caller)
  • lcs.audit.key.created (via caller)
  • lcs.audit.key.deleted (via caller)
  • lcs.audit.key.descriptor.changed (via caller)
  • lcs.audit.key.hidden (via caller)
  • lcs.audit.key.opened (via caller)
  • lcs.audit.key.tombstoned (via caller)
  • lcs.audit.restore.ended (via caller)
  • lcs.audit.restore.started (via caller)
  • lcs.audit.transaction.committed (via caller)
  • lcs.audit.value.deleted (via caller)
  • lcs.audit.value.set (via caller)

B.40.18 subject.token.integrity #

  • Type: uint.integrity
  • Values: 0 Untrusted · 4096 Low · 8192 Medium · 12288 High · 16384 System
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: caller, subject

The integrity RID of the effective token. Mandatory integrity control compares this against the object's integrity label before the DACL is consulted at all, so a denial here never reaches an ACE.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)
  • lcs.audit.backup.ended (via caller)
  • lcs.audit.backup.started (via caller)
  • lcs.audit.key.created (via caller)
  • lcs.audit.key.deleted (via caller)
  • lcs.audit.key.descriptor.changed (via caller)
  • lcs.audit.key.hidden (via caller)
  • lcs.audit.key.opened (via caller)
  • lcs.audit.key.tombstoned (via caller)
  • lcs.audit.restore.ended (via caller)
  • lcs.audit.restore.started (via caller)
  • lcs.audit.transaction.committed (via caller)
  • lcs.audit.value.deleted (via caller)
  • lcs.audit.value.set (via caller)

B.40.19 subject.token.privileges #

  • Type: uint.flags
  • Values: 0x4 KACS_SE_CREATE_TOKEN_PRIVILEGE · 0x8 KACS_SE_ASSIGN_PRIMARY_TOKEN_PRIVILEGE · 0x10 KACS_SE_LOCK_MEMORY_PRIVILEGE · 0x20 KACS_SE_INCREASE_QUOTA_PRIVILEGE · 0x80 KACS_SE_TCB_PRIVILEGE · 0x100 KACS_SE_SECURITY_PRIVILEGE · 0x200 KACS_SE_TAKE_OWNERSHIP_PRIVILEGE · 0x400 KACS_SE_LOAD_DRIVER_PRIVILEGE · 0x800 KACS_SE_SYSTEM_PROFILE_PRIVILEGE · 0x1000 KACS_SE_SYSTEMTIME_PRIVILEGE · 0x2000 KACS_SE_PROFILE_SINGLE_PROCESS_PRIVILEGE · 0x4000 KACS_SE_INCREASE_BASE_PRIORITY_PRIVILEGE · 0x20000 KACS_SE_BACKUP_PRIVILEGE · 0x40000 KACS_SE_RESTORE_PRIVILEGE · 0x80000 KACS_SE_SHUTDOWN_PRIVILEGE · 0x100000 KACS_SE_DEBUG_PRIVILEGE · 0x200000 KACS_SE_AUDIT_PRIVILEGE · 0x800000 KACS_SE_CHANGE_NOTIFY_PRIVILEGE · 0x1000000 KACS_SE_REMOTE_SHUTDOWN_PRIVILEGE · 0x10000000 KACS_SE_MANAGE_VOLUME_PRIVILEGE · 0x20000000 KACS_SE_IMPERSONATE_PRIVILEGE · 0x100000000 KACS_SE_RELABEL_PRIVILEGE · 0x800000000 KACS_SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The privileges the effective token holds, as the flags of its 64-bit privilege word from uapi/pkm/token.h: bit n is the privilege whose LUID is n, so SeDebugPrivilege is bit 20. Holding a privilege is not the same as using it; which are switched on is subject.token.privileges-enabled.

Userspace emitters that report a caller's privileges by name today will carry this set instead.

Carried by:

  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started

B.40.20 subject.token.privileges-enabled #

  • Type: uint.flags
  • Values: 0x4 KACS_SE_CREATE_TOKEN_PRIVILEGE · 0x8 KACS_SE_ASSIGN_PRIMARY_TOKEN_PRIVILEGE · 0x10 KACS_SE_LOCK_MEMORY_PRIVILEGE · 0x20 KACS_SE_INCREASE_QUOTA_PRIVILEGE · 0x80 KACS_SE_TCB_PRIVILEGE · 0x100 KACS_SE_SECURITY_PRIVILEGE · 0x200 KACS_SE_TAKE_OWNERSHIP_PRIVILEGE · 0x400 KACS_SE_LOAD_DRIVER_PRIVILEGE · 0x800 KACS_SE_SYSTEM_PROFILE_PRIVILEGE · 0x1000 KACS_SE_SYSTEMTIME_PRIVILEGE · 0x2000 KACS_SE_PROFILE_SINGLE_PROCESS_PRIVILEGE · 0x4000 KACS_SE_INCREASE_BASE_PRIORITY_PRIVILEGE · 0x20000 KACS_SE_BACKUP_PRIVILEGE · 0x40000 KACS_SE_RESTORE_PRIVILEGE · 0x80000 KACS_SE_SHUTDOWN_PRIVILEGE · 0x100000 KACS_SE_DEBUG_PRIVILEGE · 0x200000 KACS_SE_AUDIT_PRIVILEGE · 0x800000 KACS_SE_CHANGE_NOTIFY_PRIVILEGE · 0x1000000 KACS_SE_REMOTE_SHUTDOWN_PRIVILEGE · 0x10000000 KACS_SE_MANAGE_VOLUME_PRIVILEGE · 0x20000000 KACS_SE_IMPERSONATE_PRIVILEGE · 0x100000000 KACS_SE_RELABEL_PRIVILEGE · 0x800000000 KACS_SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which of the privileges in subject.token.privileges are enabled, as flags in the same bit layout. A privilege takes part in a decision only while enabled, so a privilege that is held but disabled here could not have been what allowed the operation.

Carried by:

  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started

B.40.21 subject.token.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: caller, subject

The user SID of the effective token the operation ran under. Under impersonation this is the client's SID, not that of the process doing the work.

Carried by:

  • authd.logon.attempted
  • authd.service.attested
  • authd.session.ended
  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)
  • lcs.audit.backup.ended (via caller)
  • lcs.audit.backup.started (via caller)
  • lcs.audit.key.created (via caller)
  • lcs.audit.key.deleted (via caller)
  • lcs.audit.key.descriptor.changed (via caller)
  • lcs.audit.key.hidden (via caller)
  • lcs.audit.key.opened (via caller)
  • lcs.audit.key.tombstoned (via caller)
  • lcs.audit.restore.ended (via caller)
  • lcs.audit.restore.started (via caller)
  • lcs.audit.transaction.committed (via caller)
  • lcs.audit.value.deleted (via caller)
  • lcs.audit.value.set (via caller)
  • lpsd.account.created
  • lpsd.account.deleted
  • lpsd.account.modified
  • lpsd.credential.changed
  • lpsd.credential.verified
  • lpsd.group.created
  • lpsd.group.deleted
  • lpsd.group.member.added
  • lpsd.group.member.removed
  • netd.hostname.changed
  • peinit.operation.ended
  • peinit.operation.merged
  • peinit.operation.requested
  • peinit.operation.started
  • peipkg.action.authorised
  • peipkg.claim.changed
  • peipkg.package.installed
  • peipkg.package.uninstalled
  • peipkg.package.upgraded
  • peipkg.repository.added
  • peipkg.repository.reconfigured
  • peipkg.repository.refreshed
  • peipkg.repository.removed
  • peipkg.transaction.recovered
  • timed.clock.stepped

B.40.22 subject.token.type #

  • Type: str.enum
  • Values: primary · impersonation
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: caller, subject

Whether the effective token is a primary token or an impersonation token. Needed beside subject.token.impersonation, because a primary token and an Anonymous impersonation token both report level 0 there.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)
  • lcs.audit.backup.ended (via caller)
  • lcs.audit.backup.started (via caller)
  • lcs.audit.key.created (via caller)
  • lcs.audit.key.deleted (via caller)
  • lcs.audit.key.descriptor.changed (via caller)
  • lcs.audit.key.hidden (via caller)
  • lcs.audit.key.opened (via caller)
  • lcs.audit.key.tombstoned (via caller)
  • lcs.audit.restore.ended (via caller)
  • lcs.audit.restore.started (via caller)
  • lcs.audit.transaction.committed (via caller)
  • lcs.audit.value.deleted (via caller)
  • lcs.audit.value.set (via caller)

B.40.23 subject.token.uid #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman
  • In groups: subject

The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. A projection for interoperability, never the identity KACS decides on.

Carried by:

  • kacs.audit.access.checked (via subject)
  • kacs.audit.descriptor.changed (via subject)
  • kacs.audit.handle.used (via subject)
  • kacs.audit.privilege.used (via subject)
  • kacs.caap.policy.changed (via subject)
  • kacs.caap.sacl.skipped (via subject)
  • kacs.caap.staging.diverged (via subject)
  • kacs.descriptor.rejected (via subject)
  • kacs.impersonation.reverted (via subject)
  • kacs.impersonation.started (via subject)
  • kacs.mount.policy.changed (via subject)

B.40.24 subject.true-token.sid #

  • Type: bin.sid
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The user SID of the acting thread's own token, before any impersonation. Carried on records about impersonation, where subject.token.sid is the client being impersonated and this is the server doing the impersonating. Equal to subject.token.sid when the thread is not impersonating.

Carried by:

No event carries this field yet.

Generated from kernel.evman, peinit.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.41 tag.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under tag, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.41.1 tag.amount #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The amount a tag operation applied: the value a set wrote, or the amount an add added. Both default to 1 when the rule names none. Absent for clear.

Carried by:

No event carries this field yet.

B.41.2 tag.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The name of a flow tag, as the policy author wrote it. Not emitted today: the tag store is passed only the tag's hash, machinery.hash, and the name lives in the published policy. A hash names the same tag only within one generation.

Carried by:

No event carries this field yet.

B.41.3 tag.operation #

  • Type: str.enum
  • Values: set · clear · add
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

Which operation a TAG action applied to a flow tag. clear removes the tag so that it reads as absent; clearing an absent tag does nothing.

Carried by:

No event carries this field yet.

B.41.4 tag.value #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The value a flow tag holds. An add that would overflow leaves it at the largest representable value, where it stays.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.42 test.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under test, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.42.1 test.rendezvous.action #

  • Type: str.enum
  • Values: none · hold · fail
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

What a test rendezvous point is set to do to the next task that reaches it. hold blocks every task that arrives until the point is cleared. fail makes the next arriving task's step fail with a chosen error, once, then reverts to none, which leaves tasks unaffected.

Carried by:

No event carries this field yet.

B.42.2 test.rendezvous.name #

  • Type: str
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The test rendezvous point a record concerns, one of copy-up-begin, copy-up-publish, rename-provider and link-install. Rendezvous points exist only in a kernel built with test hooks and booted with stratafs.test_hooks=1, and let a conformance test hold an operation open mid-flight or make one internal step fail. A production system never records one.

Carried by:

No event carries this field yet.

B.42.3 test.rendezvous.waiters #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: stratafs.evman

The number of tasks blocked at a test rendezvous point, at the moment of the record. A test polls it to know its target has arrived before acting on the held state. Non-zero only while the point is set to hold.

Carried by:

No event carries this field yet.

Generated from stratafs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.43 transaction.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under transaction, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.43.1 transaction.commit-outstanding #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a transaction's commit had been sent to its source and not yet answered. When this is true and the transaction then times out or its source goes down, nobody can say whether the changes were applied: the source may have committed them before the reply was lost.

Carried by:

  • lcs.audit.transaction.committed

B.43.2 transaction.id #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The transaction the operation belonged to, registry or package. A pure correlation identifier: every record of one transaction carries the same value, from begin to commit or abort. The registry and the package manager number their transactions independently, so an identifier is unique only within one of them; which it belongs to follows from the event type.

Carried by:

  • lcs.audit.key.created
  • lcs.audit.key.deleted
  • lcs.audit.key.descriptor.changed
  • lcs.audit.key.hidden
  • lcs.audit.key.tombstoned
  • lcs.audit.transaction.committed
  • lcs.audit.value.deleted
  • lcs.audit.value.set
  • peipkg.claim.changed
  • peipkg.package.installed
  • peipkg.package.uninstalled
  • peipkg.package.upgraded

B.43.3 transaction.position #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The ordinal of a mutation within its registry transaction, counting from 1 in the order the mutations were made. Correlates one operation with its place in a commit that applies many.

Carried by:

No event carries this field yet.

B.43.4 transaction.state #

  • Type: str.enum
  • Values: active-unbound · active-bound · committed · aborted · timed-out · source-down
  • Set: open
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The state of a registry transaction, from the REG_TXN_* states. A transaction is active-unbound until its first mutation binds it to a source and hive, then active-bound. The other four are terminal: committed, aborted, timed-out when it passed its deadline, and source-down when the source holding it went away.

timed-out and source-down do not by themselves say whether the transaction's changes landed; see transaction.commit-outstanding.

Carried by:

  • lcs.audit.transaction.committed

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.44 trigger.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under trigger, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.44.1 trigger.ace #

  • Type: bin.ace
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The exact ACE that caused this record, so a consumer can identify which rule fired. Absent when trigger.kind is policy, because no ACE was involved.

Carried by:

  • kacs.audit.access.checked

B.44.2 trigger.fail-closed #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether a failure to write this audit record may fail the operation it describes. True where the record is mandatory and the operation is refused rather than left unrecorded; false where emission is best effort.

Carried by:

No event carries this field yet.

B.44.3 trigger.file.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The path of the file that caused the record, where that is not the object the record is about. Two cases: an operation on one object that had a side effect elsewhere, such as the ancestor directories a copy-up materialised; and an ancestor whose type masked the subtree the object sits in.

Carried by:

No event carries this field yet.

B.44.4 trigger.kind #

  • Type: str.enum
  • Values: sacl · policy
  • Set: closed
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Why an audit record exists at all. sacl means an audit ACE on the object, or in a central access policy, matched this access. policy means nothing in any SACL asked for it and the calling token's own audit policy forced it.

The distinction is how volume gets diagnosed: a flood of policy is a property of the token and is fixed on the token, while a flood of sacl is a property of the object and is fixed on its SACL.

Carried by:

  • kacs.audit.access.checked

B.44.5 trigger.open-audit #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the object's SACL required the open itself to be audited. The registry writes its key-open audit record only when this is true, so it is the reason such a record exists.

Carried by:

No event carries this field yet.

B.44.6 trigger.privilege-audit #

  • Type: bool
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Whether the use of a privilege required its own audit record.

Not emitted today. The registry computes it during the open check and carries it across to the kernel's C side, where nothing reads it, so no privilege-use record is produced for a registry open.

Carried by:

No event carries this field yet.

B.44.7 trigger.sacl-match #

  • Type: uint.flags
  • Values: 0x1 success-audit matched · 0x2 failure-audit matched
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

Which flavour of audit ACE matched. No other bits are ever set. Distinct from trigger.kind, which says whether a SACL was involved at all — this says which side of one fired, and both bits can be set at once.

Carried by:

  • lcs.audit.key.opened

B.44.8 trigger.stratum.index #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The position, within the mount's stack, of the stratum whose contents blocked an operation. Present exactly when trigger.stratum.path is.

Carried by:

No event carries this field yet.

B.44.9 trigger.stratum.path #

  • Type: str.path
  • Asserted: no
  • Carried in: the payload
  • Defined in: kernel.evman

The filesystem path of the stratum whose contents blocked an operation: the layer holding the entry that made a creation collide, a directory non-empty, or a name the wrong type. Without it a refusal names the error but not which layer an administrator must look in to clear it.

Carried by:

No event carries this field yet.

Generated from kernel.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

B.45 verdict-log.*

Peios / Using Peios / Events / Field Index

Every field the catalogue defines under verdict-log, in path order. Each entry gives the field's definition and, under Carried by, every event type that writes it.

B.45.1 verdict-log.capacity #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

How many verdict records NTFE's private ring holds before the oldest is overwritten.

Carried by:

No event carries this field yet.

B.45.2 verdict-log.lost #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

How many verdict records the private ring has destroyed by overrun since boot. With no reader attached the ring wraps within moments under real traffic, so a large count usually means nothing was reading rather than that something was slow.

Carried by:

No event carries this field yet.

B.45.3 verdict-log.sequence #

  • Type: uint
  • Asserted: no
  • Carried in: the payload
  • Defined in: ntfe.evman

The sequence number of a verdict record on NTFE's private ring. It rises by one per record from boot, so a gap is the confessed evidence of records lost to overrun, visible only to a reader that was present to see it.

Carried by:

No event carries this field yet.

Generated from ntfe.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

Peios Learn — documentation for the Peios project.

Built with Trail.