Back to Redis

`buildsUpon` Validation Rules and Constraints

for-ais-only/metadata_docs/BUILDSUPON_VALIDATION_RULES.md

latest5.2 KB
Original Source

buildsUpon Validation Rules and Constraints

Overview

This document specifies the validation rules and constraints for the buildsUpon attribute in code examples. These rules ensure data integrity and prevent common errors.

Validation Rules

Rule 1: Reference Validity

Requirement: All step IDs in buildsUpon must reference existing examples on the same page.

Validation:

For each example with buildsUpon:
  For each step_id in buildsUpon:
    Assert: step_id exists in codeExamples[].id on the same page

Error handling:

  • Build-time: Warn or error if a referenced example doesn't exist
  • Runtime: AI agents should validate and warn users about broken references

Example:

markdown
{{< clients-example set="tutorial" step="advanced" buildsUpon="nonexistent" >}}

❌ Invalid - "nonexistent" doesn't exist on this page

Rule 2: No Circular Dependencies

Requirement: Examples must not have circular dependencies (A→B→A).

Validation:

For each example:
  Build prerequisite chain by following buildsUpon
  Assert: No example appears twice in the chain

Error handling:

  • Build-time: Error and fail the build if circular dependency detected
  • Runtime: AI agents should detect and warn about circular dependencies

Example:

Example A: buildsUpon="B"
Example B: buildsUpon="A"

❌ Invalid - Circular dependency (A→B→A)

Rule 3: Case Sensitivity

Requirement: Step IDs in buildsUpon are case-sensitive and must match exactly.

Validation:

For each step_id in buildsUpon:
  Assert: step_id matches codeExamples[].id exactly (case-sensitive)

Example:

markdown
Step ID: "set_get"
buildsUpon: "Set_Get"  ❌ Invalid - case mismatch
buildsUpon: "set_get"  ✅ Valid

Rule 4: Format Constraints

Requirement: buildsUpon must be a comma-separated list of valid step IDs.

Validation:

buildsUpon format: "step_id1, step_id2, step_id3"
- Separated by commas
- Optional whitespace around commas
- No empty values
- No duplicate values

Examples:

"set_get"                    ✅ Valid - single dependency
"set_get, setnx_xx"          ✅ Valid - multiple dependencies
"set_get,setnx_xx"           ✅ Valid - no spaces
"set_get, setnx_xx, mset"    ✅ Valid - three dependencies
"set_get, , setnx_xx"        ❌ Invalid - empty value
"set_get, set_get"           ❌ Invalid - duplicate

Rule 5: Foundational Examples

Requirement: Foundational examples (introducing a concept for the first time) should NOT have buildsUpon.

Validation:

If example is foundational:
  Assert: buildsUpon is not present or empty

Guidance:

  • First example in a tutorial: no buildsUpon
  • Variations/extensions: include buildsUpon
  • Advanced patterns: include buildsUpon

Rule 6: Ordering Constraint

Recommendation (not enforced): Foundational examples should appear before dependent examples.

Guidance:

Page structure:
1. Foundational examples (no buildsUpon)
2. Intermediate examples (buildsUpon="foundational")
3. Advanced examples (buildsUpon="intermediate" or multiple)

Build-Time Validation

The build system should validate buildsUpon during Hugo build:

  1. Extract all examples from the page
  2. For each example with buildsUpon:
    • Check that all referenced step IDs exist
    • Check for circular dependencies
    • Check format constraints
  3. Report errors and fail the build if validation fails
  4. Report warnings for ordering issues

Runtime Validation (AI Agents)

AI agents should validate buildsUpon when consuming metadata:

python
def validate_buildsupon(page_metadata):
    """Validate buildsUpon references and constraints."""
    examples = page_metadata.get('codeExamples', [])
    example_ids = {ex['id'] for ex in examples}
    
    for example in examples:
        builds_upon = example.get('buildsUpon', [])
        
        # Rule 1: Reference validity
        for dep_id in builds_upon:
            if dep_id not in example_ids:
                warn(f"{example['id']}: references non-existent {dep_id}")
        
        # Rule 2: Circular dependencies
        if has_circular_dependency(example['id'], examples):
            error(f"{example['id']}: circular dependency detected")
        
        # Rule 3: Case sensitivity (implicit in comparison)
        # Rule 4: Format constraints
        if not all(isinstance(dep, str) for dep in builds_upon):
            error(f"{example['id']}: invalid buildsUpon format")

Migration and Backward Compatibility

  • Existing examples without buildsUpon: Treated as foundational (no change)
  • Adding buildsUpon to existing examples: Safe operation, no breaking changes
  • Removing buildsUpon: Safe operation, example becomes independent

Future Enhancements

Potential future improvements:

  1. Cross-page references: Allow buildsUpon to reference examples on other pages
  2. Conditional dependencies: Support "OR" dependencies (e.g., "understand A OR B")
  3. Dependency metadata: Include reason for dependency in metadata
  4. Automatic validation: Build-time validation with detailed error messages
  5. Visualization: Generate dependency graphs for documentation