Repository navigation
Conversation
What was broken
Switching a launched challenge between AI_ONLY and AI_GATING left Timeline &
Schedule unchanged. A challenge moved to AI_GATING kept the AI Review and
Approval phases of the AI Only timeline. A challenge moved to AI_ONLY kept
AI Screening, Review and Appeals.
Root cause
updateChallenge only synced the timeline template with the AI review mode on
NEW/DRAFT saves and on activation. Its template-change path also rebuilt all
phases from scratch, which would restart phases an active challenge had
already run.
What was changed
- updateChallenge also fetches the AI review config when saving an ACTIVE
challenge that has AI reviewers or uses the AI Only template. AI_ONLY moves
the challenge to the AI Only template. Any other mode moves it off the AI
Only template back to the default type/track template.
- An ACTIVE challenge only switches while none of the phases the new
template drops have started (new phaseHelper.hasStartedPhasesOutsideTemplate),
i.e. until its review phase starts. Otherwise the template is kept. For an
ACTIVE challenge, only this validated switch bypasses the non-admin
"Cannot change the timelineTemplateId" check.
- New challengeHelper.populatePhasesForActiveTimelineTemplateSwitch rebuilds
the phases:
- Phases shared with the new template (Registration, Submission) keep
their record id, open state and actual dates.
- The other phases come from the new template.
- When leaving AI_ONLY, AI reviewers get AI Screening back.
- Phases that have not started are rescheduled with
populatePhasesForChallengeUpdate.
Added/updated tests
- phase-helper.test.js: hasStartedPhasesOutsideTemplate.
- challenge-helper.test.js: AI_ONLY -> AI_GATING and AI_GATING -> AI_ONLY
rebuilds using dev's template layouts. They check that open phases are
kept, AI Screening is inserted and later phases are rescheduled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
JIRA: PM-5573
Part of a three-repo fix:
What was broken
Switching a launched challenge between AI_ONLY and AI_GATING left Timeline & Schedule unchanged:
Root cause
updateChallengeonly synced the timeline template with the AI review mode on NEW/DRAFT saves and on activation. Its template-change path also rebuilt every phase from scratch. That would restart phases an active challenge had already run.What was changed
updateChallengenow also fetches the AI review config when saving an ACTIVE challenge that has AI reviewers or uses the AI Only template.phaseHelper.hasStartedPhasesOutsideTemplate). In practice that means until its review phase starts. Otherwise the current template is kept. For ACTIVE challenges, only this validated switch bypasses the non-admin "Cannot change the timelineTemplateId" check.challengeHelper.populatePhasesForActiveTimelineTemplateSwitchrebuilds the phases:syncChallengePhases.addAIScreeningPhaseForChallenge.populatePhasesForChallengeUpdate.Resulting timelines with dev's templates:
Any added/updated tests
test/unit/phase-helper.test.js:hasStartedPhasesOutsideTemplate.test/unit/challenge-helper.test.js: AI_ONLY → AI_GATING and AI_GATING → AI_ONLY rebuilds, using dev's template layouts (including the AI Only template's row order). They check that open phases are kept, AI Screening is inserted and later phases are rescheduled.Validation
developproduces in this environment (77 passing there). The 3 new tests pass.eslinton the changed TS files is clean (the lint script only covers.ts), andnest buildsucceeds.Notes
updateChallengepath that calls the database is not covered by a unit test, because those suites need a live Postgres.🤖 Generated with Claude Code