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