Skip to main content

Module answer

Module answer 

Source
Expand description

income answer (D-8) — the ONLY in-app path to the fail-loud tri-states and the dates of birth.

Why it must exist. The D-8 migration’s recovery story was “just re-import one TOML line” — which assumes the user still HAS the TOML. The spec tells them to delete it (plaintext hygiene), income show emits masked JSON and so cannot regenerate it, and set-pii prompts for secrets only. Without answer, a TOML-less user faces a permanently-refusing year and no way to answer a single boolean: a wall, landing hardest on the people who did exactly what the spec told them to.

What it deliberately does NOT own: secrets. SSNs and the IP PIN belong to set-pii, which is no-echo. answer is an ordinary echoing prompt — routing a secret through it would print a crown jewel into terminal scrollback.

Enums§

Ask
One thing income answer asks: a MANDATORY declaration (from the FORM_QUESTIONS registry — a bare Enter with nothing on file is refused, never accepted as an answer) or a SKIPPABLE prompt (from the core SKIPPABLE_QUESTIONS registry — a bare Enter leaves None, forgoing the benefit lawfully).

Functions§

answer_return_inputs
income answer --year N — ask every live question, then store.
live_questions
★ EXACTLY the questions this return needs — the MANDATORY declarations DERIVED from the registry (so the prompt scope IS the refusal scope, by identity: the no-brick property is now true by construction, not by a second hand-written list that can drift, r1 M-1), then the skippable DOBs.
parse_date
Parse one date reply. Ok(None) = the user SKIPPED (a bare Enter) — a legitimate outcome for a DOB.
parse_yes_no
Parse one yes/no reply. "" (a bare Enter) means “keep default”, and is only an ANSWER when there already is one — otherwise the caller must re-ask, because silence is exactly what D-8 forbids.