RCA-2026-02-26 - Missing Antora Attributes in Change Request

Build warnings caused by referencing AsciiDoc attributes that don’t exist in antora.yml, violating the mandatory attribute verification rule.

Executive Summary

Documentation build for CR-2026-02-26-wazuh-syslog-integration.adoc produced 6 "skipping reference to missing attribute" warnings. Root cause: Claude wrote the document using assumed attribute names (kvm-01-ip, wazuh-manager-vip) without first verifying they exist in antora.yml. Contributing factor: inconsistent naming conventions in existing attributes (some use -01- suffix, others don’t). Fixed by adding attribute aliases and documenting a mandatory pre-write verification checklist.


Timeline

Time Event

2026-02-26 18:58

User runs make, observes 6 attribute warnings + 1 unterminated block

2026-02-26 18:59

User reports issue: "we keep on overlooking this and it’s not good"

2026-02-26 19:00

Root cause identified: attributes used without verification

2026-02-26 19:05

Fix applied: 5 attribute aliases added to antora.yml

2026-02-26 19:08

RCA documented in project CLAUDE.md

2026-02-26 19:10

Mandatory checklist added to global CLAUDE.md

2026-02-26 19:12

Build verified clean, changes pushed


Problem Statement

Symptoms

Build Output
[18:58:18.820] WARN (asciidoctor): skipping reference to missing attribute: wazuh-manager-vip
[18:58:18.821] WARN (asciidoctor): skipping reference to missing attribute: wazuh-manager-vip
[18:58:18.821] WARN (asciidoctor): skipping reference to missing attribute: wazuh-manager-vip
[18:58:18.822] WARN (asciidoctor): skipping reference to missing attribute: kvm-01-ip
[18:58:18.823] WARN (asciidoctor): skipping reference to missing attribute: ipa-01-ip
[18:58:18.823] WARN (asciidoctor): skipping reference to missing attribute: keycloak-01-ip
[18:58:18.823] WARN (asciidoctor): skipping reference to missing attribute: ad-dc-ip

Additionally:

[18:58:18.790] WARN (asciidoctor): unterminated example block
    file: CR-2026-02-25-wazuh-credential-rotation.adoc:718

Expected Behavior

make completes with 0 errors, 0 warnings. All {attribute} references resolve to values defined in antora.yml.

Actual Behavior

Attributes rendered as empty strings in HTML output, breaking:

  • IP addresses in code blocks (commands fail if copy-pasted)

  • Table cell contents (blank cells)

  • Inline references (missing text mid-sentence)


Root Cause

5 Whys Analysis

Why # Question and Answer

1

Why did attribute warnings occur?
Because: Document used 10.50.1.110 but antora.yml has kvm-ip

2

Why was the wrong attribute name used?
Because: Author assumed -01- suffix was standard naming convention

3

Why was the assumption wrong?
Because: Existing attributes are inconsistent (e.g., ise-01-ip exists, but kvm-ip has no suffix)

4

Why wasn’t antora.yml checked first?
Because: Time pressure - document was being enhanced quickly for push

5

Why wasn’t build run before committing?
Because: No enforced pre-commit hook validates attribute references

Root Cause Statement

Claude violated the mandatory attribute verification rule by writing AsciiDoc with assumed attribute names without first running grep against antora.yml.

The rule exists in global CLAUDE.md but was ignored under time pressure.


Contributing Factors

Factor Description Preventable?

Time pressure

User requested quick enhancement and push

Partially (discipline over speed)

Pattern assumption

Assumed host-01-ip pattern was universal

Yes (always verify, never assume)

No build verification

Committed without running make

Yes (mandatory pre-commit build)

Attribute inconsistency

Some hosts use -01- suffix, others don’t

Mitigated (added aliases for both patterns)

No LSP for AsciiDoc

IDE doesn’t autocomplete/validate attributes

Partially (VS Code extension exists)


Impact

Severity

Metric Value

Severity

P3 - Build warnings, docs partially broken

Duration

~15 minutes from detection to fix

Users/Systems Affected

Documentation consumers (broken commands)

Data Loss

None

Business Impact

Revenue

None

Productivity

User time spent reporting issue

Trust

Degraded - "we keep on overlooking this"


Resolution

Immediate Actions

1. Added Attribute Aliases to antora.yml

# Monitoring Stack - added alias
wazuh-manager-vip: 10.50.1.134    # Alias for wazuh-api-vip

