stemedb/applications/aphoria/dogfood/cachewrap/claims-template.sh
jml e758f2ebfb feat(aphoria): implement programmatic extractors for Option<T> semantics
Completes Task #3 of httpclient dogfooding with 100% detection rate (7/7 violations).

## New Extractors

- **OptionBoundsExtractor**: Detects Option<T> fields set to None (unbounded)
- **OptionValueExtractor**: Extracts values from Some(n) for threshold checks

Both extractors use context-aware pattern matching to understand Rust Option<T>
semantics, which declarative extractors cannot handle.

## Implementation

**Files Created**:
- applications/aphoria/src/extractors/option_bounds.rs (257 lines)
- applications/aphoria/src/extractors/option_value.rs (277 lines)
- applications/aphoria/docs/examples/extractors/programmatic-option-semantics.md

**Files Modified**:
- applications/aphoria/src/extractors/mod.rs - Added module declarations
- applications/aphoria/src/extractors/registry.rs - Registered extractors
- applications/aphoria/dogfood/httpclient/.aphoria/claims.toml - Added 4 claims
- applications/aphoria/dogfood/httpclient/TASK-1-SUMMARY.md - Task #3 completion

## Results

| Metric | Value |
|--------|-------|
| Detection Rate | 100% (7/7 violations) |
| Improvement | +29 percentage points (from 71%) |
| New Violations | 2 (max_redirects, max_retries unbounded) |
| Unit Tests | 13 (all passing) |

## Two-Claim Strategy

For each bounded Option<T> field:
1. **configured** claim - Detects None (unbounded)
2. **max_value** claim - Validates Some(n) threshold

Example:
- `max_redirects: None` → CONFLICT (not configured)
- `max_redirects: Some(20)` → CONFLICT (exceeds 10)
- `max_redirects: Some(5)` → PASS

## Enterprise Quality

✓ Proper error handling (no unwrap/expect)
✓ Comprehensive tests (6+7 unit tests)
✓ Full documentation with examples
✓ Reusable for 10+ similar patterns
✓ Screening patterns for performance

## Cachewrap Dogfood

Also includes complete cachewrap dogfood exercise:
- 10 claims for Redis cache wrapper
- Day 1-5 summaries
- Full retrospective and evaluation
- Declarative extractors for all patterns

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 06:43:10 +00:00

348 lines
12 KiB
Bash
Executable File

