Pick a real bug. Ship the fix with AI.
Every challenge is a genuine GitHub issue from a major Python project, graded by the hidden tests from the fix that actually merged. Read any of them free; start a round when you are ready.
- Challenges
- 212 challenges
- Repositories
- 11 repositories
- Graded rounds
- 13 graded rounds
sympy.Array([]) fails, while sympy.Matrix([]) works
inspectdb should generate related_name on same relation links.
+300 XPCompete →
Track your progress
Sign in to see what you have solved, keep a streak, earn badges and XP, and climb the leaderboard.
- —0 rounds—easy★delete() on instances of models without any dependencies doesn't clear PKsdjango/djangoormmodelseasynew
- 0%1 round16easySet default FILE_UPLOAD_PERMISSION to 0o644.django/djangowebormeasy0% solved
- —0 rounds—easyAllow FilePathField path to accept a callable.django/djangowebormeasynew
- —0 rounds—easyIncorrect removal of order_by clause created as multiline RawSQLdjango/djangowebormeasynew
- 0%1 round35hardMerging 3 or more media objects can throw unnecessary MediaOrderConflictWarningsdjango/djangowebormhard0% solved
- —0 rounds—easysqlmigrate wraps it's outpout in BEGIN/COMMIT even if the database doesn't support transactional DDLdjango/djangowebormeasynew
- —0 rounds—easyCorrect expected format in invalid DurationField error messagedjango/djangowebormeasynew
- —0 rounds—easyHttpResponse doesn't handle memoryview objectsdjango/djangowebormeasynew
- —0 rounds—hardMigration auth.0011_update_proxy_permissions fails for models recreated as a proxy.django/djangowebormhardnew
- —0 rounds—mediumAutoreloader with StatReloader doesn't track changes in manage.py.django/djangowebormmediumnew
- —0 rounds—hardAdd support for SCRIPT_NAME in STATIC_URL and MEDIA_URLdjango/djangowebormhardnew
- —0 rounds—easyWhen DEBUG is True, raising Http404 in a path converter's to_python method does not result in a technical responsedjango/djangowebormeasynew
- —0 rounds—hardDjango throws error when different apps with different models have the same name table name.django/djangowebormhardnew
- 33%3 rounds54hardAdd check to ensure max_length fits longest choice.django/djangowebormhard33% solved
- —0 rounds—easyFiltering on query result overrides GROUP BY of internal querydjango/djangowebormeasynew
- —0 rounds—mediumMigrations uses value of enum object instead of its name.django/djangowebormmediumnew
- —0 rounds—mediumdjango.utils.http.parse_http_date two digit year check is incorrectdjango/djangowebormmediumnew
- —0 rounds—hardPrevent using __isnull lookup with non-boolean value.django/djangowebormhardnew
- —0 rounds—easyForeignKey's to_field parameter gets the old field's name when renaming a PrimaryKey.django/djangowebormeasynew
- —0 rounds—mediumThe value of a TextChoices/IntegerChoices field has a differing typedjango/djangowebormmediumnew
- —0 rounds—mediumCannot override get_FOO_display() in Django 2.2+.django/djangowebormmediumnew
- —0 rounds—easyadmin_views.test_multidb fails with persistent test SQLite database.django/djangowebormeasynew
- —0 rounds—easymakemigrations produces incorrect path for inner classesdjango/djangowebormeasynew
- 100%1 round89easyOptional URL params crash some view functions.django/djangowebormeasy100% solved
- —0 rounds—easyModel.get_FOO_display() does not work correctly with inherited choices.django/djangowebormeasynew
- —0 rounds—mediumtranslation.E004 shouldn't be raised on sublanguages when a base language is available.django/djangowebormmediumnew
- —0 rounds—mediumJSONField are not properly displayed in admin when they are readonly.django/djangowebormmediumnew
- —0 rounds—medium`TransactionTestCase.serialized_rollback` fails to restore objects due to ordering constraintsdjango/djangowebormmediumnew
- —0 rounds—easyInherited model doesn't correctly order by "-pk" when specified on Parent.Meta.orderingdjango/djangowebormeasynew
- —0 rounds—easyWrong hint about recursive relationship.django/djangowebormeasynew
- —0 rounds—hardDjango 3.0: "GROUP BY" clauses error with tricky field annotationdjango/djangowebormhardnew
- —0 rounds—easySettings are cleaned insufficiently.django/djangowebormeasynew
- —0 rounds—mediumMigration crashes deleting an index_together if there is a unique_together on the same fieldsdjango/djangowebormmediumnew
- —0 rounds—mediumQuerySet.Delete - inconsistent result when zero objects deleteddjango/djangowebormmediumnew
- —0 rounds—mediumAdd check for fields of UniqueConstraints.django/djangowebormmediumnew
- —0 rounds—easyUnion queryset should raise on distinct().django/djangowebormeasynew
- —0 rounds—mediumAdd get_response_async for ASGIStaticFilesHandlerdjango/djangowebormmediumnew
- —0 rounds—mediumMake django.utils.text.slugify() strip dashes and underscoresdjango/djangowebormmediumnew
- —0 rounds—mediumQueryset raises NotSupportedError when RHS has filterable=False attribute.django/djangowebormmediumnew
- —0 rounds—mediumSelf referencing foreign key doesn't correctly order by a relation "_id" field.django/djangowebormmediumnew
- —0 rounds—easyQuerySet.none() on combined queries returns all results.django/djangowebormeasynew
- —0 rounds—hardAllow ValidationErrors to equal each other when created identicallydjango/djangowebormhardnew
- —0 rounds—easyAdd support for item_comments to syndication frameworkdjango/djangowebormeasynew
- —0 rounds—hardAlterOrderWithRespectTo() with ForeignKey crash when _order is included in Index().django/djangowebormhardnew
- —0 rounds—mediumlimit_choices_to on a ForeignKey can render duplicate options in formfielddjango/djangowebormmediumnew
- —0 rounds—hardDecoding an invalid session data crashes.django/djangowebormhardnew
- —0 rounds—hardAbstract model field should not be equal across modelsdjango/djangowebormhardnew
- —0 rounds—mediumTest runner setup_databases crashes with "TEST": {"MIGRATE": False}.django/djangowebormmediumnew
- —0 rounds—mediumChanging user's email could invalidate password reset tokensdjango/djangowebormmediumnew
- —0 rounds—easyUpgrading 2.2>3.0 causes named tuples used as arguments to __range to error.django/djangowebormeasynew
From Start to score in four steps
- 1
Press Start
A fresh container boots with the real repository checked out at the commit the bug was reported against, dependencies installed and tests runnable. VS Code opens in a new tab, usually within a minute.
- 2
Fix it with the agent
An AI coding agent sits in the editor. You have 60 minutes and up to 1M tokens for the round (less if your balance pays for less); usage is charged to your credit as you go, and the agent stops when the budget runs out.
- 3
Everything is recorded
Every prompt, every tool call the agent makes, tokens spent, files edited, each test run, pastes and time away from the tab. Nothing outside the workspace is watched.
- 4
Submit and get scored
Hidden tests from the real fix decide whether it is solved. The report scores you 0 to 100 from six sub-scores, and the round earns XP toward your level and the leaderboard.
How the score is made
Your overall score is a weighted blend of six sub-scores. Solving the issue matters most, but how you drove the agent, checked your work and spent your tokens is what separates a good engineer with AI from a lucky one. Non-empty practice submissions can earn XP. Your best result on each task counts, with harder tasks and passing tests worth more.
See a sample report →- Outcome35%
Do the hidden tests pass, and does nothing that worked before break?
- Prompt quality15%
Specific, contextual instructions beat “fix it”.
- Token economy15%
Solving it without burning the budget.
- Verification15%
Running the tests yourself before you submit.
- Speed10%
Time to a working fix (only counts when it works).
- Recovery10%
Getting out of error loops instead of repeating them.