Skip to content

feat(visual-targets): canonical 31-PNG manifest with regions + viewports + themes (W15 A8) - #206

Merged
Ghenghis merged 1 commit into
developfrom
claude/w15-a8-visual-target-registry
May 10, 2026
Merged

Ghenghis merged 1 commit into
developfrom
claude/w15-a8-visual-target-registry

Conversation

@Ghenghis

@Ghenghis Ghenghis commented May 10, 2026 •

Copy link
Copy Markdown
Owner

Summary

W15 Agent 8 — Visual Target Registry Builder. Creates the canonical visual-targets registry covering all 31 Images-GUI PNGs with full per-target schema. No UI/source code edits — manifest + schema + W15-A2 inventory handoff only.

  • 03_implementation/ui/tests/visual/visual-targets.canonical.json — 37 parent targets (20 single + 11 collage parents + 6 theme variants) plus 103 region children, 140 total tracked targets
  • 03_implementation/ui/tests/visual/visual-targets.canonical.schema.json — JSON Schema 2020-12 (single / collage / region / theme_variant / user_direction classes; conditional region+parent requirements)
  • 03_implementation/docs/handoffs/W15_A2_IMAGES_GUI_INVENTORY_2026-05-10.md — inventory handoff reconstructed from filesystem scan (the A2-authored variant was not present on origin/develop at A8 dispatch time)

Per-target schema (15 required fields)

target_id, image_path, dimensions, route, viewport, theme, ui_state, crop_region, backend_truth_source, playwright_proof_screenshot, pass_fail_status, owning_pr, final_verdict, class, live_or_future.

Collage parents additionally carry a regions[] array of clip-coordinate children. Theme-variant siblings carry parent_target_id.

Viewport outliers handled

Dim Files Per-target viewport override
1672 × 941 5 (Generated 1 + 2, simple-dashboard-a + b, 60-app coverage matrix) yes
1586 × 992 1 (source-os-remaining-categories) yes

Theme palettes (6)

default, cyberpunk, matrix, tron, industrial_forge, aurora_operator — collage parent at 09_theme_variants_reference expands into 6 region children and 6 theme-variant sibling targets at /#dashboard?theme=<name>.

Lock collision note

visual-targets.json (owned by claude-w14-pr1-harness until 22:13:06Z) and visual-targets.schema.json (owned by claude-w15-a9-oracle until 22:38:30Z) were both actively locked at A8 dispatch time. To avoid clobbering the W15-A9 oracle harness mid-flight, this PR introduces a new canonical superset path (visual-targets.canonical.*) which downstream lanes will adopt. The W6-6 visual-targets.json is left untouched.

Self-audit (4/4 PASS)

PNGs in Images-GUI/: 31
Parent targets: 37
Collage parents: 11
Region children: 103
Theme variants: 6
Viewport outliers: 6
Total (parents + regions): 140

CHECK 1 (every PNG has a target): PASS
CHECK 2 (all required fields): PASS
CHECK 3 (target count >= 31): PASS (parents=37)
CHECK 4 (no secrets): PASS

Additionally validated by jsonschema.Draft202012Validator against the embedded schema: SCHEMA VALIDATION: PASS.

