Migration tool and delegation platform for extracting bounded slices from legacy systems with minimal coupling. Built on SUMD + DOQL + testql + taskfile ecosystem.
Package-level operational guide: see protogate/README.md.
c2004 owns (c2004-first):
- Contracts (Protobuf)
- Generators and schema registry
- Commands & Queries (CQRS) handlers
- Migration discovery and planning artifacts
- Shell, navigation, auth/session bridge, iframe routing
protogate owns:
- Delegation/execution tooling layer
- Runtime bridge for invoking migration tooling from c2004
- Gateway runtime and health endpoints
protogate is not the source-of-truth for migration contracts, discovery logic, or planning artifacts.
Each delegated module follows a vertical-slice template:
contracts/{slice}/v1/- Protobuf contractsgateway/{slice}_handler.py- Command/query handlers- Event store + read model adapters
- Frontend assets in
gateway/static/ - Smoke tests & health endpoints
# Install protogate CLI
pip install -e .
# Generate all artifacts from contracts
protogate generate all
# Run specific generator
protogate generate python
protogate generate zod
# Schema registry operations
protogate registry check contracts/user/v1/user.proto
protogate registry list
# Run gateway
protogate gateway
# Run full CI pipeline
protogate ci# Install dependencies
pip install -r requirements.txt
# Run gateway (development mode)
make gateway
# Run full CI pipeline
make ci| Method | Endpoint | Description |
|---|---|---|
| GET | /health |
Platform health + module aggregation |
| GET | /health/modules |
All delegated slices status |
| GET | /health/modules/{slice} |
Specific slice health |
| GET | /delegation/slices |
List all delegated slices |
| GET | /delegation/slices/{slice} |
Slice details & metadata |
| Method | Endpoint | Description |
|---|---|---|
| POST | /commands/user/create |
Create user |
| POST | /commands/user/dual-create |
Dual-write with idempotency |
| POST | /commands/user/{id}/change-email |
Change email |
| POST | /commands/user/{id}/deactivate |
Deactivate user |
| GET | /queries/user/{id} |
Get user state |
| GET | /events |
Event stream |
| Method | Endpoint | Description |
|---|---|---|
| POST | /commands/search/index |
Index entry |
| GET | /queries/search?q={query} |
Full-text search |
The project provides multiple code generators from Protobuf contracts:
| Target | Description |
|---|---|
make proto |
Generate gRPC stubs via buf (requires buf CLI) |
make zod |
Generate TypeScript Zod schemas |
make python |
Generate Pydantic Python models |
make json |
Generate JSON Schema (draft-07) |
make sql |
Generate SQL DDL |
make proto-all |
Run all generators (proto + zod + python + json + sql) |
make proto-changed |
Detect changed proto files against main branch |
make generate-incremental |
Incremental regeneration (only changed proto files) |
make clean |
Remove all generated artifacts |
Manage schema versions and compatibility:
| Target | Description |
|---|---|
make registry-register |
Register proto file in schema registry |
make registry-check |
Check compatibility without registering |
make registry-list |
List all schemas in registry |
Legacy schema migration and synchronization:
| Target | Description |
|---|---|
make legacy-register |
Register legacy JSON schema + proto mapping |
make diff-legacy |
Diff legacy vs proto schemas |
make legacy-report |
Generate detailed migration report |
make legacy-list |
List all legacy schemas |
make sync-check |
Full sync check (fails if readiness < 1.0) |
make bootstrap-legacy |
Bootstrap EventStore from legacy DB |
| Target | Description |
|---|---|
make ci |
Full CI: lint β generate β test β registry check |
protogate codegen registry cross-checks CQRS contract JSON files
(*.command.json, *.query.json, *.event.json) against Pydantic
Literal[...] annotations found in layers.python. It catches the
drift class that broke ADR-012 Wave 2 in c2004, where a server could
return an enum value the contract did not advertise, crashing the
client decoder.
# 1. Report-only gate (CI default)
protogate codegen registry contracts/ --check --cross-check-pydantic
# 2. Auto-fix warnings (safe; touches JSON only)
protogate codegen registry contracts/ --cross-check-pydantic --fix-safe
# 3. Auto-fix warnings + expand output enums (opt-in; may bless server bugs)
protogate codegen registry contracts/ --cross-check-pydantic --fix-safe --auto-expand-output| Direction | Rule | Verdict |
|---|---|---|
output/payload |
pydantic β contract |
compatible |
output/payload |
pydantic β contract |
error β client may crash on undeclared value |
output/payload |
contract β pydantic |
warning β dead code paths on client |
input |
contract β pydantic |
compatible |
input |
contract β pydantic |
error β server rejects valid-per-contract input (HTTP 422) |
input |
pydantic β contract |
compatible (intentional API restriction) |
Pydantic source is never modified; all fixes apply to contract JSON only. Input-direction errors are never auto-fixed (require human decision between narrowing the contract or loosening Pydantic).
See docs/contract-cross-check.md for the full reference, the c2004 Makefile integration, and the Wave 2 post-mortem that motivated the feature.
-
Generate candidate report in c2004 (
detect_migration_candidates.py) -
Generate delegation plan in protogate:
python scripts/legacy_bridge/generate_delegation_plan.py \ --input /path/to/c2004/module-candidates.json \ --clusters /path/to/c2004/cqrs-pattern-clusters.json \ --output-dir docs
-
(Recommended) Run full discovery pipeline in protogate:
python scripts/legacy_bridge/run_arch_migration_discovery.py \ --repo-root /path/to/c2004 \ --output-dir reports/migration-discovery \ --delegation-limit 30
-
Pick top module from Phase-1
-
Implement full vertical slice in protogate
-
Switch c2004 route to iframe host
-
Validate parity & archive legacy
protogate/
βββ contracts/ # Protobuf contracts per slice
β βββ user/v{1,2}/
β βββ search/v1/
β βββ legacy_bridge/
βββ gateway/ # FastAPI gateway
β βββ main.py # Entry point & routes
β βββ delegation.py # Slice registry & health
β βββ user_handler.py # User CQRS handlers
β βββ search_handler.py # Search CQRS handlers
β βββ static/ # Delegated UI assets
βββ adapters/ # Legacy β Proto adapters
βββ scripts/ # Code generation & migration
β βββ generate_zod.py # TypeScript Zod generator
β βββ generate_pydantic.py # Python Pydantic generator
β βββ generate_json_schema.py # JSON Schema generator
β βββ generate_sql.py # SQL DDL generator
β βββ generate_incremental.py # Incremental regeneration
β βββ schema_registry.py # Proto schema registry
β βββ legacy_registry.py # Legacy schema registry
β βββ event_store.py # CQRS event store
β βββ conflict_resolver.py # Event conflict resolution
β βββ dual_writer.py # Dual-write pattern
β βββ idempotency_store.py # Idempotency tracking
β βββ vector_clock.py # Vector clock for ordering
β βββ legacy_bridge/ # Migration tooling
β βββ run_arch_migration_discovery.py # Full orchestrator
β βββ detect_migration_candidates.py # Module scoring
β βββ analyze_service_boundaries.py # Frontend/backend analysis
β βββ detect_cqrs_pattern_clusters.py # CQRS pattern detection
β βββ generate_migration_wave_plan.py # Wave planning
β βββ delegation_plan.py # Delegation plan logic
β βββ generate_delegation_plan.py # Plan generator
β βββ migrator.py # Legacy to EventStore migration
β βββ sync_check.py # Sync validation
β βββ diff_engine.py # Schema diffing
βββ tests/ # Test suite
βββ docs/ # Generated plans
βββ delegation-plan.generated.json
βββ delegation-plan.generated.md
- Zod Generator (
scripts/generate_zod.py): TypeScript runtime validation schemas - Pydantic Generator (
scripts/generate_pydantic.py): Python data models - JSON Schema Generator (
scripts/generate_json_schema.py): Draft-07 JSON schemas - SQL Generator (
scripts/generate_sql.py): Database DDL - Incremental Generator (
scripts/generate_incremental.py): Regenerate only changed proto files
SQLite-backed schema registry with compatibility enforcement (scripts/schema_registry.py):
- Register schema versions with SHA256 hashing
- Check backward/forward compatibility
- List all registered schemas
- Prevent breaking changes
Comprehensive migration tooling for legacy systems:
- Migration Discovery Orchestrator: Full pipeline profiling, candidate detection, service boundary analysis, CQRS pattern clustering, and delegation planning
- Migration Candidate Detection: Score modules by extraction suitability, identify service boundaries
- Service Boundary Analysis: Frontend module detection, backend route grouping, iframe suitability assessment
- CQRS Pattern Clustering: Classify modules by command/event patterns (data-grid, reports, manager, config)
- Migration Wave Planning: Generate phased extraction plans with effort estimation
- Legacy Schema Registry: Track legacy JSON schemas and proto mappings
- Diff Engine: Compare legacy vs proto schemas for compatibility
- Migrator: Bootstrap EventStore from legacy databases
- Sync Check: Validate legacy-proto synchronization readiness
- Event Store (
scripts/event_store.py): Append-only event store with SQLite, optimistic concurrency, snapshots, stream merging - Conflict Resolver (
scripts/conflict_resolver.py): Last-Write-Wins and merge strategies for concurrent events - Vector Clock (
scripts/vector_clock.py): Causal ordering and conflict detection - Dual Writer (
scripts/dual_writer.py): Dual-write pattern for legacy migration - Idempotency Store (
scripts/idempotency_store.py): Prevent duplicate command processing
Runtime model for slice metadata in gateway/delegation.py:
DelegatedSlice(
name="search",
phase="phase-1", # phase-1 | phase-2 | live
backend="delegated",
frontend="static", # none | static | planned
contract_paths=("contracts/search/v1/search.proto",),
command_routes=("/commands/search/index",),
query_routes=("/queries/search",),
smoke_checks=("/health", "/queries/search?q=test"),
)Per-slice health validates:
- Contract files exist
- Read model assets present
- Frontend assets (if required)
Returns ok or degraded with missing requirements listed.
# Build and run all services
docker-compose up
# Services:
# - generator: Proto code generation
# - gateway: FastAPI gateway (port 8080)# Build gateway image
docker build -f gateway/Dockerfile -t semcod-gateway .
# Run gateway container
docker run --rm -p 8080:8080 semcod-gatewayOr use Makefile:
make gateway-docker| Variable | Default | Description |
|---|---|---|
OPENROUTER_API_KEY |
*(not set)* |
OpenRouter API key (https://openrouter.ai/keys) |
LLM_MODEL |
openrouter/qwen/qwen3-coder-next |
LLM model for AI-assisted features |
PFIX_AUTO_APPLY |
true |
Apply fixes without asking |
PFIX_AUTO_INSTALL_DEPS |
true |
Auto pip/uv install dependencies |
PFIX_AUTO_RESTART |
false |
Restart after fix |
PFIX_MAX_RETRIES |
3 |
Max retry attempts |
PFIX_ENABLED |
true |
Enable auto-fix features |
PFIX_GIT_COMMIT |
false |
Auto-commit fixes |
PFIX_GIT_PREFIX |
pfix: |
Commit message prefix |
Auto-generated API smoke tests in testql-scenarios/generated-api-smoke.testql.toon.yaml:
- Health checks
- Delegation slice endpoints
- Command/query endpoints
- Event streaming
# Run all tests
pytest tests/ -v
# Run specific test
pytest tests/test_event_store.py -v- Versioning: Semantic versioning (semver)
- Commits: Conventional commits with scope=
protogate - Changelog: Keep-a-changelog format
- Build strategies: Python, Node.js, Rust
- Version files:
VERSION, generated package versions
- π€ LLM usage: $5.4000 (36 commits)
- π€ Human dev: ~$1623 (16.2h @ $100/h, 30min dedup)
Generated on 2026-04-26 using openrouter/qwen/qwen3-coder-next
Licensed under Apache-2.0.
Last updated by taskill at 2026-04-25 13:43 UTC
| Metric | Value |
|---|---|
| HEAD | 3d1c764 |
| Coverage | β |
| Failing tests | β |
| Commits in last cycle | 40 |
Various tests, docs, and refactors plus new features for codegen/registry and protogate CLI. Additions include directional subset checks, a --cross-check-pydantic flag, migration-analysis CLI commands, and schema registry improvements (conflict resolution, vector clocks, v2 proto).