v1.0.0: App + Prompt A (v1) + Config B (v1) + Query C (v1)v1.0.1: App + Prompt A (v2) + Config B (v1) + Query C (v1)v2.0.0: App + Prompt A (v2) + Config B (v2) + Query C (v1)
Problem: Can’t mix Prompt A v1 with Config B v2. Everything is locked to the app version.Edgit approach:
# Point staging to a versionedgit tag set prompts/extraction staging v1.0.0edgit push --tags --force# Update production pointeredgit tag set prompts/extraction production v2.0.0edgit push --tags --force
Characteristics:
Common names: staging, production, dev, canary
Mutable (—force required to update)
Point to version tags
Easy deployment workflow
Why mutable tags require —force:
Git protects against accidental overwrites
Forces explicit intent when moving environment pointers
# Create version tagedgit tag create prompts/extraction v1.0.0edgit push --tags# Iterateedgit tag create prompts/extraction v1.1.0edgit push --tags# Set environment pointeredgit tag set prompts/extraction staging v1.1.0edgit push --tags --force
No registration needed. Just create tags. The 4-level format is self-describing.
# 1. Create version tagsedgit tag create prompts/extraction v1.0.0edgit tag create prompts/validation v2.1.0edgit push --tags# 2. Deploy to stagingedgit tag set prompts/extraction staging v1.0.0edgit tag set prompts/validation staging v2.1.0edgit push --tags --force# 3. Test in staging# ... run tests ...# 4. Promote to productionedgit tag set prompts/extraction production v1.0.0edgit tag set prompts/validation production v2.1.0edgit push --tags --force
GitHub Actions sees tags and deploys them. Edgit just creates the tags.
import { versionedAgent, createEnsemble, step } from '@ensemble-edge/conductor'// Use versionedAgent for version-pinned agent referencesconst analyzer = versionedAgent('analyzer', '1.0.0', { config: { model: 'claude-sonnet-4' }})const scorer = versionedAgent('scorer', '2.1.0')// Convert to flow steps in your ensembleconst companyIntel = createEnsemble('company-intel') .addStep(step('analyze').agent(analyzer.path).config(analyzer.agentConfig || {})) .addStep(step('score').agent(scorer.path)) .build()export default companyIntel
ensemble: company-intelagents: - name: analyzer operation: think component: extraction-prompt@v1.0.0 # Locked to v1.0.0 config: model: claude-sonnet-4 - name: scorer operation: think component: validation-prompt@v2.1.0 # Different version
Benefits:
Predictable behavior (won’t break on updates)
Can A/B test different versions
Easy rollback (just change the version)
For TypeScript ensembles, see the Version Primitives documentation for complete API reference including versionedAgent(), versionedEnsemble(), and deploymentRef().
# Create version tagsedgit tag create agents/scraper v1.0.0edgit tag create agents/scraper v1.5.0edgit push --tags# Set environmentedgit tag set agents/scraper staging v1.5.0edgit push --tags --force
# Create version tagsedgit tag create ensembles/data-pipeline v1.0.0edgit tag create ensembles/data-pipeline v1.1.0edgit push --tags# Set environmentedgit tag set ensembles/data-pipeline staging v1.1.0edgit push --tags --force
# Create version tagsedgit tag create ensembles/scraping-workflow v1.0.0edgit tag create ensembles/scraping-workflow v1.5.0edgit push --tags# Set environmentedgit tag set ensembles/scraping-workflow production v1.5.0edgit push --tags --force
# Week 1: Test new prompt with stable agentedgit tag create prompts/analysis v2.0.0edgit tag set prompts/analysis staging v2.0.0edgit push --tags --force# Deploy: analyzer@v1.0.0 + analysis-prompt@v2.0.0# Week 2: New prompt works! Now test new agent with old promptedgit tag create agents/analyzer v2.0.0edgit tag set agents/analyzer staging v2.0.0edgit push --tags --force# Deploy: analyzer@v2.0.0 + analysis-prompt@v1.0.0# Week 3: Both work individually. Test together# Deploy: analyzer@v2.0.0 + analysis-prompt@v2.0.0# Week 4: All good! Promote to productionedgit tag set agents/analyzer production v2.0.0edgit tag set prompts/analysis production v2.0.0edgit push --tags --force
You de-risked the rollout by testing each change independently.
# 1. Create feature branchgit checkout -b feature/better-extraction# 2. Modify componentvim components/prompts/extraction.md# 3. Test locally (no version yet)ensemble conductor dev# 4. Merge to maingit checkout maingit merge feature/better-extraction# 5. Version after merge (via CI or manually)edgit tag create prompts/extraction v1.1.0edgit push --tags# 6. Deploy to stagingedgit tag set prompts/extraction staging v1.1.0edgit push --tags --force# 7. Test in stagingcurl https://staging.example.com/test# 8. Promote to productionedgit tag set prompts/extraction production v1.1.0edgit push --tags --force
# List all tags for a componentgit tag | grep "components/prompts/extraction"# Output:# components/prompts/extraction/v1.0.0# components/prompts/extraction/v1.0.1# components/prompts/extraction/v1.1.0# components/prompts/extraction/staging# components/prompts/extraction/production# List all logic tagsgit tag | grep "logic/agents"
# See what changed in a versiongit show components/prompts/extraction/v1.1.0# Compare two versionsgit diff components/prompts/extraction/v1.0.0 components/prompts/extraction/v1.1.0# View commit messagegit show components/prompts/extraction/v1.1.0 --format=%B --no-patch
# Don'tedgit tag create prompts/my-prompt v1.0.0 # Before testing# Doensemble conductor dev # Test locally firstedgit tag create prompts/my-prompt v1.0.0 # Version after confirming it works
# Don'tedgit tag create prompts/my-prompt v1.0.1 # Major change labeled as patch# Doedgit tag create prompts/my-prompt v2.0.0 # Breaking change = major bump
# Don'tedgit tag create prompts/my-prompt v2.0.0 -m "Update prompt"# Doedgit tag create prompts/my-prompt v2.0.0 -m "BREAKING: Changed output format from JSON to CSV"
# Error: components/prompts/my-prompt/v1.0.0 not found# Check if tag existsgit tag | grep "components/prompts/my-prompt"# Check prefix (components vs logic)git tag | grep "my-prompt"
# Error: Tag already exists# Check existing taggit show components/prompts/my-prompt/v1.0.0# Use force to overwrite (careful!)edgit tag create prompts/my-prompt v1.0.0 --forceedgit push --tags --force