for-ais-only/metadata_docs/BUILDSUPON_VALIDATION_RULES.md
buildsUpon Validation Rules and ConstraintsThis document specifies the validation rules and constraints for the buildsUpon attribute in code examples. These rules ensure data integrity and prevent common errors.
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:
Example:
{{< clients-example set="tutorial" step="advanced" buildsUpon="nonexistent" >}}
❌ Invalid - "nonexistent" doesn't exist on this page
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:
Example:
Example A: buildsUpon="B"
Example B: buildsUpon="A"
❌ Invalid - Circular dependency (A→B→A)
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:
Step ID: "set_get"
buildsUpon: "Set_Get" ❌ Invalid - case mismatch
buildsUpon: "set_get" ✅ Valid
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
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:
buildsUponbuildsUponbuildsUponRecommendation (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)
The build system should validate buildsUpon during Hugo build:
buildsUpon:
AI agents should validate buildsUpon when consuming metadata:
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")
buildsUpon: Treated as foundational (no change)buildsUpon to existing examples: Safe operation, no breaking changesbuildsUpon: Safe operation, example becomes independentPotential future improvements:
buildsUpon to reference examples on other pages