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
didPushverdict).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