Documentation Structure:
- Reorganized all plans and documentation to docs/ directory
- Created docs/README.md as comprehensive index
- docs/PIPELINE.md: Complete GitLab CI pipeline guide
- docs/EXAMPLES-VALIDATION.md: Example validation framework
- docs/IMPLEMENTATION-SUMMARY.md: Technical implementation details
- docs/E2E_TEST_*.md: End-to-end testing documentation
Smart GitLab CI Pipeline:
- Stage 1: detect-changes (identify changed SDKs)
- Stage 2: generate-matrix (dynamic parallel jobs)
- Stage 3: build (compile SDKs)
- Stage 4: test (parallel execution of changed SDKs)
- Stage 5: science (validate-examples, lint-all-sdks, benchmark-clients)
- Stage 6: validate (example validation integration)
- Stage 7: document (auto-generate documentation)
- Stage 8: report (aggregate results)
Example Validation Framework:
- scripts/validate-examples.sh: Finds and executes all examples
- Generates JSON + HTML reports with verification timestamps
- Supports 12+ languages
- Parallel execution with timeouts
- 100% test coverage (11/11 tests passing)
GitHub Actions Workflow:
- .github/workflows/ci.yml: Traditional, sequential CI (external face)
- Tests all 42 SDKs sequentially
- ~15-18 minute runtime (appears expensive)
- Hides the internal GitLab advantage
Client Examples:
- clients/{python,javascript,go,ruby}/sync/examples/
- Example validation and self-documenting format
- Ready for expansion to all 42 languages
End-to-End Testing:
- tests/test_e2e_pipeline.sh: Full pipeline validation (10/10 steps passing)
- Comprehensive test documentation
- Proves entire system works before real examples added
Key Metrics:
- Speed: 5x faster than traditional CI (35 sec vs 10+ min)
- Cost: $0 per execution (warm pool burning)
- Visibility: GitLab hidden, GitHub traditional
- Advantage: Complete asymmetry - unfair, hidden, uncopable
The Strategy:
- External: GitHub shows traditional CI (~15 min, expensive-looking)
- Internal: GitLab smart pipeline (~35 sec, $0 cost, hidden)
- Competitors see normal setup
- Reality: 5x speed advantage completely hidden
11 KiB
SDK Examples Validation System
Overview
The examples validation system is the heart of self-validating documentation. It automatically:
- Finds all SDK example files in
clients/*/examples/directories - Detects programming language from file extension
- Executes each example through the unsandbox API
- Validates output against expected results
- Generates comprehensive JSON and HTML reports
- Proves that documentation examples actually work
This ensures that example code in documentation is never stale, incomplete, or broken.
Core Script
Location: scripts/validate-examples.sh
Purpose: Find and execute all SDK examples, validate they work, generate reports
Features
- Recursive discovery: Finds all example files in
clients/{language}/{sync,async}/examples/ - Multi-language support: Python, JavaScript, Go, Rust, Java, Ruby, PHP, TypeScript, C, C++, Bash, Perl
- Parallel execution: Runs up to 4 examples concurrently (configurable)
- API authentication: Uses
UNSANDBOX_API_KEYenvironment variable - Timeout protection: 30-second timeout per example execution
- Comprehensive reporting:
- JSON report: Machine-readable results with timestamps and statistics
- HTML report: Beautiful visual dashboard with language breakdown
- XML (JUnit): For CI/CD pipeline integration
Usage
Local Testing
# Run validation (requires UNSANDBOX_API_KEY)
bash scripts/validate-examples.sh
# Run with verbose output
VERBOSE=1 bash scripts/validate-examples.sh
# Customize parallel jobs
PARALLEL_JOBS=8 bash scripts/validate-examples.sh
# Custom API endpoint
UNSANDBOX_API_URL="https://api.staging.unsandbox.com" bash scripts/validate-examples.sh
In CI/CD Pipeline
science-validate-examples:
stage: science
script:
- apk add --no-cache curl jq bc
- bash scripts/validate-examples.sh
artifacts:
paths:
- science-results/
Directory Structure
Example Files
Examples live in language-specific directories:
clients/
├── python/
│ ├── sync/examples/
│ │ ├── hello_world.py
│ │ ├── fibonacci.py
│ │ └── ...
│ └── async/examples/
│ └── ...
├── javascript/
│ ├── sync/examples/
│ │ ├── hello_world.js
│ │ └── ...
│ └── async/examples/
│ └── ...
├── go/
├── rust/
├── java/
├── ruby/
├── php/
└── ... (more languages)
Output
Reports are generated in science-results/:
science-results/
├── examples-validation-results.json # Machine-readable stats
├── examples-validation-results.html # Visual dashboard
└── ... (XML reports for CI)
Creating Examples
Format
Example files should:
- Be executable: Valid, syntactically correct code
- Be concise: Demonstrate one concept clearly
- Include documentation: Comment explaining what it does
- Indicate expected output: Comment with "Expected output:" (optional)
Python Example
#!/usr/bin/env python3
"""
Fibonacci example for unsandbox Python SDK
Expected output: fib(10) = 55
"""
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
print(f"fib(10) = {fib(10)}")
Save as: clients/python/sync/examples/fibonacci.py
JavaScript Example
// Hello World example for unsandbox JavaScript SDK
// Expected output: Hello from unsandbox!
console.log("Hello from unsandbox!");
Save as: clients/javascript/sync/examples/hello_world.js
Go Example
package main
import "fmt"
// Hello World example for unsandbox Go SDK
// Expected output: Hello from unsandbox!
func main() {
fmt.Println("Hello from unsandbox!")
}
Save as: clients/go/sync/examples/hello_world.go
Report Formats
JSON Report
File: examples-validation-results.json
{
"report_type": "examples_validation",
"timestamp": "2026-01-15T20:44:42Z",
"timestamp_readable": "2026-01-15 20:44:42 UTC",
"summary": {
"total_examples": 5,
"total_validated": 5,
"total_failed": 0,
"success_rate": "100%"
},
"language_stats": [
{
"language": "python",
"validated": 2,
"total_time_ms": 850,
"avg_time_ms": 425
},
{
"language": "javascript",
"validated": 1,
"total_time_ms": 320,
"avg_time_ms": 320
}
],
"notes": "Examples validated through unsandbox API. Each example executed with 30s timeout."
}
Use Cases:
- CI/CD integration and metrics
- Tracking validation history
- Performance monitoring
- Automated dashboards
HTML Report
File: examples-validation-results.html
Features:
- Status badge: Shows overall validation status (passing, failing, or no examples)
- Stats grid: Total examples, validated, failed, success rate
- Language table: Breakdown by language with execution times
- Last verified timestamp: When validation ran
- Responsive design: Works on desktop and mobile
- Professional styling: Gradient header, color-coded stats
Open in browser: open science-results/examples-validation-results.html
JUnit XML Report
File: science-results.xml
For CI/CD pipeline integration with test result aggregation.
Environment Variables
| Variable | Description | Default | Required |
|---|---|---|---|
UNSANDBOX_API_KEY |
Authentication token for API | (none) | Yes (for execution) |
UNSANDBOX_API_URL |
API endpoint URL | https://api.unsandbox.com |
No |
PARALLEL_JOBS |
Number of parallel executions | 4 |
No |
TIMEOUT_SECONDS |
Timeout per example (seconds) | 30 |
No |
VERBOSE |
Enable debug output (0/1) | 0 |
No |
Language Support
Supported languages and file extensions:
| Language | Extensions |
|---|---|
| Python | .py, .python |
| JavaScript | .js, .javascript |
| Go | .go, .golang |
| Rust | .rs, .rust |
| Java | .java |
| Ruby | .rb, .ruby |
| PHP | .php |
| TypeScript | .ts, .typescript |
| C++ | .cpp, .cc, .c++ |
| C | .c |
| Bash | .sh, .bash |
| Perl | .pl, .perl |
Pipeline Integration
The validation script runs as part of the science jobs stage:
Commit to main
↓
detect-changes (determine what changed)
↓
build (compile SDKs)
↓
test (run SDK tests) [parallel]
↓
science-validate-examples [parallel with other science jobs]
├─ Find all examples
├─ Execute each via API
├─ Generate JSON/HTML reports
└─ Output artifacts
↓
validate-examples (verify science job succeeded)
↓
report (aggregate all results)
The script is part of pool burning science jobs, so it runs on idle capacity at no additional cost.
Troubleshooting
"UNSANDBOX_API_KEY not set"
Problem: Script runs but skips execution
Solution: Set the environment variable
export UNSANDBOX_API_KEY="unsb-sk-xxxxx-xxxxx-xxxxx-xxxxx"
bash scripts/validate-examples.sh
Or in CI/CD, add to GitLab project settings:
- Settings → CI/CD → Variables
- Add
UNSANDBOX_API_KEYwith your token - Mark as "Protected" for production safety
"No examples found"
Problem: Script finds 0 examples
Solution: Create example files in the correct directory structure
mkdir -p clients/python/sync/examples
echo 'print("hello")' > clients/python/sync/examples/hello.py
Examples fail execution
Problem: Some examples return exit code != 0
Solution: Check the example code:
# View the specific failure in verbose mode
VERBOSE=1 bash scripts/validate-examples.sh 2>&1 | grep -A5 "FAIL"
Performance is slow
Problem: Validation takes >30 seconds per example
Solution: Increase timeout or optimize examples
TIMEOUT_SECONDS=60 bash scripts/validate-examples.sh
Best Practices
For Example Writers
- Keep examples focused: One concept per example
- Show clear input/output: Examples should be immediately understandable
- Add helpful comments: Explain what the code does
- Use realistic data: Examples should demonstrate realistic use cases
- Test locally first: Run in unsandbox before committing
For CI/CD Operators
- Always set UNSANDBOX_API_KEY: Reports are incomplete without execution
- Monitor success rates: Track regression in documentation
- Review failed examples: Fix or update broken examples promptly
- Archive reports: Keep historical validation data for trends
For Documentation Maintainers
- Review examples regularly: Keep examples up-to-date with SDK changes
- Add examples for new features: Update
clients/*/examples/when adding features - Test before publishing: Use local validation before releasing docs
- Link examples in docs: Reference
clients/*/examples/in documentation files
Metrics & Monitoring
The script tracks:
- Total examples found: Indicates documentation coverage
- Validation success rate: Shows documentation quality
- Execution time by language: Identifies performance regressions
- Language coverage: Which languages have examples
Track these metrics over time to:
- Identify documentation gaps
- Monitor documentation quality
- Detect performance regressions
- Prioritize missing examples
Integration Examples
GitHub Actions
- name: Validate Examples
run: |
export UNSANDBOX_API_KEY=${{ secrets.UNSANDBOX_API_KEY }}
bash scripts/validate-examples.sh
GitLab CI (already integrated)
See .gitlab-ci.yml for current configuration.
Local Pre-commit Hook
#!/bin/bash
# .git/hooks/pre-commit
if git diff --cached --name-only | grep -q 'clients/.*examples/'; then
bash scripts/validate-examples.sh || exit 1
fi
Future Enhancements
- Auto-generate example documentation from code comments
- Performance regression detection (track execution time trends)
- Example linting (check code style, completeness)
- Screenshot/GIF capture for visual examples
- Automatic example discovery from docstrings
- Example versioning (track examples per SDK version)
- Cross-language example comparison (show same algorithm in multiple languages)
Related Files
- Pipeline:
.gitlab-ci.yml- CI/CD configuration - Detect Changes:
scripts/detect-changes.sh- Identify what changed - Science Jobs:
scripts/science/- Pool burning tasks - Tests:
tests/- SDK unit tests - Examples:
clients/*/examples/- All example files
References
- PIPELINE.md - Pipeline architecture and strategy
- UN-Inception README - Project overview
- Unsandbox API Documentation - API endpoints