# Facet Quota Configuration Guide > **Version**: 1.0.0 > **Sprint**: SPRINT_20260105_002_003_FACET > **Last Updated**: 2026-01-07 This guide covers configuration and operation of per-facet drift quotas in StellaOps. --- ## Overview Facet quotas control how much change is acceptable in different parts of a container image between builds. When drift exceeds a quota, StellaOps can: - **Warn**: Log and report the drift, continue processing - **Block**: Fail the policy gate, prevent deployment - **Auto-VEX**: Generate a VEX draft for human review ### What are Facets? Facets are logical groupings of files in a container image: | Facet | Description | Typical Files | |-------|-------------|---------------| | `binaries` | Executables and libraries | `*.so`, `*.dll`, ELF files | | `lang-deps` | Language package dependencies | `node_modules/`, `site-packages/`, `.m2/` | | `os-packages` | OS-level packages | RPM, DEB, APK metadata | | `configs` | Configuration files | `*.conf`, `*.yaml`, `*.json` | | `data` | Static data files | Images, fonts, templates | ### Why Per-Facet Quotas? Different file types have different risk profiles: - A single binary change might be intentional (rebuild) or might indicate compromise - 100 new npm packages might be a normal dependency update - Removing OS security packages is always suspicious Per-facet quotas let you apply appropriate controls to each category. --- ## Configuration ### File Location ``` /etc/stellaops/facet-quotas.yaml ``` Or via environment variable: ```bash STELLAOPS_FACET_QUOTAS_PATH=/path/to/facet-quotas.yaml ``` ### Basic Structure ```yaml # Default quota for all facets defaults: maxChurnPercent: 30 # Max % of files that can change maxChangedFiles: 100 # Max absolute changed files maxAddedFiles: 50 # Max new files maxRemovedFiles: 50 # Max removed files action: warn # warn | block | auto-vex # Per-facet overrides facets: binaries: maxChurnPercent: 10 action: block lang-deps: maxChurnPercent: 40 action: auto-vex ``` ### Quota Parameters | Parameter | Type | Description | |-----------|------|-------------| | `maxChurnPercent` | decimal | Maximum percentage of files in the facet that can change | | `maxChangedFiles` | int | Maximum absolute number of changed files | | `maxAddedFiles` | int | Maximum number of new files (optional) | | `maxRemovedFiles` | int | Maximum number of removed files (optional) | | `action` | string | Action when quota exceeded: `warn`, `block`, `auto-vex` | | `allowlist` | list | Glob patterns to exclude from quota calculation | ### Using Profiles StellaOps includes predefined quota profiles: ```yaml # Use a predefined profile profile: moderate # strict | moderate | permissive # Optionally override specific facets facets: binaries: action: block # Override from profile ``` | Profile | Description | Use Case | |---------|-------------|----------| | `strict` | Minimal tolerance, blocks most drift | Production, regulated | | `moderate` | Balanced, auto-VEX for review | Staging, pre-prod | | `permissive` | Relaxed, warnings only | Development | --- ## Policy Integration ### Enabling Quota Gates In your policy configuration: ```yaml # policy-gates.yaml gates: - name: facet-quota enabled: true options: configPath: /etc/stellaops/facet-quotas.yaml failOnMissingSeal: true # Fail if no baseline seal exists ``` ### Seal Management Quotas compare current state against a "sealed" baseline: ```bash # Seal current image as baseline stella facet seal --image myapp:v1.2.3 --tenant production # List seals stella facet seals list --tenant production # Compare against seal stella facet drift --image myapp:v1.2.4 --baseline v1.2.3 ``` --- ## Auto-VEX Workflow When quota action is `auto-vex`, StellaOps: 1. Generates a VEX draft with drift justification 2. Queues the draft for human review 3. Sends notifications to configured channels ### VEX Draft Structure ```json { "statements": [{ "vulnerability": "FACET-DRIFT-2026-001234", "status": "under_investigation", "justification": "facet_drift_detected", "impact_statement": "Drift in 'binaries' facet: 15% churn (quota: 10%), 12 files changed" }] } ``` ### Approving VEX Drafts ```bash # List pending drafts stella vex drafts list --status pending # Approve a draft stella vex draft approve --id --reason "Expected rebuild" # Reject a draft stella vex draft reject --id --reason "Unexpected changes" ``` --- ## Monitoring ### Metrics | Metric | Description | |--------|-------------| | `facet_drift_evaluations_total` | Total drift evaluations | | `facet_quota_exceeded_total` | Quota breaches by facet and action | | `facet_vex_drafts_created_total` | Auto-VEX drafts generated | | `facet_seal_operations_total` | Seal create/update operations | ### Grafana Dashboard Import the facet quota dashboard: ``` devops/observability/grafana/facet-quota-metrics.json ``` ### Alerts Key alerts to configure: - `FacetQuotaBlockRate`: High rate of blocked builds - `FacetDriftAnomalous`: Unusual drift patterns - `FacetVexDraftBacklog`: Growing VEX draft queue --- ## Troubleshooting ### Quota Unexpectedly Blocking 1. Check current quota configuration: ```bash stella facet quota show --facet binaries ``` 2. Review drift details: ```bash stella facet drift --image myapp:latest --verbose ``` 3. Check allowlist patterns: ```bash stella facet quota test-allowlist --pattern "**/__pycache__/**" ``` ### Missing Baseline Seal ```bash # Create initial seal stella facet seal --image myapp:v1.0.0 --tenant production # Or skip quota check for first build stella scan --image myapp:v1.0.0 --skip-facet-quota ``` ### VEX Draft Not Generated 1. Verify action is `auto-vex` not `warn`: ```yaml facets: binaries: action: auto-vex # Not 'warn' ``` 2. Check VEX emitter is enabled: ```bash stella config get excititor.vex.facetDriftEnabled ``` --- ## Best Practices 1. **Start with `moderate` profile** in staging, tune based on observations 2. **Use `strict` for production** with explicit allowlists 3. **Review auto-VEX drafts daily** to prevent backlog 4. **Seal after each release** to establish new baseline 5. **Monitor quota metrics** to detect configuration drift --- ## Revision History | Version | Date | Author | Changes | |---------|------|--------|---------| | 1.0.0 | 2026-01-07 | Agent | Initial release |