Appearance
Bug Tracking - 2026-05-21
Related PRs:
- Frontend: https://github.com/Cavai/Application-Frontend/pull/1859
- Engine: https://github.com/Cavai/Creative-Engine/pull/736
Bug 1: Fractional Order Validation Failure
Status: Fix applied, awaiting test Branch: main (merged from improve-change-operators today) Symptom: "Validation error: creative validation failed on creativeSettings.creativeBlocks.*.order" when creating new formats
Root Cause (confirmed)
PR #1859 introduced fractional-indexing which stores block order as strings ("a0", "a1"). Backend validation requires order: schema.number(). A serializeOrdersForSave() utility was created to convert back to integers before API calls, but it was only wired up in updateChatbot() -- missing from all other save paths.
Fix Applied
Added serializeOrdersForSave() to all missing save paths:
| File | Method | What it does |
|---|---|---|
ChatbotBuilder.vue:1650 | createChatbot() | First-time save of new creative |
createCreative.ts:36 | createNewCreative() | Standalone creative creation |
createCreative.ts:89 | createMassFormatCreative() | Mass format creation (the reported bug) |
wizardSavingLogic.ts:81 | createAddedCreatives() | Adding formats to existing creative |
wizardSavingLogic.ts:255 | completeEditWizard() | Child creative edit save |
wizardSavingLogic.ts:343,357 | completeStandaloneEditWizard() | Standalone-to-multi format conversion |
Already had the fix:
ChatbotBuilder.vue:1733-updateChatbot()(normal save)LocalBuildPreview.vue:161- preview payloadCreativeJSONViewerV2.vue:165,174- DevTools JSON viewer
Key Files
| File | Role |
|---|---|
src/utils/orderUtils.ts | serializeOrdersForSave(), migrateNumericOrders() |
src/store/modules/blocks.ts | Calls migrateNumericOrders in setCreativeBlocks |
AB/start/validators/creative_validation.ts | Backend: order: schema.number() |
Verification
- [x] Confirmed backend requires
order: schema.number()(number, not string) - [x] Confirmed
serializeOrdersForSave()was missing from create/format paths - [x] Applied fix to all 6 missing call sites
- [x] Type check passes (no new errors)
- [ ] User testing: create new format after reordering blocks
- [ ] User testing: create new creative from scratch
- [ ] User testing: add format to existing creative via wizard
Bug 2: JavaScript Error in Creative Tags (emitAnimationTriggers)
Status: Likely already fixed in CE PR #736 Branch: main (production) Reported by: Client via AdValidation tool Campaign ID: 481244
Symptom
JavaScript validation error detected by AdValidation tool:
TypeError: e is not iterable
at Object.emitAnimationTriggers (about:srcdoc:49:55554)
at Object.addComponentsToFlow (about:srcdoc:49:54620)
at Object.handleComponentsEvent (about:srcdoc:49:55012)- Creatives work fine in manual preview/testing
- Error caught by automated AdValidation tool
- Affects: Board, Board XL, Brandboard, Netboard for campaign r481244
Root Cause (found)
File: Creative-Engine/src/logic-system/processors/conversationFlow.tsFunction: emitAnimationTriggers (line ~251)
ts
const { triggerType, targets } = comp.animationTriggers
if (!targets?.length) continue
for (const target of targets) { // <-- crashes if targets is not iterableThe guard !targets?.length doesn't protect against non-array values that have a .length property (like strings). If animationTriggers.targets is not an array, for...of throws "not iterable".
Fix Status
CE PR #736 description states: "Fixed BLOCKS.GROUP constant and guarded emitAnimationTriggers against non-array input"
This fix is already in the merged CE PR. The campaign's creatives were likely built before the fix was deployed. Rebuilding the creatives should resolve this.
Recommendation
- Verify the CE fix is deployed to production composer
- Rebuild the affected creatives for campaign 481244
- Re-run AdValidation to confirm the error is gone
AdValidation Report
https://app2.advalidation.com/campaigns/202927-r481244?t=awhqfucc