"We suspended your account, ‹username›": the UFAC flow's suspended-account
intro. The screen keeps the step's serverParams (derived from the controller
payload once), the UFAC state accumulated so far, and the notice the person
reads, projected from the page's parsed render tree: title (the notice's
first line, "We suspended your account, ‹username›"), body (when it was
suspended, how many days are left to disagree, what the suspension means,
what the person can do and why the decision was made, in page order) and the
disagreeWithDecisionLabel of its one button. A page the reader cannot read
is ScreenDataError, never a blank notice.
Reached only as an interruption of a request (OpenChallenge(error)): the
challenge's classification fetched the UFAC controller before this screen
opened, so its enter sends nothing. It has no back and is no step of a
trail.
Its one action, disagreeWithDecision(), is the intro's single button: it
sends the step's complete_intro action with the intro's own params,
unchanged, and continues into the step the answer is — the reCAPTCHA, the
text captcha, another UFAC screen, or the challenge's end; a payload the
library does not model is ChallengeStepNotModelledError. The action runs
only while this screen is on top; the interrupted action is never retried.
Ships without a screenshot: the old class had none.
Unverified by recording. No recording of the Android 451 app on this step
exists: the answer is the challenge module's own UFAC sample. A recording of
the Android app on the suspended-account intro would settle the page and the
disagreement.
"We suspended your account, ‹username›": the UFAC flow's suspended-account intro. The screen keeps the step's
serverParams(derived from the controller payload once), the UFAC state accumulated so far, and the notice the person reads, projected from the page's parsed render tree:title(the notice's first line, "We suspended your account, ‹username›"),body(when it was suspended, how many days are left to disagree, what the suspension means, what the person can do and why the decision was made, in page order) and thedisagreeWithDecisionLabelof its one button. A page the reader cannot read isScreenDataError, never a blank notice.Reached only as an interruption of a request (
OpenChallenge(error)): the challenge's classification fetched the UFAC controller before this screen opened, so itsentersends nothing. It has nobackand is no step of a trail.Its one action,
disagreeWithDecision(), is the intro's single button: it sends the step'scomplete_introaction with the intro's own params, unchanged, and continues into the step the answer is — the reCAPTCHA, the text captcha, another UFAC screen, or the challenge's end; a payload the library does not model isChallengeStepNotModelledError. The action runs only while this screen is on top; the interrupted action is never retried.Ships without a screenshot: the old class had none.
Unverified by recording. No recording of the Android 451 app on this step exists: the answer is the challenge module's own UFAC sample. A recording of the Android app on the suspended-account intro would settle the page and the disagreement.