New profile boots_ppack for QCing multi-page Boots production packs (PowerPoint-exported PDFs, 4-18 pages each). Built on top of AXA's document-mode infrastructure — branched off feature/axa-document-mode because it reuses the dispatcher, ingest, and result writer. New checks: - boots_logo_compliance — three-path scoring (master wordmark / partner lock-up / no branding) so OLIVER x BOOTS-style footer lock-ups aren't scored against master wordmark rules. Conservative without a formal Boots logo guideline. - boots_colour_palette — verifies CMYK/RGB/Hex spec values on creative- guidance pages against canonical Boots Blue / Health Primary Blue / Offer Red, plus visual sanity-check on artwork pages. Existing checks tuned: - boots_brand_name_accuracy: closed-world list semantics. Brands not on the approved list now go to names_not_on_list (manual review) instead of failing — the list is sourced from the original 7 docs and is known incomplete (Remington, Imodium, Maybelline etc. are legitimate Boots- stocked brands not on it). - boots_tandc_wording: explicit font-weight caveat — Boots Sharp Regular vs Light isn't reliably distinguishable by vision LLM at small sizes. Surfaced via font_weight_caveat field + needs_manual_check value. Page classifier (document_mode/page_classifier.py): Heuristic tags each page as cover / checklist / palette / notes / artwork. Validated on all 10 sample packs. Strict-grade exemption (Profile.strict_grade flag): Only artwork-classified pages count towards Pass/Fail. Cover, checklist, palette, and notes pages are still QC'd and reported as Informational but cannot trigger a Fail. Banner shows exactly which artwork-page checks fell below 6. Result writer extended: - Per-page table with score + page_type pill for any page_each-scope check (auto-applied as fallback) - Strict-grade banner (red on violation, green when clean) - Page_type pills throughout the per-page strip Smoke-test result (Remington 4-page pack, 2026-05-05): Overall 70.75/100, strict-grade Fail. After two iterations of prompt tuning, all three remaining strict-grade violations are real catches: orphan asterisk in T&Cs, "they may not be stocked" wording deviation, missing "Charges may apply". brand_name_accuracy 7.0 (was 3.0 before list fix), logo_compliance 9.5 (was 1.5 before lock-up path fix). Local-only — not pushed to dev or merged to develop until after Boots show-and-tell. Same posture as feature/axa-document-mode. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| amazon_static.json | ||
| axa_policy_document.json | ||
| axa_policy_document_diff.json | ||
| boots_ppack.json | ||
| boots_static.json | ||
| diageo_key_visual.json | ||
| diageo_packaging.json | ||
| dow_jones_static.json | ||
| general_check.json | ||
| inclusive_accessibility.json | ||
| loreal_static.json | ||
| marketwatch_static.json | ||
| README.md | ||
| static_general.json | ||
| unilever_key_visual.json | ||
| unilever_packaging.json | ||
| video_general.json | ||
| wsj_podcast.json | ||
| wsj_static.json | ||
Visual AI QC Profiles
This directory contains JSON profile configurations for the Visual AI QC application. Profiles determine which QC checks are run, their weights, and which LLM (OpenAI or Gemini) is used for each check.
Profile Structure
Each profile is defined in its own JSON file with the following structure:
{
"name": "Profile Name",
"description": "Description of the profile and its purpose",
"checks": {
"check_name_1": {
"weight": 0.10,
"llm": "OpenAI",
"enabled": true
},
"check_name_2": {
"weight": 0.15,
"llm": "Gemini",
"enabled": true
}
// Add more checks as needed
}
}
Fields Explanation
name: The display name of the profile (shown in the UI)description: A short description explaining the profile's purposechecks: A dictionary of QC checks to include in this profile- Each check entry contains:
weight: The weight of this check in the overall score (between 0 and 1, sum of all weights should equal 1)llm: The LLM to use for this check ("OpenAI" or "Gemini")enabled: Whether this check is enabled (true/false)
- Each check entry contains:
Adding New Profiles
To add a new profile:
- Create a new JSON file in this directory (e.g.,
my_brand.json) - Define the profile structure following the format above
- Include only the checks relevant to your profile
- Ensure the sum of weights equals 1.0 (100%)
- Restart the application to load the new profile
The profile ID will be the filename without the .json extension. For example, my_brand.json will create a profile with ID my_brand.
Available QC Checks
Here are the available QC checks you can include in your profiles:
Visual Design Checks
logo_visibility: Checks if the logo is clearly visiblebrand_assets_visibility: Checks if brand assets are prominentvisual_elements_count: Counts and evaluates visual elementsbackground_contrast: Evaluates contrast between foreground and backgroundface_visibility: Checks if faces are clearly visiblevisual_hierarchy: Analyzes the visual hierarchysupporting_images: Evaluates supporting imagerycurved_edges: Checks for curved edges in designproduct_visibility: Checks if product is clearly visible
Text & Copy Checks
lowercase_text: Checks text casingcall_to_action: Evaluates call to action textword_count: Checks word countimperative_verb: Checks for imperative verbstext_readability: Evaluates text readability
Layout & Composition Checks
new_visibility: Checks if "NEW" tag is prominently displayedvisuals_left_text_right: Checks layout for visuals on left, text on rightface_gaze_direction: Checks direction of faces gazingelement_alignment: Checks alignment of elementsaspect_ratio: Verifies correct aspect ratioresponsiveness: Tests responsiveness for different screens
Technical Checks
file_naming: Checks file naming conventionslayer_organization: Validates layer organizationcolor_format: Checks color format complianceimage_resolution: Verifies image resolutionsafety_area: Checks safety areas/marginsprint_bleed: Verifies print bleed areascrop_marks: Checks crop marksanimation_transitions: Evaluates animation transitionsdark_mode_legibility: Tests legibility in dark mode
Example Profile
Here's an example profile for a brand that focuses on product visibility and call to action:
{
"name": "Product Marketing",
"description": "Profile optimized for product marketing materials",
"checks": {
"product_visibility": {
"weight": 0.30,
"llm": "OpenAI",
"enabled": true
},
"call_to_action": {
"weight": 0.20,
"llm": "OpenAI",
"enabled": true
},
"brand_assets_visibility": {
"weight": 0.15,
"llm": "OpenAI",
"enabled": true
},
"background_contrast": {
"weight": 0.10,
"llm": "Gemini",
"enabled": true
},
"visual_hierarchy": {
"weight": 0.15,
"llm": "OpenAI",
"enabled": true
},
"image_resolution": {
"weight": 0.10,
"llm": "Gemini",
"enabled": true
}
}
}
Default Profiles
The system includes these default profiles:
default.json- All checks enabled with equal weightingdiageo.json- Diageo brand guidelinesunilever.json- Unilever brand guidelinesgeneral.json- General technical checks