Fortune cookie
animated GIF + locale-random fortune line from sorte.txt (locales.lines) plus six lucky numbers, one per tens-decade; fun-gated with v1's fun_off reply. v1's time.sleep(3) between sending the animation and deleting it blocked the whole process, so the delete-then-answer tail now runs as a background asyncio.Task (complaint.py's _schedule_tail idiom) instead, keeping v1's exact user-visible order without holding the reply path open. QA authored, not ported
/sorte/fortunecookie/suerte- v1 scenarios
- —
- Ported
- 3
- Green
- 5
- Failing
- —
animated GIF + locale-random fortune line from sorte.txt (locales.lines) plus six lucky numbers, one per tens-decade; fun-gated with v1's fun_off reply. v1's time.sleep(3) between sending the animation and deleting it blocked the whole process, so the delete-then-answer tail now runs as a background asyncio.Task (complaint.py's _schedule_tail idiom) instead, keeping v1's exact user-visible order without holding the reply path open. QA authored, not ported
Miscellaneous.py:359-375What it does
Behaviour that must not change
How to verify it
Drawing idea prompt
3,435 exported references; the caption's id is the index drawn, so the catalog's sort order is the contract. Scenarios authored locally - QA has none
Gender guess (genderize.io)
GET genderize.io?name=, same timeout+Breaker/argument/failure handling as x_age_guess. A null gender with a non-zero count (should be unreachable behind count == 0, but v1's f"gender.{genero}" would build the dead key 'gender.None' if it were) renders the dormant 'gender.unknown' entry that v1's own lib.json already ships (en only, never read by any v1 code path) instead of crashing or going silent. QA authored, not ported