Sources

  • Official: JSON Schema 2020-12 specification (https://json-schema.org/draft/2020-12/schema)
  • Cross-project: Storybook stories.json + Chromatic baselines.json conventions (parent / region / variant separation with deterministic clip coordinates)

Hermes MCP locks

Owner claude-w15-a8-registry on:

  • 03_implementation/ui/tests/visual/visual-targets.canonical.json
  • 03_implementation/ui/tests/visual/visual-targets.canonical.schema.json
  • 03_implementation/docs/handoffs/W15_A2_IMAGES_GUI_INVENTORY_2026-05-10.md

Released on PR open.

Test plan

  • All 31 Images-GUI PNGs map to at least one image_path in the registry
  • Every parent target carries all 15 required fields
  • Every region child carries all 12 required region fields
  • Total target count (parents + regions) >= 31
  • No secrets in the manifest (regex sweep over dumps())
  • JSON Schema 2020-12 self-validation passes via jsonschema
  • Pre-push fast unit + smoke tests pass

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation

    • Added comprehensive inventory documentation for GUI visual assets, including file counts, dimensions, and theme references.
  • Chores

    • Established visual targets registry and validation schema to standardize asset metadata and structure.

Review Change Stack

…rts + themes (W15 A8)

Adds the canonical visual target registry covering all 31 Images-GUI PNGs:

- 03_implementation/ui/tests/visual/visual-targets.canonical.json — 37 parent
  targets (20 single + 11 collage parents + 6 theme variants) plus 103 region
  children, 140 total tracked targets.
- 03_implementation/ui/tests/visual/visual-targets.canonical.schema.json —
  JSON Schema 2020-12 spec for the registry (single / collage / region /
  theme_variant / user_direction classes, with conditional region/parent
  requirements).
- 03_implementation/docs/handoffs/W15_A2_IMAGES_GUI_INVENTORY_2026-05-10.md —
  inventory reconstructed from filesystem scan (A2 handoff was missing from
  develop at A8 dispatch time).

Per-target schema covers target_id, image_path, dimensions, route, viewport
(per-PNG override for the 5 1672x941 and 1 1586x992 outliers), theme, ui_state,
crop_region, backend_truth_source, playwright_proof_screenshot,
pass_fail_status, owning_pr, final_verdict, class, live_or_future. Collage
parents expand into clip-coordinate region children; the 09-themes palette
parent additionally expands into 6 theme-variant siblings (default /
cyberpunk / matrix / tron / industrial_forge / aurora_operator).

Lock collision: visual-targets.json + visual-targets.schema.json are held by
the active W15-A9 oracle harness lane. To avoid mutating their files mid-flight
this PR introduces a new canonical superset path (visual-targets.canonical.*),
which downstream lanes will adopt as the registry source of truth.

Self-audit (all PASS):
- 31/31 Images-GUI PNGs present in registry
- all 15 required schema fields populated on every parent + region
- 37 parents >= 31 baseline
- no secrets

Sources cited:
- JSON Schema 2020-12 (https://json-schema.org/draft/2020-12/schema)
- Storybook stories.json + Chromatic baselines.json conventions

Hermes locks: claude-w15-a8-registry on the 3 new files (released on PR open).
@coderabbitai

coderabbitai Bot commented May 10, 2026 •

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR establishes comprehensive visual regression test infrastructure for the Hermes3D GUI. It introduces a JSON Schema defining the canonical visual-targets registry contract, populates a large registry mapping 31 PNG GUI assets to Playwright proof screenshots with backend truth sources, and documents the source asset inventory with metadata on dimensions and collage regions.

Changes

Visual Test Target Registry

Layer / File(s) Summary
Schema Definition
03_implementation/ui/tests/visual/visual-targets.canonical.schema.json
JSON Schema (draft 2020-12) defines strict object shapes for target and region with required fields, enumerations for themes/UI state/status, conditional validation (collages must have regions, region targets must have parent_target_id), and optional crop regions.
Visual Target Registry Data
03_implementation/ui/tests/visual/visual-targets.canonical.json
Canonical registry with 1400+ lines populating 100+ visual targets across UI sections (user, dashboard, primary collages, settings, voice, OS coverage, plugins, workflows, observe area, theme variants), each specifying route, viewport, theme, UI state, backend truth source, and proof screenshot path.
Asset Inventory Documentation
03_implementation/docs/handoffs/W15_A2_IMAGES_GUI_INVENTORY_2026-05-10.md
W15-A2 handoff document inventorying PNG assets at commit c13e30f, recording counts per section, image dimension breakdowns, collage region estimates, theme palette references, visual-targets consumers, and filesystem-scan provenance notes.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A registry of pixels, neat and true,
Schema guards the targets through and through,
From collages split into regions bright,
To theme-painted variants, each one right,
Thirty-one PNGs, now catalogued with care! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: introduction of a canonical visual-targets registry with 31 PNGs mapped with regions, viewports, and theme support, directly matching the PR's core objective.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/w15-a8-visual-target-registry

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@03_implementation/docs/handoffs/W15_A2_IMAGES_GUI_INVENTORY_2026-05-10.md`:
- Line 48: Update the collage row entry for
`09-themes/theme-variants-reference.png` to use the canonical theme IDs instead
of the short forms; replace `forge` with `industrial_forge` and `aurora` with
`aurora_operator` so the row reads the same canonical IDs used elsewhere (e.g.,
use `industrial_forge/aurora_operator` in place of `forge/aurora`) to prevent
downstream mapping mismatches.

In `@03_implementation/ui/tests/visual/visual-targets.canonical.json`:
- Line 9: The top-level "themes" array is missing "dark" which many targets
reference via "theme":"dark"; update the top-level themes list to include "dark"
so metadata matches target entries and downstream consumers see a consistent
contract (locate the top-level "themes" key in the canonical visual-targets JSON
and add "dark" to the array).

In `@03_implementation/ui/tests/visual/visual-targets.canonical.schema.json`:
- Around line 191-200: The schema's conditional rules under the allOf array
enforce parent_target_id for class "region" but not for class "theme_variant",
allowing orphaned theme variants; add a new conditional object mirroring the
"region" rule: an if that checks { "properties": { "class": { "const":
"theme_variant" } }, "required": ["class"] } and a then that adds { "required":
["parent_target_id"] } so that any target with "class": "theme_variant" must
include parent_target_id.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e5729475-749e-4c27-b401-26be0fd60aa1

📥 Commits

Reviewing files that changed from the base of the PR and between 8dccb7b and 8f175fe.

📒 Files selected for processing (3)
  • 03_implementation/docs/handoffs/W15_A2_IMAGES_GUI_INVENTORY_2026-05-10.md
  • 03_implementation/ui/tests/visual/visual-targets.canonical.json
  • 03_implementation/ui/tests/visual/visual-targets.canonical.schema.json

| `07-plugins-skills-mcp/plugins-skills-mcp-app-connectors.png` | 4 |
| `08-app-utility-pages/workflow-printqueue-files-logs.png` | 4 |
| `08-app-utility-pages/proof-health-notifications-safety.png` | 4 |
| `09-themes/theme-variants-reference.png` | 6 (default/cyberpunk/matrix/tron/forge/aurora) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use canonical theme IDs in the collage row for consistency.

This line uses forge/aurora, while the canonical IDs used elsewhere are industrial_forge/aurora_operator. Keeping these identical avoids downstream mapping mistakes.

✏️ Suggested doc fix
-| `09-themes/theme-variants-reference.png` | 6 (default/cyberpunk/matrix/tron/forge/aurora) |
+| `09-themes/theme-variants-reference.png` | 6 (default/cyberpunk/matrix/tron/industrial_forge/aurora_operator) |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| `09-themes/theme-variants-reference.png` | 6 (default/cyberpunk/matrix/tron/forge/aurora) |
| `09-themes/theme-variants-reference.png` | 6 (default/cyberpunk/matrix/tron/industrial_forge/aurora_operator) |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@03_implementation/docs/handoffs/W15_A2_IMAGES_GUI_INVENTORY_2026-05-10.md` at
line 48, Update the collage row entry for
`09-themes/theme-variants-reference.png` to use the canonical theme IDs instead
of the short forms; replace `forge` with `industrial_forge` and `aurora` with
`aurora_operator` so the row reads the same canonical IDs used elsewhere (e.g.,
use `industrial_forge/aurora_operator` in place of `forge/aurora`) to prevent
downstream mapping mismatches.

"tolerance_default": 0.1,
"reference_viewport": "1536x1024",
"viewport": { "width": 1536, "height": 1024 },
"themes": ["default", "cyberpunk", "matrix", "tron", "industrial_forge", "aurora_operator"],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Top-level themes is inconsistent with actual target data.

themes omits dark, but many targets use "theme": "dark" (starting at Line 18). This creates a contract mismatch for downstream consumers that trust top-level metadata.

🧩 Minimal consistency fix
-  "themes": ["default", "cyberpunk", "matrix", "tron", "industrial_forge", "aurora_operator"],
+  "themes": ["dark", "default", "cyberpunk", "matrix", "tron", "industrial_forge", "aurora_operator"],
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"themes": ["default", "cyberpunk", "matrix", "tron", "industrial_forge", "aurora_operator"],
"themes": ["dark", "default", "cyberpunk", "matrix", "tron", "industrial_forge", "aurora_operator"],
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@03_implementation/ui/tests/visual/visual-targets.canonical.json` at line 9,
The top-level "themes" array is missing "dark" which many targets reference via
"theme":"dark"; update the top-level themes list to include "dark" so metadata
matches target entries and downstream consumers see a consistent contract
(locate the top-level "themes" key in the canonical visual-targets JSON and add
"dark" to the array).

Comment on lines +191 to +200
"allOf": [
{
"if": { "properties": { "class": { "const": "collage" } }, "required": ["class"] },
"then": { "required": ["regions"], "properties": { "regions": { "minItems": 1 } } }
},
{
"if": { "properties": { "class": { "const": "region" } }, "required": ["class"] },
"then": { "required": ["parent_target_id"] }
}
]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Require parent_target_id for theme_variant targets as well.

theme_variant currently has no conditional requirement for parent_target_id, so orphaned variants can pass validation even though linkage is part of the model.

🛠️ Suggested schema update
       "allOf": [
         {
           "if": { "properties": { "class": { "const": "collage" } }, "required": ["class"] },
           "then": { "required": ["regions"], "properties": { "regions": { "minItems": 1 } } }
         },
         {
           "if": { "properties": { "class": { "const": "region" } }, "required": ["class"] },
           "then": { "required": ["parent_target_id"] }
+        },
+        {
+          "if": { "properties": { "class": { "const": "theme_variant" } }, "required": ["class"] },
+          "then": { "required": ["parent_target_id"] }
         }
       ]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"allOf": [
{
"if": { "properties": { "class": { "const": "collage" } }, "required": ["class"] },
"then": { "required": ["regions"], "properties": { "regions": { "minItems": 1 } } }
},
{
"if": { "properties": { "class": { "const": "region" } }, "required": ["class"] },
"then": { "required": ["parent_target_id"] }
}
]
"allOf": [
{
"if": { "properties": { "class": { "const": "collage" } }, "required": ["class"] },
"then": { "required": ["regions"], "properties": { "regions": { "minItems": 1 } } }
},
{
"if": { "properties": { "class": { "const": "region" } }, "required": ["class"] },
"then": { "required": ["parent_target_id"] }
},
{
"if": { "properties": { "class": { "const": "theme_variant" } }, "required": ["class"] },
"then": { "required": ["parent_target_id"] }
}
]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@03_implementation/ui/tests/visual/visual-targets.canonical.schema.json`
around lines 191 - 200, The schema's conditional rules under the allOf array
enforce parent_target_id for class "region" but not for class "theme_variant",
allowing orphaned theme variants; add a new conditional object mirroring the
"region" rule: an if that checks { "properties": { "class": { "const":
"theme_variant" } }, "required": ["class"] } and a then that adds { "required":
["parent_target_id"] } so that any target with "class": "theme_variant" must
include parent_target_id.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request establishes a canonical visual target registry for the Hermes3D project, introducing a detailed image inventory, a JSON registry mapping images to UI routes and states, and a supporting JSON schema. The review feedback focuses on improving the robustness of the visual testing harness by suggesting the addition of wait_test_id to region definitions to ensure deterministic loading before capturing screenshots. Additionally, the reviewer recommended updating the schema to require parent_target_id for theme_variant classes to maintain structural consistency across the registry.

"owning_pr": { "type": ["string", "null"] },
"final_verdict": { "$ref": "#/$defs/finalVerdict" },
"live_or_future": { "$ref": "#/$defs/liveOrFuture" },
"notes": { "type": "string" }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The region definition is missing the wait_test_id property. Since many regions in the registry point to specific sub-routes (e.g., /#design or /#settings:providers), they require deterministic wait conditions to ensure the UI is stable before a screenshot is captured for comparison. Adding this field allows the visual testing harness to handle these sub-routes reliably.

        "wait_test_id": { "type": "string" },
        "notes": { "type": "string" }

Comment on lines +196 to +199
{
"if": { "properties": { "class": { "const": "region" } }, "required": ["class"] },
"then": { "required": ["parent_target_id"] }
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Targets with the theme_variant class should also be required to provide a parent_target_id, as they are logically derived from a parent collage (like 09_theme_variants_reference). This ensures structural consistency across the registry.

Suggested change
{
"if": { "properties": { "class": { "const": "region" } }, "required": ["class"] },
"then": { "required": ["parent_target_id"] }
}
{
"if": { "properties": { "class": { "enum": ["region", "theme_variant"] } }, "required": ["class"] },
"then": { "required": ["parent_target_id"] }
}

Comment on lines +364 to +365
"live_or_future": "live"
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Regions that point to distinct logical routes (like /#autopilot, /#design, etc.) should include a wait_test_id. This allows the visual proof harness to wait for the specific root element of that sub-page when navigating directly to it for verification. Please apply this pattern to all regions in the collage targets (02_primary_*, 03_settings_*, etc.) where the sub-route requires a specific loading check.

          "live_or_future": "live",
          "wait_test_id": "autopilot-root"
        },

@Ghenghis
Ghenghis merged commit f633b8e into develop May 10, 2026
16 checks passed
@Ghenghis
Ghenghis deleted the claude/w15-a8-visual-target-registry branch May 10, 2026 22:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant