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,kmesandntfe(§3 to §7), thenpeinit,peipkg,eventd,authd,lpsd,timed,netdandtrustd(§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
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.
| Field | Header field | Meaning |
|---|---|---|
event.type | type | The event type, as the emitter named it. |
event.time | timestamp | Wall clock at the moment KMES accepted the event, nanoseconds since the Unix epoch. |
event.sequence | sequence | The emitting CPU's per-boot counter. The first event on each CPU gets 1, and the numbers on one ring are contiguous. |
event.cpu | cpu_id | The 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.class | origin_class | The emission path that wrote the record: 0 userspace, 1 kmes, 2 kacs, 3 lcs, 4 ntfe. |
emitter.token.guid | effective_token_guid | The effective token of the task that caused the event. |
emitter.true-token.guid | true_token_guid | That task's own token, before any impersonation. |
emitter.process.guid | process_guid | The 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.
| Type | Wire form |
|---|---|
bin.sid | bin holding the binary SID. |
bin.guid | bin, exactly 16 bytes. |
bin.ace | bin holding the binary ACE, copied from the descriptor. |
bin | bin: a digest or other opaque bytes. Shown as hexadecimal. |
uint.luid | uint. |
uint.time | uint, nanoseconds since the Unix epoch. |
uint.duration | uint, nanoseconds. |
uint.bytes | uint, a size in bytes. |
uint.mask | uint, an access mask, decoded against the table for the record's object.kind. |
uint.flags | uint, a set of bits the field's definition names. |
uint.integrity | uint, the integrity RID. |
uint.enum | uint, where the numbers are fixed by another specification. Rendered by name. |
int.errno | int, a negative error number. |
bool | bool. |
str.enum | str, a kebab-case name. |
str.path | str, a path. |
str.ip | str, an address in the textual form for its family. |
str | str, UTF-8 text. |
uint, int | uint 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 #
| Field | Type | Meaning |
|---|---|---|
subject.token.sid | bin.sid | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | The integrity RID of the effective token. |
subject.token.id | uint.luid | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | The impersonation level of the effective token. |
2.1.2 Carried by #
lcs.audit.backup.endedlcs.audit.backup.startedlcs.audit.key.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.openedlcs.audit.key.tombstonedlcs.audit.restore.endedlcs.audit.restore.startedlcs.audit.transaction.committedlcs.audit.value.deletedlcs.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 #
| Field | Type | Meaning |
|---|---|---|
subject.token.sid | bin.sid | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | The integrity RID of the effective token. |
subject.token.id | uint.luid | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | The impersonation level of the effective token. |
subject.token.uid | uint | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | The process ID the record was written from. |
emitter.process.name | str | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | The PIP trust level in force for the access check. |
2.2.2 Carried by #
kacs.audit.access.checkedkacs.audit.descriptor.changedkacs.audit.handle.usedkacs.audit.privilege.usedkacs.caap.policy.changedkacs.caap.sacl.skippedkacs.caap.staging.divergedkacs.descriptor.rejectedkacs.impersonation.revertedkacs.impersonation.startedkacs.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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
object.kind | str.enum | required | What sort of thing the operation acted on. |
object.file.path | str.path | when object.kind == file | The absolute path of the file the operation acted on, resolved at the enforcement point. |
object.process.pid | uint | when object.kind == process | The process ID of the process the operation acted on. |
object.process.guid | bin.guid | when object.kind == process | The durable GUID of the process the operation acted on. |
object.token.id | uint.luid | when object.kind == token | The LUID of the token the operation acted on, for token-open and token-adjust checks. |
object.token.guid | bin.guid | when object.kind == token | The durable GUID of the token the operation acted on. |
access.requested | uint.mask | required | The access mask the caller asked for, after generic bits have been mapped to type-specific ones. |
access.granted | uint.mask | required | The mask this check granted. |
access.denied-integrity | uint.mask | optional | The 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-trust | uint.mask | optional | The requested bits the object's process-trust label withheld, read the same way. |
outcome.success | bool | required | True 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.kind | str.enum | required | Why an audit record exists at all. |
trigger.ace | bin.ace | when trigger.kind == sacl | The exact ACE that caused this record, so a consumer can identify which rule fired. |
fields.attestation.userspace | bool | optional | Set 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
object.kind | str.enum | required | file, token, process or ipc. |
object.file.path | str.path | optional | On a file, its absolute path, when the handle's path could be resolved. |
object.token.id | uint.luid | when object.kind == token | The LUID of the token the operation acted on, for token-open and token-adjust checks. |
object.token.guid | bin.guid | when object.kind == token | The durable GUID of the token the operation acted on. |
object.process.guid | bin.guid | when object.kind == process | The durable GUID of the process the operation acted on. |
object.ipc.type | str.enum | when object.kind == ipc | Which kind of System V IPC object the operation acted on: a semaphore set, a shared-memory segment or a message queue. |
object.ipc.id | int | when object.kind == ipc | The System V IPC identifier of the object, as semget, shmget or msgget returned it. |
object.sd.components | uint.flags | required | The parts the caller set. A SACL bit means the record was not discretionary: such a change is always recorded. |
object.sd.length | uint.bytes | when outcome.success == true | The byte length of the object's security descriptor. |
object.sd.digest | bin | when outcome.success == true | SHA-256 of the descriptor as written. |
object.sd.owner | bin.sid | optional | The owner of the descriptor written, when it has one. |
object.sd.length-previous | uint.bytes | optional | The byte length of the descriptor a change replaced. |
object.sd.digest-previous | bin | optional | SHA-256 of the descriptor replaced. Absent, with its length and owner, where the object had no stored descriptor to replace. |
object.sd.owner-previous | bin.sid | optional | The owner SID a change replaced. |
access.requested | uint.mask | required | The rights the change needed: WRITE_OWNER, WRITE_DAC, ACCESS_SYSTEM_SECURITY, as the parts set ask. |
access.granted | uint.mask | optional | What the handle the change was made through was opened with. Absent on a change made without one. |
access.audit-mask | uint.mask | optional | The alarm mask on that handle. |
access.matched | uint.mask | optional | The 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.success | bool | required | Whether 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.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
object.kind | str.enum | required | Always file today, because FACS is the only enforcement point. |
object.file.path | str.path | required | The absolute path of the file the operation acted on, resolved at the enforcement point. |
operation.name | str.enum | required | Which 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.requested | uint.mask | required | What this operation needs — a read needs FILE_READ_DATA, an mmap with PROT_EXEC needs FILE_EXECUTE. |
access.matched | uint.mask | required | The subset of the requested access that overlapped an audit mask and therefore caused the record to exist. |
access.granted | uint.mask | required | What 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-mask | uint.mask | required | The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. |
outcome.success | bool | required | Whether the operation itself was allowed. |
outcome.reason | str.enum | when outcome.success == false | From 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
operation.name | str.enum | required | Which operation was attempted. Values here (open set): access-check · linux-cap · volume-mount. |
object.kind | str.enum | optional | On 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.path | str.path | when object.kind == file | The absolute path of the file the operation acted on, resolved at the enforcement point. |
object.process.pid | uint | when object.kind == process | The process ID of the process the operation acted on. |
object.process.guid | bin.guid | when object.kind == process | The durable GUID of the process the operation acted on. |
object.token.id | uint.luid | when object.kind == token | The LUID of the token the operation acted on, for token-open and token-adjust checks. |
object.token.guid | bin.guid | when object.kind == token | The durable GUID of the token the operation acted on. |
privilege.name | str.enum | required | The privilege a record is about, by its Windows name. |
privilege.contributed | uint.mask | when operation.name == access-check | The access bits this privilege supplied to the check, intersected with what the caller actually asked for. |
privilege.surviving | uint.mask | when operation.name == access-check | The subset of privilege.contributed that reached the final granted mask. |
linux.cap | str.enum | when operation.name == linux-cap | 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. |
access.requested | uint.mask | when operation.name == access-check | The whole check's requested mask, not this privilege's share of it. |
access.granted | uint.mask | when operation.name == access-check | The whole check's final granted mask. |
outcome.success | bool | required | On 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.userspace | bool | optional | Set 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
caap.policy.sid | bin.sid | required | The SID identifying a central access policy. |
operation.name | str.enum | required | set 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.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
object.kind | str.enum | required | What sort of thing the operation acted on. |
object.file.path | str.path | when object.kind == file | The absolute path of the file the operation acted on, resolved at the enforcement point. |
object.process.pid | uint | when object.kind == process | The process ID of the process the operation acted on. |
object.process.guid | bin.guid | when object.kind == process | The durable GUID of the process the operation acted on. |
object.token.id | uint.luid | when object.kind == token | The LUID of the token the operation acted on, for token-open and token-adjust checks. |
object.token.guid | bin.guid | when object.kind == token | The durable GUID of the token the operation acted on. |
caap.policy.sid | bin.sid | required | The SID identifying a central access policy. |
caap.rule.index | uint | required | The zero-based position of a rule within the central access policy named by caap.policy.sid. |
caap.phase | str.enum | required | Which phase of a central access policy's audit evaluation a CAAP diagnostic describes. |
outcome.reason | str.enum | required | invalid-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.requested | uint.mask | required | The access mask the caller asked for, after generic bits have been mapped to type-specific ones. |
access.granted | uint.mask | required | The effective grant of the check the rule was evaluated in. |
access.granted-staged | uint.mask | required | What a staged central access policy, not yet in force, would have granted. |
fields.attestation.userspace | bool | optional | Set 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
object.kind | str.enum | required | What sort of thing the operation acted on. |
object.file.path | str.path | when object.kind == file | The absolute path of the file the operation acted on, resolved at the enforcement point. |
object.process.pid | uint | when object.kind == process | The process ID of the process the operation acted on. |
object.process.guid | bin.guid | when object.kind == process | The durable GUID of the process the operation acted on. |
object.token.id | uint.luid | when object.kind == token | The LUID of the token the operation acted on, for token-open and token-adjust checks. |
object.token.guid | bin.guid | when object.kind == token | The durable GUID of the token the operation acted on. |
access.requested | uint.mask | required | The access mask the caller asked for, after generic bits have been mapped to type-specific ones. |
access.granted | uint.mask | required | What the effective policy granted: the access the caller actually got. |
access.granted-staged | uint.mask | required | What the staged policy would have granted instead. |
fields.attestation.userspace | bool | optional | Set 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
config.key.path | str | required | The registry key the reported value lives under, in canonical form. |
config.name | str | optional | The 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.reason | str.enum | required | empty: 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.errno | int.errno | required | The error the operation failed with, as a negative errno. |
policy.previous-retained | bool | required | Always true: a rejected table leaves the one in force in place. |
policy.fallback | bool | required | Whether 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
object.kind | str.enum | required | Always file today: file descriptors are the only stored descriptors KACS reads this way. |
object.file.path | str.path | optional | Not 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.inode | uint | required | The inode number the object presents. |
object.file.device | uint | required | With 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.length | uint.bytes | required | The 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.reason | str.enum | required | Why 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
emitter.thread.tid | uint | required | The thread that wrote the record, where the operation is scoped to a thread rather than to its process. |
object.kind | str.enum | required | Always token. |
object.token.guid | bin.guid | required | The impersonation token given up. |
object.token.sid | bin.sid | required | The user SID of the token the operation acted on. |
operation.name | str.enum | required | revert 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.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
emitter.thread.tid | uint | required | The thread that wrote the record, where the operation is scoped to a thread rather than to its process. |
object.kind | str.enum | required | Always token. |
object.token.guid | bin.guid | required | The durable GUID of the token the operation acted on. |
object.token.id | uint.luid | required | The LUID of the token the operation acted on, for token-open and token-adjust checks. |
object.token.sid | bin.sid | required | The client: whose identity the server took on or asked for. |
object.token.type | str.enum | required | primary only on a refusal: a primary token cannot be impersonated. |
object.token.integrity | uint.integrity | required | The integrity level of the token the operation acted on, as an integrity RID. |
object.token.auth-id | uint.luid | optional | Absent only for a token with no logon session. |
object.token.restricted | bool | required | Whether the token is restricted: whether it carries restricting SIDs that every access check must also satisfy. |
object.token.impersonation | uint.enum | required | The level the client token offered: the level asked for. |
object.token.impersonation-permitted | uint.enum | optional | The level the gate allowed. Absent when the attempt was refused before the gate answered. |
privilege.name | str.enum | optional | SeImpersonatePrivilege, 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.held | bool | when privilege.name == SeImpersonatePrivilege | Always true where present: a server without the privilege is not refused but lowered to Identification, which impersonation-permitted shows. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The error the operation failed with, as a negative errno. |
outcome.reason | str.enum | optional | On 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via subject | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | via subject | The group SIDs carried by the effective token. |
subject.token.group-attributes | uint.flags[] | via subject | Per-group attribute bitmasks, positionally parallel to subject.token.groups. |
subject.token.integrity | uint.integrity | via subject | The integrity RID of the effective token. |
subject.token.id | uint.luid | via subject | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via subject | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via subject | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via subject | The impersonation level of the effective token. |
subject.token.uid | uint | via subject | The Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data. |
emitter.process.pid | uint | via subject | The process ID the record was written from. |
emitter.process.name | str | via subject | The kernel's name for the emitting process, typically the executable's basename. |
emitter.process.executable | str.path | via subject | The path the emitting process was executed from, resolved at exec with symbolic links already followed. |
subject.pip.type | uint.enum | via subject | The Protected Isolated Process type in force for the access check. |
subject.pip.trust | uint | via subject | The PIP trust level in force for the access check. |
object.mount.fs-type | str | optional | The filesystem's type, when the kernel knows it. |
object.mount.policy | str.enum | required | The KACS mount policy in force, which decides what happens to an object with no stored descriptor. |
object.mount.policy-previous | str.enum | required | The mount policy a change replaced, beside object.mount.policy, the one it put in force. |
object.mount.policy-generation | uint | required | The generation the change began. Every descriptor cached under an older one is discarded on its next use. |
outcome.success | bool | required | Always 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.session.id | uint.luid | required | The LUID of the logon session the operation acted on. |
object.session.user.sid | bin.sid | required | The user SID of the principal the logon session belongs to: whose session it is. |
object.session.logon-type | str.enum | required | What kind of logon the session represents, from the KACS_LOGON_TYPE_* values in uapi/pkm/token.h. |
object.session.auth-package | str | required | The name of the authentication package that established the session, as the creator supplied it. |
object.session.logon-time | uint.time | required | When 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
signature.crypto-stage | str.enum | required | Always boot-probe today. |
outcome.errno | int.errno | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.file.path-relative | str.path | optional | Absent 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.index | uint | required | Which stratum an object was read from, by index within the mount's stack. |
source.stratum.path | str.path | optional | Absent only from a reduced record, with the other paths. |
destination.stratum.index | uint | required | Which stratum an object was written into, by index within the mount's stack. |
destination.stratum.path | str.path | optional | Absent only from a reduced record, with the other paths. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.file.path-relative | str.path | optional | Absent 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.name | str.enum | required | StrataFS 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.index | uint | optional | Absent when the refusal was raised before any provider was determined. |
source.stratum.path | str.path | optional | Present exactly when source.stratum.index is, except in a reduced record, which carries no paths. |
outcome.errno | int.errno | required | The error the operation failed with, as a negative errno. |
outcome.deferred | bool | required | Whether 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
operation.fd | uint | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. |
object.key.guid | bin.guid | required | The new key. |
object.key.path | str | required | The new key's full path. |
object.key.layer.name | str | optional | The layer the key was created in. |
object.key.created | bool | required | Always true. |
object.key.volatile | bool | required | Whether a registry key is volatile, meaning it lives only in memory and does not survive a reboot. |
object.key.volatile-requested | bool | required | Equal to object.key.volatile, since only a key that was made is recorded. |
object.key.symlink | bool | required | Whether a registry key is a symbolic link to another key. |
object.sd.length | uint.bytes | required | The new key's descriptor, as built from the parent's inheritable ACEs and the caller's token. |
object.sd.owner | bin.sid | optional | The owner SID on the object's security descriptor. |
access.requested | uint.mask | required | Always KEY_CREATE_SUB_KEY, the right checked on the parent. |
access.granted | uint.mask | required | What the parent check granted. |
transaction.id | uint | optional | The transaction the operation belonged to, registry or package. |
outcome.success | bool | required | Always 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
object.key.path | str | required | The resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES. |
object.key.layer.name | str | optional | The layer whose entry was deleted. |
object.layer.name | str | optional | Present when the delete removed a layer, naming it. |
access.requested | uint.mask | required | Always DELETE. |
access.granted | uint.mask | required | The access mask in force. |
access.matched | uint.mask | required | The subset of the requested access that overlapped an audit mask and therefore caused the record to exist. |
access.audit-mask | uint.mask | required | The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. |
transaction.id | uint | optional | The transaction the operation belonged to, registry or package. |
request.timed-out | bool | when outcome.success == false | Whether a request's wait for the source's reply ran out before the reply arrived. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
object.key.path | str | required | The resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES. |
object.sd.components | uint.flags | required | The parts the caller asked to change, its security_info. |
object.sd.length | uint.bytes | optional | The 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-previous | uint.bytes | optional | Absent when the request failed before the old descriptor was read. |
object.sd.digest | bin | optional | Present with object.sd.length. |
object.sd.digest-previous | bin | optional | Present with object.sd.length-previous. |
object.sd.owner | bin.sid | optional | Present with object.sd.length. |
object.sd.owner-previous | bin.sid | optional | Present with object.sd.length-previous. |
access.requested | uint.mask | required | The rights the change needs: WRITE_OWNER for the owner or group, WRITE_DAC for the DACL, ACCESS_SYSTEM_SECURITY for the SACL. |
access.granted | uint.mask | required | The access mask in force. |
access.matched | uint.mask | required | Zero when the record exists only because the change included the SACL. |
access.audit-mask | uint.mask | required | The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. |
transaction.id | uint | optional | The transaction the operation belonged to, registry or package. |
request.timed-out | bool | when outcome.success == false | True when the source did not answer in time, so the change may have been applied after all. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
object.key.path | str | required | The resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES. |
object.key.layer.name | str | optional | The layer the marker was written in. |
access.requested | uint.mask | required | Always DELETE. |
access.granted | uint.mask | required | The access mask in force. |
access.matched | uint.mask | required | The subset of the requested access that overlapped an audit mask and therefore caused the record to exist. |
access.audit-mask | uint.mask | required | The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. |
mutation.sequence | uint | optional | The sequence number LCS stamped on a registry mutation. |
transaction.id | uint | optional | The transaction the operation belonged to, registry or package. |
request.timed-out | bool | when outcome.success == false | Whether a request's wait for the source's reply ran out before the reply arrived. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. Names the table the access masks decode against. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
access.requested | uint.mask | required | After registry generic mapping, with MAXIMUM_ALLOWED re-added when the caller asked for it. |
access.granted | uint.mask | required | Forced 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.success | bool | required | Whether the open was allowed. Replaces the former decision string, which carried the same two states as words. |
trigger.sacl-match | uint.flags | required | Which 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
object.key.path | str | required | The resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES. |
object.key.layer.name | str | optional | The layer the blanket belongs to. |
operation.name | str.enum | optional | Whether the blanket was set or cleared. Absent only when the request failed before it was read. Values here (closed set): set · clear. |
access.requested | uint.mask | required | Always KEY_SET_VALUE. |
access.granted | uint.mask | required | The access mask in force. |
access.matched | uint.mask | required | The subset of the requested access that overlapped an audit mask and therefore caused the record to exist. |
access.audit-mask | uint.mask | required | The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. |
mutation.sequence | uint | optional | Present when a blanket was set: clearing one stamps no sequence. |
transaction.id | uint | optional | The transaction the operation belonged to, registry or package. |
request.timed-out | bool | when outcome.success == false | Whether a request's wait for the source's reply ran out before the reply arrived. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
operation.fd | uint | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
transaction.id | uint | required | The transaction the operation belonged to, registry or package. |
transaction.state | str.enum | required | The state it ended in: committed on success. |
transaction.commit-outstanding | bool | when outcome.success == false | Whether a transaction's commit had been sent to its source and not yet answered. |
outcome.success | bool | required | True only when the transaction committed. |
outcome.errno | int.errno | optional | Present when a REG_IOC_COMMIT call failed; absent for a transaction that ended without one. |
outcome.reason | str.enum | when outcome.success == false | aborted 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
object.key.path | str | required | The resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES. |
object.key.layer.name | str | optional | The layer whose entry was deleted. Absent only when the request failed before its layer was read. |
object.key.value.name | str | optional | Absent only when the request failed before its name was read. |
object.key.value.type-previous | uint.enum | optional | Absent when no value was found to delete. |
object.key.value.length-previous | uint.bytes | optional | Present with object.key.value.type-previous. |
object.key.value.digest-previous | bin | optional | Present with object.key.value.type-previous. |
access.requested | uint.mask | required | Always KEY_SET_VALUE. |
access.granted | uint.mask | required | The access mask in force. |
access.matched | uint.mask | required | The subset of the requested access that overlapped an audit mask and therefore caused the record to exist. |
access.audit-mask | uint.mask | required | The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. |
transaction.id | uint | optional | The transaction the operation belonged to, registry or package. |
request.timed-out | bool | when outcome.success == false | Whether a request's wait for the source's reply ran out before the reply arrived. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | via caller | The user SID of the effective token the operation ran under. |
subject.token.integrity | uint.integrity | via caller | The integrity RID of the effective token. |
subject.token.id | uint.luid | via caller | The token's own LUID, identifying this specific token rather than the logon session it belongs to. |
subject.token.auth-id | uint.luid | via caller | The LUID of the logon session the effective token belongs to. |
subject.token.type | str.enum | via caller | Whether the effective token is a primary token or an impersonation token. |
subject.token.impersonation | uint.enum | via caller | The impersonation level of the effective token. |
object.kind | str.enum | required | Always key. |
object.key.guid | bin.guid | required | The registry key an operation acted on. |
object.key.path | str | required | The resolved absolute path of the registry key, in canonical form, such as Machine\System\KMES. |
object.key.layer.name | str | optional | The layer written, base when the caller named none. Absent only when the request failed before its layer was read. |
object.key.value.name | str | optional | Absent only when the request failed before its name was read. |
object.key.value.type | uint.enum | optional | The type written. Present once the data was read from the caller. |
object.key.value.length | uint.bytes | optional | Present with object.key.value.type. |
object.key.value.digest | bin | optional | Present with object.key.value.type. |
object.key.value.type-previous | uint.enum | optional | The 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-previous | uint.bytes | optional | Present with object.key.value.type-previous. |
object.key.value.digest-previous | bin | optional | Present with object.key.value.type-previous. |
access.requested | uint.mask | required | Always KEY_SET_VALUE. |
access.granted | uint.mask | required | What the handle was opened with. |
access.matched | uint.mask | required | The subset of the requested access that overlapped an audit mask and therefore caused the record to exist. |
access.audit-mask | uint.mask | required | The full continuous-audit mask cached on a handle, of which access.matched is the part this operation touched. |
mutation.sequence | uint | optional | The sequence stamped on the write. Absent only when the request failed before one was allocated. |
mutation.sequence-expected | uint | optional | Present on a compare-and-swap write. |
transaction.id | uint | optional | Present when the write was staged in a transaction. |
request.timed-out | bool | when outcome.success == false | True when the source did not answer in time, so the write may have been applied after all. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.errno | int.errno | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
config.key.path | str | required | The registry key the reported value lives under, in canonical form. |
config.name | str | required | The name of the configuration value being reported on, within config.key.path. |
config.expected.type | uint.enum | required | The registry type the value is required to have. |
config.expected.min | uint | required | The smallest value accepted for this setting. |
config.expected.max | uint | required | The largest value accepted for this setting. |
config.received.kind | str.enum | required | How the stored value failed validation. |
config.received.type | uint.enum | when config.received.kind == wrong-type | The registry type the value actually had. |
config.received.value | uint | when config.received.kind == out-of-range | The value that was stored and rejected. |
config.value | uint | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
source.rsi.slot | uint | required | Which registry source slot supplied the data, by index. |
source.rsi.hive | str | optional | The hive the offending source data belonged to, where the failure could be attributed to one. |
request.id | uint | optional | The identifier of the source request this record concerns, for joining a record to the exchange that produced it. |
request.op-code | uint | optional | The source-protocol operation code of the request this record concerns. |
object.key.guid | bin.guid | optional | Present when the rejected data could be attributed to a specific key. |
outcome.reason | str.enum | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
buffer.capacity-requested | uint.bytes | required | The per-CPU ring buffer capacity that was asked for. |
buffer.capacity | uint.bytes | required | The capacity kept. |
outcome.errno | int.errno | required | -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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
config.key.path | str | required | Always Machine\System\KMES. |
config.counts.applied | uint | required | How many settings in a configuration refresh were applied. |
config.counts.retained-missing | uint | required | How many settings kept their previous value because they were absent from the registry. |
config.counts.retained-invalid | uint | required | How many settings kept their previous value because the stored value was rejected, of the wrong type or out of range. |
config.counts.ignored-unknown | uint | required | How many registry values were ignored because their names match no setting. |
buffer.capacity | uint.bytes | required | The per-CPU ring capacity in force after the commit. |
emission.rate-limit | uint | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
config.key.path | str | required | Machine\System\KMES or Machine\Generic\Events. |
outcome.errno | int.errno | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
config.key.path | str | required | The registry key the reported value lives under, in canonical form. |
config.name | str | required | The name of the configuration value being reported on, within config.key.path. |
config.expected.type | uint.enum | required | The registry type the value is required to have. |
config.expected.min | uint | required | The smallest value accepted for this setting. |
config.expected.max | uint | required | The largest value accepted for this setting. |
config.received.kind | str.enum | required | How the stored value failed validation. |
config.received.type | uint.enum | when config.received.kind == wrong-type | The registry type the value actually had. |
config.received.value | uint | when config.received.kind == out-of-range | The value that was stored and rejected. |
config.value | uint | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
policy.generation | uint | required | The generation this policy now runs as. Verdict records carry the same number. |
policy.generation-previous | uint | required | The 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.layers | str.enum[] | required | The rules layers the active generation loaded a forest for. |
policy.report-threshold | uint | required | The machine's reporting threshold, CurrentReportingLevel: a rule's report fires only when its level is at least this. |
policy.report-threshold-previous | uint | required | 1, 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
policy.generation | uint | required | The generation still in force, which the refused policy did not replace. |
policy.previous-retained | bool | required | Always true: NTFE never leaves part of a refused policy in force. |
outcome.errno | int.errno | when outcome.reason != no-rules-key | The error the operation failed with, as a negative errno. |
outcome.reason | str.enum | required | Why 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.name | str | optional | The 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-truncated | bool | optional | Whether rule.name was cut short because the rule's path did not fit in the record. |
rule.layer | str.enum | optional | The 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-error | str.enum | when outcome.reason == bad-action | Why 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
rule.name | str | required | The policy rule that produced this record, by name. |
rule.hash | uint | required | The FNV-1a-64 hash of the rule's whole registry path. |
rule.name-truncated | bool | optional | Whether rule.name was cut short because the rule's path did not fit in the record. |
rule.report-level | uint | required | The reporting level the matching rule asked for. |
rule.layer | str.enum | required | Which evaluation layer the rule sat in. |
rule.seat | str.enum | required | Where in the path evaluation happened. |
outcome.verdict | str.enum | required | The decision a policy engine reached, where the decision has more than two states and outcome.success cannot express it. |
outcome.reason | str.enum | when outcome.verdict == reject | Which 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.direction | str.enum | required | Which way the traffic was moving relative to this machine. |
network.interface.name | str | optional | Absent when the traffic was evaluated with no device attached, in which case network.interface.index is 0. |
network.interface.index | uint | required | The kernel's index for that interface. |
network.ether-type | uint | required | The link-layer protocol number of the frame. |
network.family | uint.enum | required | The address family of the addresses in this record. |
network.protocol | uint.enum | when network.family != 0 | The transport protocol number, from the IANA protocol numbers registry. |
source.address | str.ip | when network.family != 0 | The address the traffic came from, rendered in the textual form for its family. |
destination.address | str.ip | when network.family != 0 | The address the traffic was going to, rendered in the textual form for its family. |
source.port | uint | optional | Present when the protocol has ports. |
destination.port | uint | optional | Present when the protocol has ports. |
flow.state | str.enum | optional | Present when flow tracking applied. |
network.length | uint.bytes | required | The length of the traffic unit evaluated. |
policy.generation | uint | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
outcome.reason | str.enum | required | The finding that forced the downgrade. Values here (open set): critical-cycle · critical-boot-conflict. |
graph.services | str[] | when outcome.reason == critical-cycle | The services a graph finding involves. |
object.service.name | str | when outcome.reason == critical-boot-conflict | The name of the service the event is about, as its definition names it. |
object.service.conflict.name | str | when outcome.reason == critical-boot-conflict | 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. |
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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.service.name | str | optional | The service whose cgroup leaked. Absent for a submitted job's cgroup, which belongs to no service. |
object.job.guid | bin.guid | optional | The submitted job whose cgroup leaked. Exactly one of object.service.name and this field is present. |
object.cgroup.path | str.path | required | The cgroup the event is about, as its full path under /sys/fs/cgroup/peinit. |
object.cgroup.type | str.enum | required | service-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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
outcome.success | bool | required | Whether the operation succeeded. |
outcome.detail | str | optional | Why the reload failed, for a person. Present only when outcome.success is false. |
graph.services | str[] | optional | The 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.added | uint | when outcome.success == true | How many service definitions a configuration reload added: names that had no definition before. |
graph.counts.updated | uint | when outcome.success == true | How many existing service definitions a configuration reload changed. |
graph.counts.restored | uint | when outcome.success == true | How many definitions a configuration reload brought back after an earlier reload had removed them while their services were still running. |
graph.counts.marked-removed | uint | when outcome.success == true | How many definitions a configuration reload withdrew from services that were still running. |
graph.counts.discarded | uint | when outcome.success == true | How many definitions a configuration reload withdrew and dropped at once, because their services were not running. |
graph.counts.undecodable | uint | when outcome.success == true | How 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
graph.services | str[] | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
outcome.reason | str.enum | required | How the Critical service failed. Values here (open set): service-main-terminal · health-check-failure · watchdog-timeout · restart-budget-exhausted. |
shutdown.finalization-state | str.enum | required | How far the system shutdown had got when the event was written. |
outcome.detail | str | when shutdown.finalization-state == failed | Why 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
emission.type | str | required | The event type an emitter was trying to emit, as it supplied it. |
emission.payload-length | uint.bytes | required | The byte length of an event's MessagePack payload, without the header or the event type. |
object.service.name | str | optional | The service the refused event was about, or whose job sent it. |
object.job.guid | bin.guid | optional | The job the refused event was about, or whose process sent it. |
outcome.errno | int.errno | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
object.fd-store.name | str | required | The name a service gave a file descriptor it asked peinit to keep, with FDNAME=. |
outcome.reason | str.enum | required | disabled 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
graph.context | uint | required | 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. |
object.operation.guid | bin.guid | required | 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. |
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
outcome.success | bool | required | True 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
graph.phase | str.enum | required | When the service graph was validated. |
outcome.reason | str.enum | required | The 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.name | str | optional | The service the finding is about. Absent on cycle, which names several. |
graph.services | str[] | when outcome.reason == cycle | The services a graph finding involves. |
object.service.dependency.name | str | optional | On missing-hard-dependency and hard-dependency-blocked. |
object.service.dependency.kind | str.enum | optional | Present exactly when object.service.dependency.name is. |
object.service.conflict.name | str | when outcome.reason == conflicting-boot-services | 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. |
object.service.health-check.interval | uint.duration | when outcome.reason == invalid-health-check-restart-window | The configured interval between health checks, in nanoseconds. |
object.service.health-check.retries | uint | when outcome.reason == invalid-health-check-restart-window | The configured number of consecutive health-check failures at which peinit stops reporting the service unhealthy and acts on it. |
object.service.health-check.restart-window | uint.duration | when outcome.reason == invalid-health-check-restart-window | The configured restart window of a health check, in nanoseconds. |
object.service.type | str.enum | when outcome.reason == unschedulable-health-check | How the service's main process is supervised. |
object.service.timer.schedule | str | when outcome.reason == invalid-timer-schedule | The service's timer schedule, exactly as its definition wrote it. |
outcome.detail | str | optional | On 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
graph.phase | str.enum | required | When the service graph was validated. |
outcome.reason | str.enum | required | The warning. Values here (open set): alive-readiness-with-hard-dependents · unfilled-role. |
object.service.name | str | when outcome.reason == alive-readiness-with-hard-dependents | The name of the service the event is about, as its definition names it. |
object.service.dependents | str[] | when outcome.reason == alive-readiness-with-hard-dependents | The services that hard-depend on this one, by name. |
graph.role | str | when outcome.reason == unfilled-role | The role no service fills. |
graph.services | str[] | when outcome.reason == unfilled-role | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
operation.stage | str.enum | required | The step peinit could not carry out. Values here (open set): job-terminal · process-setup · lifecycle-deadline · notify. |
object.service.name | str | optional | The name of the service the event is about, as its definition names it. |
object.job.guid | bin.guid | optional | The job the event is about. |
object.service.failed | bool | optional | Present 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.job.guid | bin.guid | required | The job the event is about. |
object.job.type | str.enum | required | What the job is for. |
object.job.state | str.enum | required | Always created. |
object.service.name | str | when object.job.type != submitted | The name of the service the event is about, as its definition names it. |
object.job.activation-generation | uint | when object.job.type != submitted | The activation generation of the service the job belongs to, at the time the job was created. |
object.operation.guid | bin.guid | optional | The operation the job serves. Absent when none asked for it, as for a submitted job. |
object.job.executable | str.path | required | The path of the executable the job runs. |
object.job.token.sid | bin.sid | optional | A 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.groups | bin.sid[] | optional | Present once peinit holds the job's token: a submitted job's at once, a service job's from peinit.job.started. |
object.job.token.privileges | uint.flags | optional | Present exactly when object.job.token.groups is. |
object.job.token.privileges-enabled | uint.flags | optional | Present 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.job.guid | bin.guid | required | The job the event is about. |
object.job.type | str.enum | required | What the job is for. |
object.job.state | str.enum | required | The terminal state: completed, failed or abandoned. |
outcome.success | bool | required | True exactly when object.job.state is completed. |
outcome.detail | str | optional | Why 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.name | str | when object.job.type != submitted | The name of the service the event is about, as its definition names it. |
object.job.activation-generation | uint | when object.job.type != submitted | The activation generation of the service the job belongs to, at the time the job was created. |
object.operation.guid | bin.guid | optional | 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. |
object.process.pid | uint | optional | Absent when the process never started. |
object.process.exit-code | int | optional | The exit code of the job's process, as it passed it to exit. |
object.process.exit-signal | int | optional | The number of the signal that ended the job's process. |
object.job.executable | str.path | required | The path of the executable the job runs. |
object.job.arguments | str[] | required | The job's argument vector, including argv[0]. |
object.job.arguments-truncated | bool | required | Whether object.job.arguments was cut to fit the record. |
object.job.arguments-count | uint | required | How many arguments the job was given, before any were cut. |
object.job.created-time | uint.time | required | When peinit created the job, in nanoseconds since the Unix epoch. |
object.job.started-time | uint.time | optional | When the job's process started, in nanoseconds since the Unix epoch. |
object.job.duration | uint.duration | required | How long the job lasted, in nanoseconds, from its creation to its end. |
object.cgroup.path | str.path | required | The cgroup the event is about, as its full path under /sys/fs/cgroup/peinit. |
object.cgroup.generation | uint | required | The cgroup generation of the service the cgroup belongs to. |
object.job.token.sid | bin.sid | optional | As 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.groups | bin.sid[] | optional | Present exactly when the job's process started, or it is a submitted job. |
object.job.token.privileges | uint.flags | optional | Present exactly when object.job.token.groups is. |
object.job.token.privileges-enabled | uint.flags | optional | Present 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.job.guid | bin.guid | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.job.guid | bin.guid | required | The job the event is about. |
object.job.type | str.enum | required | What the job is for. |
object.job.state | str.enum | required | Always running. |
object.service.name | str | when object.job.type != submitted | The name of the service the event is about, as its definition names it. |
object.job.activation-generation | uint | when object.job.type != submitted | The activation generation of the service the job belongs to, at the time the job was created. |
object.operation.guid | bin.guid | optional | 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. |
object.process.pid | uint | required | The job's process. |
object.cgroup.path | str.path | required | The cgroup the job's process runs in. |
object.job.token.sid | bin.sid | required | The user SID of the token the job's process runs as. |
object.job.token.groups | bin.sid[] | required | The group SIDs of the token the job's process runs as, in the token's order. |
object.job.token.privileges | uint.flags | required | 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. |
object.job.token.privileges-enabled | uint.flags | required | Which 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.job.guid | bin.guid | required | The job the event is about. |
object.job.submitter.sid | bin.sid | required | The user SID of the client that submitted the job. |
notify.status | str | optional | The text a service sent as STATUS=: free text describing what it is doing. |
notify.progress.current | uint | optional | How far a service or submitted job has got, as it reported with PROGRESS=: the count before any /. |
notify.progress.total | uint | optional | The end notify.progress.current is counting towards, as reported after the / of PROGRESS=. |
notify.progress.bounded | bool | optional | 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). |
notify.progress.unit | str.enum | optional | What 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.service.name | str | required | The service whose job sent a notification message. |
subject.job.guid | bin.guid | required | The job whose process sent a notification message: the service's main process, or a submitted job. |
subject.job.activation-generation | uint | required | The activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it. |
subject.operation.guid | bin.guid | optional | The peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes. |
notify.errno | int.errno | optional | Absent 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.service.name | str | required | The service whose job sent a notification message. |
subject.job.guid | bin.guid | required | The job whose process sent a notification message: the service's main process, or a submitted job. |
subject.job.activation-generation | uint | required | The activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it. |
subject.operation.guid | bin.guid | optional | The peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes. |
notify.exit-status | int | optional | Absent 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.service.name | str | required | The service whose job sent a notification message. |
subject.job.guid | bin.guid | required | The job whose process sent a notification message: the service's main process, or a submitted job. |
subject.job.activation-generation | uint | required | The activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it. |
subject.operation.guid | bin.guid | optional | The peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes. |
notify.progress.current | uint | optional | How far a service or submitted job has got, as it reported with PROGRESS=: the count before any /. |
notify.progress.total | uint | optional | The end notify.progress.current is counting towards, as reported after the / of PROGRESS=. |
notify.progress.bounded | bool | optional | 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). |
notify.progress.unit | str.enum | optional | What 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
outcome.reason | str.enum | required | Why 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.pid | uint | optional | The sending process, when the kernel gave its credentials. |
subject.service.name | str | optional | The sender's service, when peinit could attribute it. |
subject.job.guid | bin.guid | optional | The job whose process sent a notification message: the service's main process, or a submitted job. |
subject.job.activation-generation | uint | optional | The activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it. |
subject.operation.guid | bin.guid | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.service.name | str | required | The service whose job sent a notification message. |
subject.job.guid | bin.guid | required | The job whose process sent a notification message: the service's main process, or a submitted job. |
subject.job.activation-generation | uint | required | The activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it. |
subject.operation.guid | bin.guid | optional | The peinit operation the sending job was serving when it sent a notification message, such as the start that a readiness message completes. |
notify.status | str | required | The 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=1is 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.service.name | str | required | The service whose job sent a notification message. |
subject.job.guid | bin.guid | required | The job whose process sent a notification message: the service's main process, or a submitted job. |
subject.job.activation-generation | uint | required | The activation generation of the service whose job sent a notification message, as object.job.activation-generation describes it. |
subject.operation.guid | bin.guid | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.service.name | str | required | The service whose failure the chain was handling. |
object.service.on-failure.name | str | required | The OnFailure handler peinit declined to start, because starting it would have looped or gone too deep. |
object.service.on-failure-chain | str[] | required | The OnFailure handlers already started in the chain that peinit cut short, in the order they were started. |
outcome.reason | str.enum | required | Why 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.operation.guid | bin.guid | required | 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. |
object.operation.type | str.enum | required | What the operation does to its service. |
object.operation.source | str.enum | required | Who or what asked for the operation. |
object.operation.state | str.enum | required | completed, failed, cancelled or aborted. |
outcome.success | bool | required | True exactly when object.operation.state is completed. |
outcome.detail | str | optional | The 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.duration | uint.duration | optional | From the request, not from the start. Absent on a cancelled operation, which never ran. |
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
subject.token.sid | bin.sid | optional | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | optional | The group SIDs carried by the effective token. |
subject.token.privileges | uint.flags | optional | 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. |
subject.token.privileges-enabled | uint.flags | optional | Which 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.operation.guid | bin.guid | required | 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. |
object.operation.type | str.enum | required | What the operation does to its service. |
object.operation.source | str.enum | required | Who or what asked for the operation. |
object.operation.state | str.enum | required | Always merged. |
object.operation.merged-into.guid | bin.guid | required | The operation that absorbed this one. |
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
subject.token.sid | bin.sid | optional | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | optional | The group SIDs carried by the effective token. |
subject.token.privileges | uint.flags | optional | 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. |
subject.token.privileges-enabled | uint.flags | optional | Which 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.operation.guid | bin.guid | required | 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. |
object.operation.type | str.enum | required | What the operation does to its service. |
object.operation.source | str.enum | required | Who or what asked for the operation. |
object.operation.state | str.enum | required | Always pending. |
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
subject.token.sid | bin.sid | optional | The client whose command created the operation. Absent for an operation peinit created itself. |
subject.token.groups | bin.sid[] | optional | Written 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.privileges | uint.flags | optional | Present exactly when subject.token.groups is. |
subject.token.privileges-enabled | uint.flags | optional | Present 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.operation.guid | bin.guid | required | 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. |
object.operation.type | str.enum | required | What the operation does to its service. |
object.operation.source | str.enum | required | Who or what asked for the operation. |
object.operation.state | str.enum | required | Always running. |
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
subject.token.sid | bin.sid | optional | The user SID of the effective token the operation ran under. |
subject.token.groups | bin.sid[] | optional | The group SIDs carried by the effective token. |
subject.token.privileges | uint.flags | optional | 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. |
subject.token.privileges-enabled | uint.flags | optional | Which 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
outcome.reason | str.enum | required | Why 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.detail | str | optional | What 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.service.name | str | required | The name of the service the event is about, as its definition names it. |
object.cgroup.path | str.path | required | The cgroup the event is about, as its full path under /sys/fs/cgroup/peinit. |
object.service.state-previous | str.enum | required | The service's state before the event, with the same values as object.service.state. |
object.service.state | str.enum | required | Always abandoned. |
object.service.transition-cause | str.enum | required | Why the service's state changed. |
object.service.generation | uint | required | 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. |
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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.service.name | str | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
operation.name | str.enum | required | Which 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.name | str | optional | The 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.path | str.path | when operation.name == remove-modified-file | The modified file the uninstall would remove, as the package database records it: absolute within the root peipkg operated on. |
object.repository.name | str | optional | The repository, for stale-trust-state and stale-index. |
outcome.success | bool | required | False when the operator declined. For remove-modified-file, keeping the file and aborting the transaction both decline the removal. |
outcome.detail | str | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
transaction.id | uint | optional | The transaction the operation belonged to, registry or package. |
object.claim.role | str | required | The role a claim event changed the holder of. |
object.claim.holder | str | optional | The package that holds object.claim.role after the event, by name. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | Why the operation resolved the way it did. Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed. |
outcome.detail | str | optional | Free 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The 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.id | uint | optional | The 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.name | str | optional | Absent only on a refused request that named no package. |
object.package.version | str | optional | The version installed. Absent on a refused request that named no version. |
object.package.architecture | str | optional | The architecture of the package an event is about: an identifier of PSPU §5.8, such as x86_64, aarch64 or noarch. |
source.repository.name | str | optional | Absent for an install from a local file. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | peipkg'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.detail | str | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
transaction.id | uint | optional | Absent when the request was refused before a transaction opened. |
object.package.name | str | required | The name of the package the event is about. |
object.package.version | str | optional | The version removed. Absent on a refused request. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | Why the operation resolved the way it did. Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed. |
outcome.detail | str | optional | Free 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
transaction.id | uint | optional | Absent when the request was refused before a transaction opened, or when a cross-root transaction failed while preparing its roots. |
object.package.name | str | optional | Absent only on a refused request that named no package, such as an upgrade of everything. |
object.package.version | str | optional | The version the package moved to. |
object.package.version-previous | str | optional | The version it moved from. Absent on a refused request. |
object.package.architecture | str | optional | The architecture of the package an event is about: an identifier of PSPU §5.8, such as x86_64, aarch64 or noarch. |
source.repository.name | str | optional | Absent for an upgrade from a local file. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | Why the operation resolved the way it did. Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed. |
outcome.detail | str | optional | Free 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
object.repository.name | str | required | The repository the event is about, by the name it is configured under. |
object.repository.url | str | required | The base URL of the repository the event is about, which is what identifies it (PSPU §5.36). |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | Why the operation resolved the way it did. Values here (open set): stale · busy · denied · unowned · alternate-upgrade · unresolvable · untrusted · failed. |
outcome.detail | str | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
object.repository.name | str | required | The repository the event is about, by the name it is configured under. |
config.name | str | required | The setting's name as written in the repository file. |
config.text | str | when config.name == signature_policy | 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. |
config.text-previous | str | when config.name == signature_policy | The text value a change replaced, beside config.text. |
config.value | uint | optional | The 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-previous | uint | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
operation.succeeded-count | uint | required | Repositories refreshed. |
operation.failed-count | uint | required | Repositories whose refresh failed. |
outcome.success | bool | required | False 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
object.repository.name | str | required | The repository the event is about, by the name it is configured under. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.detail | str | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The user SID of the effective token the operation ran under. |
operation.succeeded-count | uint | required | Interrupted transactions rolled back, before the failure on a run that failed. Zero when there were none. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.detail | str | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
config.key.path | str | required | Always Machine\System\eventd. |
config.name | str | required | The name of the configuration value being reported on, within config.key.path. |
config.type | uint.enum | optional | Absent when the change removed the value. Present exactly when config.value is. |
config.type-previous | uint.enum | optional | Absent when the value was not set before. Present exactly when config.value-previous is. |
config.value | uint | optional | The value in force after the event. |
config.value-previous | uint | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
store.restarted | bool | required | 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. |
store.shard-count | uint | required | How many active event-store shards eventd is running with, after resolving its configured shard count. |
store.resume.cpus | uint[] | required | The CPUs whose KMES rings eventd resumed reading at startup, one entry per logical CPU in ascending order. |
store.resume.sequences | uint[] | required | 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. |
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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
store.committed.cpus | uint[] | optional | Absent when eventd could not read its record of what it had committed (PEI-1394), rather than written as zeroes. |
store.committed.sequences | uint[] | optional | Present 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
buffer.cpu | uint | required | The logical CPU whose ring buffer a record concerns. |
loss.sequence | uint | required | The first sequence number a loss covers. |
loss.sequence-last | uint | required | The last sequence number of a gap, where loss.sequence is the first. |
loss.count | uint | required | The number of events lost in one occurrence. |
loss.preceding-time | uint.time | optional | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
store.kind | str.enum | required | Which of eventd's stores a record is about: the sharded event store, the log store or the metric store. |
store.shard | uint | when store.kind == event | Absent for the log and metric stores, which are not sharded (PEI-1394). |
outcome.detail | str | required | The 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
LogonStartauthd 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
source.token.sid | bin.sid | required | The originator: the principal of the process on the other end of /run/logon.sock that asked for the logon. |
source.address | str.ip | optional | The 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-type | str.enum | required | The logon type the originator asked for, whether or not it was granted. |
object.session.auth-package | str | optional | The principal source authd asked to verify the credential. Absent when the logon was refused before a source was chosen. |
subject.token.sid | bin.sid | when outcome.success == true | The principal signed in: the user SID of the token minted. |
object.session.id | uint.luid | optional | The 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.id | uint.luid | optional | The token minted for the originator, present exactly when object.session.id is. |
outcome.success | bool | required | True only when the token reached the originator. |
outcome.reason | str.enum | when outcome.success == false | The 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
ServiceAttestauthd 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The principal that asked: the user SID of the peer's token, SYSTEM for the service manager. |
object.service.name | str | optional | The service the token is for, as the service manager named it. Absent only when the request named no service. |
object.token.sid | bin.sid | optional | The 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.id | uint.luid | optional | The logon session created for the service, present exactly when object.token.sid is. |
object.token.id | uint.luid | optional | The token minted, present exactly when object.token.sid is. |
object.token.privileges | uint.flags | optional | The privileges local policy granted the token, all of them enabled. Present exactly when object.token.sid is. |
outcome.success | bool | required | True only when the token reached the service manager. |
outcome.reason | str.enum | when outcome.success == false | The 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
SessionEndauthd 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The principal that asked: themselves, signing out, or someone the descriptor permits to end other principals' sessions. |
object.session.id | uint.luid | required | The LUID of the logon session the operation acted on. |
object.session.user.sid | bin.sid | required | Whose session it was. |
object.session.logon-type | str.enum | required | What kind of logon the session represents, from the KACS_LOGON_TYPE_* values in uapi/pkm/token.h. |
outcome.success | bool | required | True when no process was left holding the session. |
outcome.reason | str.enum | when outcome.success == false | Some 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The administrator: the user SID of the token that asked. |
object.account.sid | bin.sid | when outcome.success == true | The new account. |
outcome.success | bool | required | True once the account is durable. |
outcome.reason | str.enum | when outcome.success == false | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The administrator. |
object.account.sid | bin.sid | optional | The account. Absent when no account had the name asked for. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | invalid 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The principal that asked: an administrator, or the account itself for set-display-name. |
object.account.sid | bin.sid | optional | The account changed. Absent when no account had the name asked for. |
object.group.sid | bin.sid | optional | For set-primary-group, the group made the account's primary group. |
operation.name | str.enum | required | The 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.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | denied 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The 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.sid | bin.sid | required | 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. |
operation.name | str.enum | required | Which operation was attempted. Values here (open set): password · ssh-key-added · ssh-key-removed. |
outcome.success | bool | required | True once the change is durable. |
outcome.reason | str.enum | when outcome.success == false | no-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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | lpsd itself, the principal that checked the credential: the user SID of lpsd's own token, which is its service account. |
object.account.sid | bin.sid | optional | The account the credential was checked for. Absent when lpsd holds no account by the name it was asked about. |
operation.name | str.enum | required | What 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.success | bool | required | True when lpsd told authd who the principal is. |
outcome.reason | str.enum | when outcome.success == false | not-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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The administrator. |
object.group.sid | bin.sid | when outcome.success == true | The new group. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | Why 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The administrator. |
object.group.sid | bin.sid | optional | The group. Absent when no group had the name asked for. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | Why 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The administrator. |
object.account.sid | bin.sid | optional | The account. Absent when no account had the name asked for. |
object.group.sid | bin.sid | optional | The group. Absent when no group had the name asked for. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | Why 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
subject.token.sid | bin.sid | required | The administrator. |
object.account.sid | bin.sid | optional | The account. Absent when no account had the name asked for. |
object.group.sid | bin.sid | optional | The group. Absent when no group had the name asked for. |
outcome.success | bool | required | Whether the operation succeeded. |
outcome.reason | str.enum | when outcome.success == false | invalid 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
operation.name | str.enum | required | Why 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.time | uint.time | required | Never before the build's timestamp: timed refuses a step that would land there. |
clock.time-previous | uint.time | optional | The wall clock's reading just before timed moved it, the counterpart of clock.time. |
subject.token.sid | bin.sid | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
config.name | str | required | Always Hostname, the setting the name is held in, whether the value in force came from the registry or from a lease. |
config.text | str | required | The name now in force, as netd passed it to the kernel. |
config.text-previous | str | optional | The 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.sid | bin.sid | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.certificate.digest | bin | required | 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. |
object.certificate.name | str | required | 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. |
object.certificate.purposes | str.enum[] | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.certificate.digest | bin | required | 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. |
object.certificate.name | str | required | 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. |
object.certificate.purposes | str.enum[] | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.certificate.digest | bin | required | 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. |
object.certificate.name | str | required | 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. |
object.certificate.purposes | str.enum[] | required | The 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 #
| Field | Type | Presence | Meaning |
|---|---|---|---|
object.certificate.digest | bin | required | The new certificate's SHA-256 digest. |
object.certificate.digest-previous | bin | required | 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. |
object.certificate.name | str | required | The 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.
| Offset | Size | Field |
|---|---|---|
| 0 | 4 | total_len |
| 4 | 2 | event_type |
| 6 | 2 | name_len |
| 8 | name_len | name, 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.
| Size | Field |
|---|---|
| 2 | path_depth |
2 + n each | path_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 type | Tier | Fragment | Summary |
|---|---|---|---|
kacs.audit.access.checked | essential | kacs.evman | The record that an access check completed, and what it decided. |
kacs.audit.descriptor.changed | essential | kacs.evman | 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. |
kacs.audit.handle.used | essential | kacs.evman | The record of what was done with a handle after it was opened. |
kacs.audit.privilege.used | essential | kacs.evman | The record that a privilege was spent. |
kacs.caap.policy.changed | essential | kacs.evman | The record that a central access policy was installed, replaced or removed. |
kacs.caap.sacl.skipped | standard | kacs.evman | The 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.diverged | standard | kacs.evman | The record that a staged central access policy would have decided an access differently from the policy in force. |
kacs.config.value.rejected | essential | kacs.evman | The record that KACS read one of its registry-held tables, rejected it, and carried on with what it had. |
kacs.descriptor.rejected | standard | kacs.evman | The record that KACS read an object's stored security descriptor, found it corrupt, and refused to use it. |
kacs.impersonation.reverted | verbose | kacs.evman | The record that a thread stopped impersonating and acts as its own token again. |
kacs.impersonation.started | standard | kacs.evman | The record that a thread took on, or tried to take on, a client's identity by impersonating its token. |
kacs.mount.policy.changed | essential | kacs.evman | The record that a filesystem's KACS mount policy was set: what happens to an object on it that has no stored descriptor. |
kacs.session.destroyed | essential | kacs.evman | The record that a logon session ended because its last token went away. |
kacs.signature.crypto.failed | essential | kacs.evman | The record that the machinery for verifying signed executables cannot run. |
A.2 Filesystem Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
stratafs.file.copied-up | standard | stratafs.evman | The record that StrataFS materialised an object into a writable stratum, successful or not. |
stratafs.mutation.refused | standard | stratafs.evman | The 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 type | Tier | Fragment | Summary |
|---|---|---|---|
lcs.audit.backup.ended | essential | lcs.evman | The record that a registry subtree backup finished, successfully or otherwise. |
lcs.audit.backup.started | essential | lcs.evman | The record that a registry subtree backup began, emitted before any data is read. |
lcs.audit.key.created | essential | lcs.evman | The record that a registry key was created. |
lcs.audit.key.deleted | essential | lcs.evman | The record that a registry key was deleted from a layer through its own handle, or that an attempt failed. |
lcs.audit.key.descriptor.changed | essential | lcs.evman | The record that a registry key's security descriptor was changed through a key handle, or that an attempt failed. |
lcs.audit.key.hidden | essential | lcs.evman | The record that a registry key was hidden in a layer through its own handle, or that an attempt failed. |
lcs.audit.key.opened | essential | lcs.evman | The record that a registry key was opened and what access the open received. |
lcs.audit.key.tombstoned | essential | lcs.evman | The record that a key's blanket tombstone was set or cleared in a layer, or that an attempt failed. |
lcs.audit.restore.ended | essential | lcs.evman | The record that a registry subtree restore finished, successfully or otherwise. |
lcs.audit.restore.started | essential | lcs.evman | The record that a registry subtree restore began, emitted before any state is modified. |
lcs.audit.transaction.committed | essential | lcs.evman | The record of how a registry transaction ended, written for a transaction that staged at least one write some other record covers. |
lcs.audit.value.deleted | essential | lcs.evman | The record that a registry value was deleted through a key handle, or that an attempt to delete one failed. |
lcs.audit.value.set | essential | lcs.evman | The record that a registry value was written through a key handle, or that an attempt to write one failed. |
lcs.config.value.rejected | essential | lcs.evman | The record that LCS read one of its own configuration values, rejected it, and carried on with what it had. |
lcs.source.response.rejected | essential | lcs.evman | The record that LCS rejected data a registry source sent it. |
A.4 Event Stream Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
kmes.buffer.swap.failed | standard | kmes.evman | The record that KMES could not resize its per-CPU ring buffers and kept the capacity it had. |
kmes.config.applied | standard | kmes.evman | The record that KMES read its configuration key and committed what it found. |
kmes.config.refresh.failed | essential | kmes.evman | The record that KMES could not read one of its configuration keys and kept running on what it had. |
kmes.config.value.rejected | essential | kmes.evman | The record that KMES read a configuration value, rejected it, and carried on with what it had. |
A.5 Network Policy Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
ntfe.policy.published | standard | ntfe.evman | The record that a new generation of traffic rules went into force. |
ntfe.policy.rejected | essential | ntfe.evman | 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.verdict.reported | essential | ntfe.evman | The record of a traffic policy decision that a rule explicitly asked to be reported. |
A.6 Service Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
peinit.boot.downgraded | essential | peinit.evman | A full boot was downgraded to safe mode: the machine is running a reduced service set. |
peinit.cgroup.leaked | standard | peinit.evman | A cgroup could not be reclaimed: its processes do not respond to the kernel, and the cgroup is leaked. |
peinit.config.reload.applied | standard | peinit.evman | A 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.deferred | verbose | peinit.evman | A configuration reload during the boot window changed definitions of services the boot plan had not yet launched. |
peinit.critical-service.failed | essential | peinit.evman | A service marked Critical failed, and peinit took the machine to its reboot final action. |
peinit.event.dropped | essential | peinit.evman | The ring refused one of peinit's events, and it is gone. |
peinit.fd-store.rejected | standard | peinit.evman | peinit refused a file descriptor a service asked it to keep. |
peinit.graph.operation.ended | verbose | peinit.evman | 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. |
peinit.graph.validation.failed | standard | peinit.evman | The service graph failed validation for the reason in outcome.reason. |
peinit.graph.validation.warned | standard | peinit.evman | The service graph passed validation with a warning: nothing was refused, but something will not behave as its author probably expects. |
peinit.internal-error.contained | standard | peinit.evman | peinit could not carry out a step on a service's behalf, and contained the fault to that service. |
peinit.job.created | verbose | peinit.evman | A job exists: peinit has decided to run a process and recorded it, before the process exists. |
peinit.job.ended | standard | peinit.evman | A job is over: its process exited or was killed, or the job ended without its process ever starting. |
peinit.job.output.dropped | standard | peinit.evman | A submitted job's submitter stopped draining its output, and peinit began dropping the submitter's copy of the job's lines. |
peinit.job.started | standard | peinit.evman | A 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.reported | verbose | peinit.evman | A submitted job reported STATUS= or PROGRESS= on the notification channel, and this is what peinit retained after it. |
peinit.notify.errno.reported | standard | peinit.evman | A service's job sent ERRNO=: its own claim about an error, which peinit neither acts on nor retains. |
peinit.notify.exit-status.reported | standard | peinit.evman | A service's job sent EXIT_STATUS=, informationally; it is not the exit of any process. |
peinit.notify.progress.reported | verbose | peinit.evman | A service's job sent PROGRESS= or PROGRESS_UNIT=, and this is the progress peinit retained after it. |
peinit.notify.rejected | standard | peinit.evman | 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. |
peinit.notify.status.reported | verbose | peinit.evman | A service's job sent STATUS= on the notification channel. |
peinit.notify.stopping.reported | standard | peinit.evman | A service's job sent STOPPING=1, so peinit will not send it SIGTERM. |
peinit.on-failure.suppressed | standard | peinit.evman | 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. |
peinit.operation.ended | standard | peinit.evman | An operation reached a terminal state other than merged: it completed, failed, was cancelled while still pending, or was aborted while running. |
peinit.operation.merged | verbose | peinit.evman | 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. |
peinit.operation.requested | standard | peinit.evman | An operation on a service — a start, stop, restart, reload or reset — was created. |
peinit.operation.started | verbose | peinit.evman | An operation left the queue and began to run. |
peinit.recovery.entered | essential | peinit.evman | peinit dropped the machine to a recovery shell, for the reason in outcome.reason. |
peinit.service.abandoned | standard | peinit.evman | 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. |
peinit.service.reload.timed-out | standard | peinit.evman | A 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 type | Tier | Fragment | Summary |
|---|---|---|---|
peipkg.action.authorised | essential | peipkg.evman | The record that the operator was asked to authorise an elevated action specifically, apart from the routine proceed prompt, and what they answered. |
peipkg.claim.changed | standard | peipkg.evman | The record that peipkg granted a role to a package or revoked it, or tried to and failed. |
peipkg.package.installed | essential | peipkg.evman | The record that peipkg installed a package, or tried to and failed. |
peipkg.package.uninstalled | essential | peipkg.evman | The record that peipkg removed a package, or tried to and failed. |
peipkg.package.upgraded | essential | peipkg.evman | The record that peipkg moved an installed package to another version, or tried to and failed. |
peipkg.repository.added | essential | peipkg.evman | The record that peipkg added a repository and established trust in it, or tried to and failed. |
peipkg.repository.reconfigured | essential | peipkg.evman | The record that a repository add changed one of an existing repository's trust-relevant settings. |
peipkg.repository.refreshed | standard | peipkg.evman | The record that peipkg refreshed the metadata of its configured repositories. |
peipkg.repository.removed | essential | peipkg.evman | The record that peipkg removed a repository from its configuration and database, or tried to and failed. |
peipkg.transaction.recovered | standard | peipkg.evman | The record that peipkg recover reconciled interrupted transactions, rolling back each one it found pending, or failed to. |
A.8 Event Store Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
eventd.config.changed | essential | eventd.evman | The record that eventd applied a change to one of its configuration values at runtime. |
eventd.daemon.started | essential | eventd.evman | The record that eventd started, attached to KMES and decided where to resume reading each CPU's ring. |
eventd.daemon.stopped | essential | eventd.evman | The record that eventd shut down gracefully, written after it stopped reading the rings and committed everything it had read. |
eventd.events.lost | essential | eventd.evman | The record that eventd found events missing from a CPU's ring: sequence numbers it never read and never stored. |
eventd.store.quarantined | essential | eventd.evman | The 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 type | Tier | Fragment | Summary |
|---|---|---|---|
authd.logon.attempted | essential | authd.evman | The record that something asked authd to sign a principal in, and whether it did. |
authd.service.attested | standard | authd.evman | The record that the service manager asked authd for a service's token, with no credential behind it, and whether authd minted one. |
authd.session.ended | essential | authd.evman | 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). |
A.10 Local Principal Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
lpsd.account.created | essential | lpsd.evman | The record that an administrator created a local account with lps, or tried to. |
lpsd.account.deleted | essential | lpsd.evman | The record that an administrator deleted a local account with lps, or tried to. |
lpsd.account.modified | essential | lpsd.evman | The record that an account was changed: by an administrator with lps, or by the principal themselves where the self socket allows it. |
lpsd.credential.changed | essential | lpsd.evman | 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. |
lpsd.credential.verified | standard | lpsd.evman | The record that lpsd checked a credential for a logon authd relayed to it, and what it found. |
lpsd.group.created | essential | lpsd.evman | The record that an administrator created a local group with lps, or tried to. |
lpsd.group.deleted | essential | lpsd.evman | The record that an administrator deleted a local group with lps, or tried to. |
lpsd.group.member.added | essential | lpsd.evman | The record that an administrator added an account to a group with lps, or tried to. |
lpsd.group.member.removed | essential | lpsd.evman | The record that an administrator removed an account from a group with lps, or tried to. |
A.11 Time Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
timed.clock.stepped | essential | timed.evman | timed moved the system clock at once by an arbitrary amount, rather than adjusting its rate. |
A.12 Network Configuration Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
netd.hostname.changed | essential | netd.evman | netd changed the machine's hostname. |
A.13 Trust Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
trustd.root.added | standard | trustd.evman | A root certificate authority entered the set this machine trusts. |
trustd.root.distrusted | standard | trustd.evman | A distrust took a root certificate authority out of the set this machine trusts. |
trustd.root.removed | standard | trustd.evman | 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.14 Desktop Server Events #
| Event type | Tier | Fragment | Summary |
|---|---|---|---|
gxwid.certificate.renewed | essential | gxwid.evman | gxwid 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.changedkacs.audit.handle.usedlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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:
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:
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.checkedkacs.audit.descriptor.changedkacs.audit.handle.usedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.caap.staging.divergedlcs.audit.key.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.openedlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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:
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.changedkacs.audit.handle.usedlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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.checkedkacs.audit.descriptor.changedkacs.audit.handle.usedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.caap.staging.divergedlcs.audit.key.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.openedlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.changedkacs.config.value.rejectedkmes.config.appliedkmes.config.refresh.failedkmes.config.value.rejectedlcs.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.changedkacs.config.value.rejectedkmes.config.value.rejectedlcs.config.value.rejectednetd.hostname.changedpeipkg.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:
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:
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:
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:
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:
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:
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:
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.changedkmes.config.value.rejectedlcs.config.value.rejectedpeipkg.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:
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:
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:
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:
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:
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:
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:
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:
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)
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:
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.checkedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.downgradedpeinit.config.reload.appliedpeinit.config.reload.deferredpeinit.graph.validation.failedpeinit.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.createdlpsd.account.deletedlpsd.account.modifiedlpsd.credential.changedlpsd.credential.verifiedlpsd.group.member.addedlpsd.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.checkedkacs.audit.descriptor.changedkacs.audit.handle.usedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.caap.staging.divergedkacs.descriptor.rejectedpeipkg.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:
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.modifiedlpsd.group.createdlpsd.group.deletedlpsd.group.member.addedlpsd.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:
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:
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:
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:
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:
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:
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:
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:
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:
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.leakedpeinit.event.droppedpeinit.internal-error.containedpeinit.job.createdpeinit.job.endedpeinit.job.output.droppedpeinit.job.startedpeinit.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:
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:
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:
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:
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:
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:
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:
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:
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:
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.endedlcs.audit.backup.startedlcs.audit.key.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.openedlcs.audit.key.tombstonedlcs.audit.restore.endedlcs.audit.restore.startedlcs.audit.value.deletedlcs.audit.value.setlcs.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.createdlcs.audit.key.deletedlcs.audit.key.hiddenlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.checkedkacs.audit.descriptor.changedkacs.audit.handle.usedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.caap.staging.divergedkacs.descriptor.rejectedkacs.impersonation.revertedkacs.impersonation.startedlcs.audit.key.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.openedlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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:
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:
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:
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:
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:
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:
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.endedpeinit.job.createdpeinit.job.endedpeinit.job.startedpeinit.operation.endedpeinit.operation.mergedpeinit.operation.requestedpeinit.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:
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:
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:
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:
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:
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.authorisedpeipkg.package.installedpeipkg.package.uninstalledpeipkg.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:
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:
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:
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:
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.checkedkacs.audit.descriptor.changedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.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.checkedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.caap.staging.divergedpeinit.job.endedpeinit.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.authorisedpeipkg.repository.addedpeipkg.repository.reconfiguredpeipkg.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:
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:
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:
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:
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.changedkacs.descriptor.rejectedlcs.audit.key.createdlcs.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.attestedpeinit.boot.downgradedpeinit.cgroup.leakedpeinit.critical-service.failedpeinit.event.droppedpeinit.fd-store.rejectedpeinit.graph.operation.endedpeinit.graph.validation.failedpeinit.graph.validation.warnedpeinit.internal-error.containedpeinit.job.createdpeinit.job.endedpeinit.job.startedpeinit.on-failure.suppressedpeinit.operation.endedpeinit.operation.mergedpeinit.operation.requestedpeinit.operation.startedpeinit.service.abandonedpeinit.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.checkedkacs.audit.descriptor.changedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.caap.staging.divergedkacs.impersonation.revertedkacs.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.attemptedauthd.service.attestedkacs.audit.access.checkedkacs.audit.descriptor.changedkacs.audit.privilege.usedkacs.caap.sacl.skippedkacs.caap.staging.divergedkacs.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:
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:
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:
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:
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:
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:
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:
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:
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:
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.usedkacs.audit.privilege.usedkacs.caap.policy.changedkacs.impersonation.revertedlcs.audit.key.tombstonedlpsd.account.modifiedlpsd.credential.changedlpsd.credential.verifiedpeipkg.action.authorisedstratafs.mutation.refusedtimed.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:
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:
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:
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.quarantinedpeinit.config.reload.appliedpeinit.critical-service.failedpeinit.graph.validation.failedpeinit.job.endedpeinit.operation.endedpeinit.recovery.enteredpeipkg.action.authorisedpeipkg.claim.changedpeipkg.package.installedpeipkg.package.uninstalledpeipkg.package.upgradedpeipkg.repository.addedpeipkg.repository.removedpeipkg.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.changedkacs.caap.policy.changedkacs.config.value.rejectedkacs.impersonation.revertedkacs.impersonation.startedkacs.signature.crypto.failedkmes.buffer.swap.failedkmes.config.refresh.failedlcs.audit.backup.endedlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.tombstonedlcs.audit.restore.endedlcs.audit.transaction.committedlcs.audit.value.deletedlcs.audit.value.setntfe.policy.rejectedpeinit.event.droppedstratafs.file.copied-upstratafs.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.attemptedauthd.service.attestedauthd.session.endedkacs.audit.handle.usedkacs.caap.sacl.skippedkacs.config.value.rejectedkacs.descriptor.rejectedkacs.impersonation.startedlcs.audit.transaction.committedlcs.source.response.rejectedlpsd.account.createdlpsd.account.deletedlpsd.account.modifiedlpsd.credential.changedlpsd.credential.verifiedlpsd.group.createdlpsd.group.deletedlpsd.group.member.addedlpsd.group.member.removedntfe.policy.rejectedntfe.verdict.reportedpeinit.boot.downgradedpeinit.critical-service.failedpeinit.fd-store.rejectedpeinit.graph.validation.failedpeinit.graph.validation.warnedpeinit.notify.rejectedpeinit.on-failure.suppressedpeinit.recovery.enteredpeipkg.claim.changedpeipkg.package.installedpeipkg.package.uninstalledpeipkg.package.upgradedpeipkg.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.attemptedauthd.service.attestedauthd.session.endedkacs.audit.access.checkedkacs.audit.descriptor.changedkacs.audit.handle.usedkacs.audit.privilege.usedkacs.caap.policy.changedkacs.impersonation.revertedkacs.impersonation.startedkacs.mount.policy.changedlcs.audit.backup.endedlcs.audit.key.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.openedlcs.audit.key.tombstonedlcs.audit.restore.endedlcs.audit.transaction.committedlcs.audit.value.deletedlcs.audit.value.setlpsd.account.createdlpsd.account.deletedlpsd.account.modifiedlpsd.credential.changedlpsd.credential.verifiedlpsd.group.createdlpsd.group.deletedlpsd.group.member.addedlpsd.group.member.removedpeinit.config.reload.appliedpeinit.graph.operation.endedpeinit.job.endedpeinit.operation.endedpeipkg.action.authorisedpeipkg.claim.changedpeipkg.package.installedpeipkg.package.uninstalledpeipkg.package.upgradedpeipkg.repository.addedpeipkg.repository.refreshedpeipkg.repository.removedpeipkg.transaction.recoveredstratafs.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.tombstonedlcs.audit.value.deletedlcs.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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.reportedpeinit.notify.exit-status.reportedpeinit.notify.progress.reportedpeinit.notify.rejectedpeinit.notify.status.reportedpeinit.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.reportedpeinit.notify.exit-status.reportedpeinit.notify.progress.reportedpeinit.notify.rejectedpeinit.notify.status.reportedpeinit.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.reportedpeinit.notify.exit-status.reportedpeinit.notify.progress.reportedpeinit.notify.rejectedpeinit.notify.status.reportedpeinit.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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)
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:
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.reportedpeinit.notify.exit-status.reportedpeinit.notify.progress.reportedpeinit.notify.rejectedpeinit.notify.status.reportedpeinit.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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)lcs.audit.backup.ended(viacaller)lcs.audit.backup.started(viacaller)lcs.audit.key.created(viacaller)lcs.audit.key.deleted(viacaller)lcs.audit.key.descriptor.changed(viacaller)lcs.audit.key.hidden(viacaller)lcs.audit.key.opened(viacaller)lcs.audit.key.tombstoned(viacaller)lcs.audit.restore.ended(viacaller)lcs.audit.restore.started(viacaller)lcs.audit.transaction.committed(viacaller)lcs.audit.value.deleted(viacaller)lcs.audit.value.set(viacaller)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)peinit.operation.endedpeinit.operation.mergedpeinit.operation.requestedpeinit.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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)lcs.audit.backup.ended(viacaller)lcs.audit.backup.started(viacaller)lcs.audit.key.created(viacaller)lcs.audit.key.deleted(viacaller)lcs.audit.key.descriptor.changed(viacaller)lcs.audit.key.hidden(viacaller)lcs.audit.key.opened(viacaller)lcs.audit.key.tombstoned(viacaller)lcs.audit.restore.ended(viacaller)lcs.audit.restore.started(viacaller)lcs.audit.transaction.committed(viacaller)lcs.audit.value.deleted(viacaller)lcs.audit.value.set(viacaller)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)lcs.audit.backup.ended(viacaller)lcs.audit.backup.started(viacaller)lcs.audit.key.created(viacaller)lcs.audit.key.deleted(viacaller)lcs.audit.key.descriptor.changed(viacaller)lcs.audit.key.hidden(viacaller)lcs.audit.key.opened(viacaller)lcs.audit.key.tombstoned(viacaller)lcs.audit.restore.ended(viacaller)lcs.audit.restore.started(viacaller)lcs.audit.transaction.committed(viacaller)lcs.audit.value.deleted(viacaller)lcs.audit.value.set(viacaller)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)lcs.audit.backup.ended(viacaller)lcs.audit.backup.started(viacaller)lcs.audit.key.created(viacaller)lcs.audit.key.deleted(viacaller)lcs.audit.key.descriptor.changed(viacaller)lcs.audit.key.hidden(viacaller)lcs.audit.key.opened(viacaller)lcs.audit.key.tombstoned(viacaller)lcs.audit.restore.ended(viacaller)lcs.audit.restore.started(viacaller)lcs.audit.transaction.committed(viacaller)lcs.audit.value.deleted(viacaller)lcs.audit.value.set(viacaller)
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:
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:
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.attemptedauthd.service.attestedauthd.session.endedkacs.audit.access.checked(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)lcs.audit.backup.ended(viacaller)lcs.audit.backup.started(viacaller)lcs.audit.key.created(viacaller)lcs.audit.key.deleted(viacaller)lcs.audit.key.descriptor.changed(viacaller)lcs.audit.key.hidden(viacaller)lcs.audit.key.opened(viacaller)lcs.audit.key.tombstoned(viacaller)lcs.audit.restore.ended(viacaller)lcs.audit.restore.started(viacaller)lcs.audit.transaction.committed(viacaller)lcs.audit.value.deleted(viacaller)lcs.audit.value.set(viacaller)lpsd.account.createdlpsd.account.deletedlpsd.account.modifiedlpsd.credential.changedlpsd.credential.verifiedlpsd.group.createdlpsd.group.deletedlpsd.group.member.addedlpsd.group.member.removednetd.hostname.changedpeinit.operation.endedpeinit.operation.mergedpeinit.operation.requestedpeinit.operation.startedpeipkg.action.authorisedpeipkg.claim.changedpeipkg.package.installedpeipkg.package.uninstalledpeipkg.package.upgradedpeipkg.repository.addedpeipkg.repository.reconfiguredpeipkg.repository.refreshedpeipkg.repository.removedpeipkg.transaction.recoveredtimed.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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)lcs.audit.backup.ended(viacaller)lcs.audit.backup.started(viacaller)lcs.audit.key.created(viacaller)lcs.audit.key.deleted(viacaller)lcs.audit.key.descriptor.changed(viacaller)lcs.audit.key.hidden(viacaller)lcs.audit.key.opened(viacaller)lcs.audit.key.tombstoned(viacaller)lcs.audit.restore.ended(viacaller)lcs.audit.restore.started(viacaller)lcs.audit.transaction.committed(viacaller)lcs.audit.value.deleted(viacaller)lcs.audit.value.set(viacaller)
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(viasubject)kacs.audit.descriptor.changed(viasubject)kacs.audit.handle.used(viasubject)kacs.audit.privilege.used(viasubject)kacs.caap.policy.changed(viasubject)kacs.caap.sacl.skipped(viasubject)kacs.caap.staging.diverged(viasubject)kacs.descriptor.rejected(viasubject)kacs.impersonation.reverted(viasubject)kacs.impersonation.started(viasubject)kacs.mount.policy.changed(viasubject)
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:
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.createdlcs.audit.key.deletedlcs.audit.key.descriptor.changedlcs.audit.key.hiddenlcs.audit.key.tombstonedlcs.audit.transaction.committedlcs.audit.value.deletedlcs.audit.value.setpeipkg.claim.changedpeipkg.package.installedpeipkg.package.uninstalledpeipkg.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:
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:
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:
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:
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.