un-inception/docs/EXAMPLES-VALIDATION.md
russell@unturf.com 2701b29945 feat: Complete self-validating documentation and smart CI/CD pipeline
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
2026-01-15 16:11:29 -05:00

411 lines
11 KiB
Markdown

# SDK Examples Validation System
## Overview
The examples validation system is the **heart of self-validating documentation**. It automatically:
1. **Finds** all SDK example files in `clients/*/examples/` directories
2. **Detects** programming language from file extension
3. **Executes** each example through the unsandbox API
4. **Validates** output against expected results
5. **Generates** comprehensive JSON and HTML reports
6. **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_KEY` environment 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
```bash
# 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
```yaml
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:
1. **Be executable**: Valid, syntactically correct code
2. **Be concise**: Demonstrate one concept clearly
3. **Include documentation**: Comment explaining what it does
4. **Indicate expected output**: Comment with "Expected output:" (optional)
### Python Example
```python
#!/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
```javascript
// 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
```go
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`
```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
```bash
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_KEY` with 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
```bash
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:
```bash
# 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
```bash
TIMEOUT_SECONDS=60 bash scripts/validate-examples.sh
```
## Best Practices
### For Example Writers
1. **Keep examples focused**: One concept per example
2. **Show clear input/output**: Examples should be immediately understandable
3. **Add helpful comments**: Explain what the code does
4. **Use realistic data**: Examples should demonstrate realistic use cases
5. **Test locally first**: Run in unsandbox before committing
### For CI/CD Operators
1. **Always set UNSANDBOX_API_KEY**: Reports are incomplete without execution
2. **Monitor success rates**: Track regression in documentation
3. **Review failed examples**: Fix or update broken examples promptly
4. **Archive reports**: Keep historical validation data for trends
### For Documentation Maintainers
1. **Review examples regularly**: Keep examples up-to-date with SDK changes
2. **Add examples for new features**: Update `clients/*/examples/` when adding features
3. **Test before publishing**: Use local validation before releasing docs
4. **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
```yaml
- 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
```bash
#!/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.md) - Pipeline architecture and strategy
- [UN-Inception README](../README.md) - Project overview
- [Unsandbox API Documentation](../unsandbox.txt) - API endpoints