#!/bin/bash
# Batch claim creation for cachewrap dogfood
# Usage: ./claims-template.sh
#
# This template shows the structure for creating claims via CLI.
# On Day 1, use /aphoria-suggest and /aphoria-claims skills instead
# for LLM-driven claim authoring with better provenance extraction.
set -e
echo "Creating 20 claims for cachewrap dogfood..."
echo ""
echo "⚠️ RECOMMENDED: Use /aphoria-claims skill instead of this script"
echo " The skill provides LLM-driven provenance extraction and validation."
echo ""
read -p "Continue with manual CLI? (y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Aborted. Use /aphoria-claims instead."
exit 1
fi
# ============================================================================
# REUSED FROM CORPUS (7 claims = 35% reuse rate)
# ============================================================================
# From httpclient corpus (4 patterns)
echo "[1/20] Creating claim: cache/timeout (from httpclient)..."
aphoria claims create \
--id "cachewrap-001" \
--concept-path "cache/timeout" \
--predicate "value_gt" \
--value "0" \
--comparison "greater_than" \
--provenance "Reused from httpclient corpus - timeout handling pattern" \
--invariant "Timeout MUST be greater than 0 seconds" \
--consequence "timeout=0 causes indefinite blocking on connection failures" \
--tier "expert" \
--category "safety" \
--evidence "docs/sources/redis-rs-lib.md" \
--by "dogfood-exercise"
echo "[2/20] Creating claim: cache/tls_verification (from httpclient)..."
aphoria claims create \
--id "cachewrap-002" \
--concept-path "cache/tls/certificate_validation" \
--predicate "enabled" \
--value "true" \
--comparison "equals" \
--provenance "Reused from httpclient corpus - TLS verification pattern" \
--invariant "TLS certificate verification MUST be enabled" \
--consequence "Disabled TLS verification enables MITM attacks" \
--tier "expert" \
--category "security" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
echo "[3/20] Creating claim: cache/retry (from httpclient)..."
aphoria claims create \
--id "cachewrap-003" \
--concept-path "cache/retry/max_attempts" \
--predicate "value_range" \
--value "3" \
--comparison "greater_than" \
--provenance "Reused from httpclient corpus - retry pattern" \
--invariant "Max retry attempts SHOULD be at least 3" \
--consequence "Insufficient retries cause failures on transient errors" \
--tier "expert" \
--category "reliability" \
--evidence "docs/sources/redis-rs-lib.md" \
--by "dogfood-exercise"
echo "[4/20] Creating claim: cache/async (from httpclient)..."
aphoria claims create \
--id "cachewrap-004" \
--concept-path "cache/async/runtime" \
--predicate "required" \
--value "tokio" \
--comparison "equals" \
--provenance "Reused from httpclient corpus - async runtime pattern" \
--invariant "Async operations MUST use tokio runtime" \
--consequence "Blocking calls in async context block event loop" \
--tier "expert" \
--category "performance" \
--evidence "docs/sources/redis-rs-lib.md" \
--by "dogfood-exercise"
# From dbpool corpus (2 patterns)
echo "[5/20] Creating claim: cache/max_connections (from dbpool)..."
aphoria claims create \
--id "cachewrap-005" \
--concept-path "cache/connection/max_connections" \
--predicate "required" \
--value "true" \
--comparison "equals" \
--provenance "Reused from dbpool corpus - connection limit pattern" \
--invariant "Max connections MUST be bounded to prevent resource exhaustion" \
--consequence "Unbounded connections exhaust file descriptors" \
--tier "expert" \
--category "safety" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
echo "[6/20] Creating claim: cache/connection_lifecycle (from dbpool)..."
aphoria claims create \
--id "cachewrap-006" \
--concept-path "cache/connection/lifecycle" \
--predicate "pooling_required" \
--value "true" \
--comparison "equals" \
--provenance "Reused from dbpool corpus - connection pooling pattern" \
--invariant "Connection pooling MUST be used for shared connections" \
--consequence "No pooling causes resource exhaustion - new conn per request" \
--tier "expert" \
--category "performance" \
--evidence "docs/sources/redis-rs-lib.md" \
--by "dogfood-exercise"
# From msgqueue corpus (1 pattern)
echo "[7/20] Creating claim: cache/metrics (from msgqueue)..."
aphoria claims create \
--id "cachewrap-007" \
--concept-path "cache/metrics/enabled" \
--predicate "required" \
--value "true" \
--comparison "equals" \
--provenance "Reused from msgqueue corpus - metrics pattern" \
--invariant "Hit/miss metrics MUST be tracked for debugging" \
--consequence "No metrics prevents debugging cache effectiveness" \
--tier "expert" \
--category "observability" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
# ============================================================================
# NEW CLAIMS FOR CACHING (13 claims = 65%)
# ============================================================================
echo "[8/20] Creating claim: cache/ttl (NEW)..."
aphoria claims create \
--id "cachewrap-008" \
--concept-path "cache/ttl" \
--predicate "required" \
--value "true" \
--comparison "equals" \
--provenance "Redis SETEX command specification" \
--invariant "TTL (Time To Live) MUST be set for all cached values" \
--consequence "Missing TTL causes memory leak - unbounded cache growth" \
--tier "expert" \
--category "safety" \
--evidence "docs/sources/redis-spec.md" \
--by "dogfood-exercise"
echo "[9/20] Creating claim: cache/eviction_policy (NEW)..."
aphoria claims create \
--id "cachewrap-009" \
--concept-path "cache/eviction_policy" \
--predicate "required" \
--value "true" \
--comparison "equals" \
--provenance "Redis maxmemory-policy documentation" \
--invariant "Eviction policy MUST be configured (LRU/LFU/random)" \
--consequence "No eviction policy causes undefined behavior when cache full" \
--tier "expert" \
--category "correctness" \
--evidence "docs/sources/redis-spec.md" \
--by "dogfood-exercise"
echo "[10/20] Creating claim: cache/max_size (NEW)..."
aphoria claims create \
--id "cachewrap-010" \
--concept-path "cache/max_size" \
--predicate "required" \
--value "true" \
--comparison "equals" \
--provenance "AWS ElastiCache best practices - memory management" \
--invariant "Maximum cache size MUST be bounded" \
--consequence "Unbounded cache causes OOM under sustained load" \
--tier "expert" \
--category "safety" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
echo "[11/20] Creating claim: cache/key_validation (NEW)..."
aphoria claims create \
--id "cachewrap-011" \
--concept-path "cache/key_validation" \
--predicate "required" \
--value "true" \
--comparison "equals" \
--provenance "Redis key format specification + OWASP injection prevention" \
--invariant "Cache keys MUST be validated before use" \
--consequence "Unvalidated keys enable injection attacks" \
--tier "expert" \
--category "security" \
--evidence "docs/sources/redis-spec.md" \
--by "dogfood-exercise"
echo "[12/20] Creating claim: cache/credentials (NEW)..."
aphoria claims create \
--id "cachewrap-012" \
--concept-path "cache/credentials/storage" \
--predicate "must_not_be" \
--value "hardcoded" \
--comparison "absent" \
--provenance "AWS ElastiCache security best practices" \
--invariant "Credentials MUST NOT be hardcoded in source" \
--consequence "Hardcoded credentials leak via version control" \
--tier "expert" \
--category "security" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
echo "[13/20] Creating claim: cache/serialization (NEW)..."
aphoria claims create \
--id "cachewrap-013" \
--concept-path "cache/serialization/format" \
--predicate "recommended" \
--value "messagepack" \
--comparison "equals" \
--provenance "redis-rs library patterns - efficient serialization" \
--invariant "MessagePack SHOULD be used for compact serialization" \
--consequence "JSON serialization wastes bandwidth and memory" \
--tier "expert" \
--category "performance" \
--evidence "docs/sources/redis-rs-lib.md" \
--by "dogfood-exercise"
echo "[14/20] Creating claim: cache/compression (NEW)..."
aphoria claims create \
--id "cachewrap-014" \
--concept-path "cache/compression/enabled" \
--predicate "recommended" \
--value "true" \
--comparison "equals" \
--provenance "AWS ElastiCache performance tuning guide" \
--invariant "Compression SHOULD be enabled for values > 1KB" \
--consequence "No compression wastes bandwidth and memory" \
--tier "expert" \
--category "performance" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
echo "[15/20] Creating claim: cache/circuit_breaker (NEW)..."
aphoria claims create \
--id "cachewrap-015" \
--concept-path "cache/circuit_breaker/enabled" \
--predicate "recommended" \
--value "true" \
--comparison "equals" \
--provenance "AWS ElastiCache high availability guide" \
--invariant "Circuit breaker SHOULD be used to prevent cascade failures" \
--consequence "No circuit breaker causes cascade failures when cache down" \
--tier "expert" \
--category "reliability" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
echo "[16/20] Creating claim: cache/consistency_mode (NEW)..."
aphoria claims create \
--id "cachewrap-016" \
--concept-path "cache/consistency/mode" \
--predicate "required" \
--value "eventual" \
--comparison "equals" \
--provenance "Redis replication documentation" \
--invariant "Consistency mode MUST be declared (strong/eventual)" \
--consequence "Undeclared consistency causes unexpected stale reads" \
--tier "expert" \
--category "correctness" \
--evidence "docs/sources/redis-spec.md" \
--by "dogfood-exercise"
echo "[17/20] Creating claim: cache/sharding (NEW)..."
aphoria claims create \
--id "cachewrap-017" \
--concept-path "cache/sharding/strategy" \
--predicate "recommended" \
--value "consistent_hashing" \
--comparison "equals" \
--provenance "Redis cluster specification" \
--invariant "Consistent hashing SHOULD be used for key distribution" \
--consequence "Poor sharding strategy causes hot spots and uneven load" \
--tier "expert" \
--category "performance" \
--evidence "docs/sources/redis-spec.md" \
--by "dogfood-exercise"
echo "[18/20] Creating claim: cache/stampede_prevention (NEW)..."
aphoria claims create \
--id "cachewrap-018" \
--concept-path "cache/stampede/prevention" \
--predicate "recommended" \
--value "true" \
--comparison "equals" \
--provenance "redis-rs GitHub issue #156 - cache stampede mitigation" \
--invariant "Cache stampede prevention SHOULD be implemented" \
--consequence "No stampede prevention causes thundering herd on cache miss" \
--tier "expert" \
--category "performance" \
--evidence "docs/sources/redis-rs-lib.md" \
--by "dogfood-exercise"
echo "[19/20] Creating claim: cache/key_prefix (NEW)..."
aphoria claims create \
--id "cachewrap-019" \
--concept-path "cache/key_prefix" \
--predicate "required" \
--value "true" \
--comparison "equals" \
--provenance "AWS ElastiCache multi-tenant best practices" \
--invariant "Key prefix MUST be used for namespace isolation" \
--consequence "No key prefix causes collisions in shared cache instances" \
--tier "expert" \
--category "correctness" \
--evidence "docs/sources/aws-elasticache.md" \
--by "dogfood-exercise"
echo "[20/20] Creating claim: cache/value_size (NEW)..."
aphoria claims create \
--id "cachewrap-020" \
--concept-path "cache/value_size/maximum" \
--predicate "value_lt" \
--value "1048576" \
--comparison "less_than" \
--provenance "Redis protocol spec + AWS ElastiCache limits" \
--invariant "Cached values MUST be < 1 MB" \
--consequence "Oversized values degrade performance and waste memory" \
--tier "expert" \
--category "performance" \
--evidence "docs/sources/redis-spec.md" \
--by "dogfood-exercise"
echo ""
echo "✅ All 20 claims created successfully!"
echo ""
echo "Breakdown:"
echo "- 7 reused from corpus (35% reuse rate) ✅"
echo "- 13 new claims specific to caching (65%)"
echo ""
echo "Verify claims:"
echo " cat .aphoria/claims.toml"
echo ""
echo "Next: Write DAY1-SUMMARY.md with metrics"