I Made My Onboarding Data-Driven. A Hardcoded List Ate Four of Six Answers. Lifemaxxing AI, a habit app built by a developer and a partner, discovered that four of six options on its onboarding question seven were silently discarded due to a mapping bug. The developer traced the issue to a hardcoded list that failed to map semantic answer keys to the config's positional question IDs, causing answers to be replaced with defaults. The team is now refactoring the mapping to be data-driven to prevent such silent failures. Lifemaxxing AI is a habit app I build with a partner. You answer eight questions when you install it, and it hands you back a plan: a set of daily tasks that feed attribute ratings like Discipline, Wisdom and Confidence. It is Flutter, and the onboarding is the most important surface in the whole app, because those answers are not analytics. They are the input to the thing that generates your plan. Early on I did what everyone tells you to do. I pulled the questions out of Dart and put them into a JSON file that ships as an asset, so I could reword a question, add an option, or change which tasks an answer produces without touching a widget or shipping a build. That part worked. What I found this week is that four of the six options on question seven have been silently thrown away before they ever reach the plan generator. Not crashed. Not logged. Quietly replaced with a default. Here is how a good idea turned into an invisible bug, and what I am doing about it. assets/onboarding config.json holds two things: the questions, and the rules that turn answers into tasks. { "id": "q7", "question": "Whose lifestyle do you admire most?", "type": "selection", "options": {"id": "socrates", "text": "Socrates"}, {"id": "elon musk", "text": "Elon Musk"}, {"id": "napoleon", "text": "Napoleon"}, {"id": "ronaldo", "text": "Ronaldo"}, {"id": "david goggins", "text": "David Goggins"}, {"id": "not sure", "text": "Not sure"} } And then the assignment rules, which are just a nested map of question id to answer id to task ids: "taskAssignmentLogic": { "mandatoryTasks": "pushUps", "lessSocialMedia", "running", "coldShowers", "kindness" , "conditionalTasks": { "q7": { "socrates": "morningMeditation", "journaling", "reading" , "elon musk": "deepWork", "wakeUpEarly", "planDay" , "napoleon": "planDay", "workout", "wakeUpEarly" , "ronaldo": "workout", "wakeUpEarly", "earlyBedtime" , "david goggins": "wakeUpEarly", "workout", "journaling" , "not sure": "wakeUpEarly", "planDay", "journaling" } } } The whole assignment algorithm is a set union: static List