Skip to content

Commit d75c60b

Browse files
committed
Make onboarding background optional and fix AI nickname typo
1 parent b59dd4d commit d75c60b

4 files changed

Lines changed: 55 additions & 7 deletions

File tree

backend/lambda_handler.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5150,7 +5150,6 @@ def handle_update_memory(event):
51505150
merged = {**existing_memory, **payload}
51515151
first_name = _normalize_text(merged.get("first_name"), 120)
51525152
last_name = _normalize_text(merged.get("last_name"), 120)
5153-
background_level = _normalize_text(merged.get("background_level"), 2000)
51545153
user_role = _normalize_text(merged.get("user_role"), 120).lower()
51555154
discovery_source = _normalize_text(merged.get("discovery_source"), 120).lower()
51565155
discovery_source_other = _normalize_text(merged.get("discovery_source_other"), 200)
@@ -5160,8 +5159,6 @@ def handle_update_memory(event):
51605159
return create_response(400, {"success": False, "error": "Missing required field: first_name"})
51615160
if not last_name:
51625161
return create_response(400, {"success": False, "error": "Missing required field: last_name"})
5163-
if not background_level:
5164-
return create_response(400, {"success": False, "error": "Missing required field: background_level"})
51655162
if not user_role:
51665163
return create_response(400, {"success": False, "error": "Missing required field: user_role"})
51675164
if user_role not in _ONBOARDING_ROLE_VALUES:

backend/tests/test_lambda_handler.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,56 @@ def test_put_memory_rejects_missing_required_field_when_complete_onboarding(monk
179179
mock_persist.assert_not_called()
180180

181181

182+
def test_put_memory_allows_missing_background_when_complete_onboarding(monkeypatch):
183+
monkeypatch.setenv("AUTH_REQUIRED", "true")
184+
event = {
185+
"httpMethod": "PUT",
186+
"path": "/memory",
187+
"headers": {"Authorization": "Bearer test-token"},
188+
"body": json.dumps(
189+
{
190+
"first_name": "Jane",
191+
"last_name": "Doe",
192+
"nickname": "J",
193+
"onboarding_goals": ["curiosity"],
194+
"discovery_source": "search",
195+
"user_role": "engineer",
196+
"complete_onboarding": True,
197+
}
198+
),
199+
}
200+
201+
with patch("lambda_handler._verify_firebase_token") as mock_verify, patch(
202+
"lambda_handler._persist_user_profile"
203+
) as mock_persist, patch("lambda_handler._load_saved_user_profile") as mock_load:
204+
mock_verify.return_value = {"uid": "user-1", "email": "jane@example.com"}
205+
mock_load.side_effect = [
206+
{},
207+
{
208+
"first_name": "Jane",
209+
"last_name": "Doe",
210+
"nickname": "J",
211+
"preferred_name": "J",
212+
"onboarding_goals": ["curiosity"],
213+
"discovery_source": "search",
214+
"user_role": "engineer",
215+
"onboarding_version": "v1",
216+
"onboarding_completed_at": "2026-03-05T12:00:00",
217+
},
218+
]
219+
response = handler(event, None)
220+
221+
assert response["statusCode"] == 200
222+
body = json.loads(response["body"])
223+
assert body["success"] is True
224+
assert body["memory"]["onboarding_version"] == "v1"
225+
assert "onboarding_completed_at" in body["memory"]
226+
227+
mock_persist.assert_called_once()
228+
persisted_payload = mock_persist.call_args.args[1]
229+
assert "background_level" not in persisted_payload
230+
231+
182232
def test_put_memory_rejects_invalid_discovery_source(monkeypatch):
183233
monkeypatch.setenv("AUTH_REQUIRED", "true")
184234
event = {

frontend/src/components/app/OnboardingModal.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ export default function OnboardingModal({
160160
const finish = useCallback(async () => {
161161
if (!onSubmit || submitting) return
162162
clearError()
163+
const trimmedBackground = background.trim()
163164
await onSubmit({
164165
first_name: firstName.trim(),
165166
last_name: lastName.trim(),
@@ -169,7 +170,7 @@ export default function OnboardingModal({
169170
discovery_source: source,
170171
discovery_source_other: source === "others" ? sourceOther.trim() : "",
171172
user_role: role,
172-
background_level: background.trim(),
173+
...(trimmedBackground ? { background_level: trimmedBackground } : {}),
173174
complete_onboarding: true,
174175
})
175176
}, [onSubmit, submitting, firstName, lastName, nickname, goals, source, sourceOther, role, background, clearError])
@@ -277,7 +278,7 @@ export default function OnboardingModal({
277278
Make it yours
278279
</h2>
279280
<p style={{ margin: 0, fontFamily: FONTS.sans, fontSize: "15px", color: COLORS.textSecondary, lineHeight: 1.6 }}>
280-
This helps us tailor explanations to your world.
281+
This helps us tailor explanations to your world. The model will keep learning from your chats over time.
281282
</p>
282283
</div>
283284

@@ -340,7 +341,7 @@ export default function OnboardingModal({
340341
<textarea
341342
value={background}
342343
onChange={(e) => { setBackground(e.target.value); clearError() }}
343-
placeholder="Briefly share your experience level — this becomes your learning baseline."
344+
placeholder="Optional: share your experience level. The model will also learn from your chats."
344345
style={{
345346
...inputStyle(COLORS, isDark),
346347
minHeight: "80px",

frontend/src/components/app/views/ProfileView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ export function ProfileView() {
211211
<input
212212
value={nickname}
213213
onChange={(e) => { setNickname(e.target.value); setSavedMessage(null) }}
214-
placeholder="What should AAI call you?"
214+
placeholder="What should AI call you?"
215215
style={fieldStyle}
216216
/>
217217
</div>

0 commit comments

Comments
 (0)