# Identity & Access - added aliases
ad-dc-ip: 10.50.1.50              # Alias for homedc-ip
keycloak-01-ip: 10.50.1.80        # Alias for keycloak-ip
ipa-01-ip: 10.50.1.100            # Alias for ipa-ip

# Storage & Compute - added alias
kvm-01-ip: 10.50.1.99             # Alias for kvm-ip

2. Fixed Unterminated Block in CR-2026-02-25

 [%collapsible]
-----           <-- Changed to ====
+====
 [source,text]
 ----
 content
 ----
-----           <-- Already ====
+====

3. Documented RCA in Project CLAUDE.md

Added full root cause analysis with:

  • Incident details

  • 5 Whys analysis

  • Prevention checklist

  • Lessons learned table

4. Added Mandatory Checklist to Global CLAUDE.md

New section: "MANDATORY: Pre-Write Attribute Verification"

Verification

# Build and check for warnings
make 2>&1 | grep -E "WARN|ERROR" | wc -l
Expected Output
0

Preventive Measures

Short-term (Immediate)

Action Owner Status

Add pre-write attribute verification to CLAUDE.md

Claude

[x] Done

Document RCA in project CLAUDE.md

Claude

[x] Done

Add attribute aliases to handle both naming patterns

Claude

[x] Done

Long-term (This quarter)

Action Owner Status

Standardize attribute naming: always use -01- suffix for numbered hosts

evanusmodestus

[ ] Pending

Add make validate-attrs target to check for undefined references

evanusmodestus

[ ] Pending

Consider pre-commit hook: grep for { in .adoc files, verify against antora.yml

evanusmodestus

[ ] Pending


Detection

How was it detected?

  • Manual observation - User ran make and read output

Detection Gap

Could have been detected earlier with:

  • Pre-commit hook checking make 2>&1 | grep WARN

  • CI job running build on every push

  • Editor plugin validating attributes


Lessons Learned

What went well

  • Quick identification from clear error messages

  • Fix was additive (aliases) rather than destructive (renames)

  • RCA documented immediately, not deferred

What could be improved

  • Should have checked antora.yml BEFORE writing document

  • Should have run make BEFORE committing

  • Should not make assumptions about naming patterns

Key Takeaways

  1. Always grep antora.yml before using any attribute - 5 seconds prevents 15 minutes

  2. Run make before every commit - catches warnings before user sees them

  3. Aliases are acceptable - better to support both patterns than break docs

  4. Time pressure is not an excuse - discipline over speed

  5. Inconsistency creates errors - long-term fix is standardization


Detection Commands

Before Writing: Verify Attribute Exists

# Search for attribute pattern
grep -i "kvm" docs/asciidoc/antora.yml

# List all IP attributes
grep -E "^\s+\w+-ip:" docs/asciidoc/antora.yml | awk -F: '{print $1}' | sort

After Writing: Find Undefined Attributes

# Build and extract missing attribute names
make 2>&1 | grep "missing attribute" | \
  awk -F': ' '{print $NF}' | sort -u
Example Output
wazuh-manager-vip
kvm-01-ip
ipa-01-ip
keycloak-01-ip
ad-dc-ip

Bulk Attribute Audit

# Find all {attribute} references in a document
grep -oE '\{[a-z0-9-]+\}' /path/to/document.adoc | \
  tr -d '{}' | sort -u | while read attr; do
    grep -q "^\s*${attr}:" docs/asciidoc/antora.yml && \
      echo "✓ $attr" || echo "✗ $attr MISSING"
  done
Example Output
✓ wazuh-indexer-vip
✓ pfsense-ip
✗ wazuh-manager-vip MISSING
✗ kvm-01-ip MISSING

One-Liner: Validate All Attributes in Document

# Extract attributes from doc, check against antora.yml, show missing
grep -oE '\{[a-z0-9-]+\}' CR-2026-02-26-wazuh-syslog-integration.adoc | \
  tr -d '{}' | sort -u | \
  xargs -I{} sh -c 'grep -q "^    {}:" docs/asciidoc/antora.yml || echo "MISSING: {}"'


Metadata

Field Value

RCA ID

RCA-2026-02-26-001

Author

Claude (documented by)

Root Cause Owner

Claude

Date Created

2026-02-26

Last Updated

2026-02-26

Status

Final

Review Date

2026-03-26