| name | axon-ivy-verify-story |
| description | Verify story implementation by checking acceptance criteria, loading verify parts from other skills, and validating UI behavior (field interactions, disable/enable, show/hide, validations). |
MANDATORY: Run this skill after implementing each story via axon-ivy-implement-story. This skill orchestrates all verification — both artifact-specific checks (delegated to other verify skills) and behavioral/UI checks unique to this skill.
Verification Workflow
Phase 1: Acceptance Criteria Check
Read the story file. For each acceptance criterion (- [ ] ...):
- Verify the artifact/behavior described actually exists and works
- Mark as passed or flag the issue
Phase 2: Delegate to Artifact-Specific Verify Skills
Based on which files were created/modified, load and run the appropriate verify skills:
| If modified... | Load and run |
|---|
Any .p.json file | axon-ivy-process-verify — run its full checklist |
Any cms_*.yaml file | axon-ivy-cms-verify — run its full checklist |
Any .d.json data class | Phase 3: Data Class Checks (below) |
Any .xhtml dialog/component | Phase 4: UI Behavior Checks (below) |
Any .java model/enum | Phase 3: Java Checks (below) |
roles.yaml / users.yaml | Phase 3: Config Checks (below) |
Phase 3: Structural Checks
Data Class Checks (.d.json)
Read each created/modified .d.json file and verify:
Java Checks (enum, entity, model)
Config Checks (roles, users)
Phase 4: UI Behavior Checks
This is the core unique value of this skill. Read each .xhtml file created/modified and verify the following categories.
UI Behavior Checklist
4.1 Disabled/Enabled Conditions
Scan for disabled="#{...}" on buttons and inputs. Verify:
<p:commandButton disabled="#{empty data.inputFile}" />
<p:commandButton disabled="#{empty data.inputFile and empty data.uploadedFile}"
widgetVar="submitBtn" />
<p:fileUpload onchange="PF('submitBtn').enable();" />
4.2 Rendered/Visible Conditions
Scan for rendered="#{...}" on panels and sections. Verify:
<p:panel rendered="#{data.approvalData.status == 'APPROVED'}">
<p:panel rendered="#{not empty data.approvalData and data.approvalData.status == 'APPROVED'}">
4.3 Required Field Conditions
Scan for required="#{...}" (conditional required) and required="true". Verify:
<p:inputText value="#{data.workPermitNumber}"
required="#{data.workPermitRequired}"
requiredMessage="#{ivy.cms.co('.../WorkPermitNumberRequired')}" />
4.4 Update/Process Attributes
Scan <p:commandButton> and <p:ajax> for update and process attributes. Verify:
4.5 Data Binding Consistency
Scan all value="#{data.*}" bindings. Verify:
4.6 Component Mode Consistency (Read-Only vs Editable)
For reusable components with a readOnly attribute:
4.7 Form Action Buttons
Verify form actions match the story specification:
4.8 Layout and Responsiveness
Cross-Cutting Checks
CMS Completeness
For every #{ivy.cms.co('...')} reference in the XHTML:
Process ↔ Dialog Contract
For every dialog referenced by the main process:
Data Flow Integrity
Trace the data flow through the full story:
Quick Reference: Common Bugs by Story Type
| Story Type | Most Common Bug | How to Detect |
|---|
| UI Component | Missing readOnly mode handling | Check rendered toggle for edit/view |
| Form | Button disabled forever | Trace disabled condition to data source |
| Form | File upload doesn't enable submit | Check if server field vs client field |
| Process | SubProcessCall uses . instead of / | axon-ivy-process-verify check #1 |
| CMS | Yes/No keys parsed as boolean | axon-ivy-cms-verify check #1 |
| Data Class | Wrong type for date fields | String instead of java.util.Date |
| Entity | Missing Serializable | Class used in process data without it |
| Config | Role name mismatch | Process activator doesn't match roles.yaml |