SkinViolation class

One live contract breach: the row that failed, why it exists, and (for route breaches) the route that was pushed.

Constructors

SkinViolation.route({required String rowId, required String requirement, required String message, required String? route})
A route-contract breach (the observer's didPush verdict).
const
SkinViolation.widget({required String rowId, required String requirement, required String message})
A widget-contract breach.
const

Properties

hashCode int
The hash code for this object.
no setteroverride
kind SkinViolationKind
Which half of the contract was breached.
final
message String
Machine detail (what was observed vs expected).
final
requirement String
The human requirement the row encodes — what the banner shows after the id.
final
route String?
The pushed route name, for route breaches; null for widget breaches.
final
rowId String
The contract row's id (google-text, route:debug-thing).
final
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toDisplayLine() String
The banner line: [<rowId>] <requirement> (the pilot shape).
toJson() Map<String, Object?>
Machine-readable shape (JSON envelope / receipts).
toString() String
A string representation of this object.
override

Operators

operator ==(Object other) bool
Identity is the contract breach, not the clock: two violations for the same row+requirement+message+route are the SAME live finding regardless of when each was observed — the bus relies on this for change detection (no banner churn while the same chaos edit stays on screen).
override