SpecBuilder Code Generation & AST Optimization Architecture
1. Executive Summary & Design Rationale
The ZQK SpecBuilder pipeline compiles declarative schema specifications (.zqk/specs/) into high-performance, strongly-typed Go builders, validators, and domain enumerations.
Early code generation architectures generated discrete micro-packages for every schema entity and status type (e.g. bldr_enum_v1/shared_agent_instructions, bldr_enum_v1/policies, bldr_enum_v1/roles). While conceptually decoupled, this granular strategy introduced severe compiler and runtime overhead:
- Compiler Symbol Table Inflation: Hundreds of micro-packages saturated the Go compiler's package graph, resulting in excessive AST allocations, slow type-checking passes, and lengthened CI compilation times.
- Epistemic Divergence: Having separate micro-packages for every status created dual sources of truth against canonical strings declared in
pkg/objects. - Namespace Duplication: Divergent singular and plural packages emerged without clean boundary definitions.
To solve this, ZQK adopts a Consolidated Domain Architecture for generated enums, builders, and AST pruning, maintaining zero runtime overhead while enforcing strict compile-time type safety.
2. Domain Partitioning Architecture
Rather than generating an isolated package for every entity or schema kind, code generation groups enums into cohesive, domain-scoped packages under pkg/specbuilder/bldr_enum_v1/:
graph TD
Specs[".zqk/specs/ Object & Lifecycle Metaschemas"] --> Generator["SpecBuilder Generator Pipeline"]
Generator --> KernelDomain["pkg/specbuilder/bldr_enum_v1/domain_kernel"]
Generator --> PlatformDomain["pkg/specbuilder/bldr_enum_v1/domain_platform"]
Generator --> WorkDomain["pkg/specbuilder/bldr_enum_v1/domain_work"]
KernelDomain --> KD1["Lifecycle Planes (Draft, Promoted)"]
KernelDomain --> KD2["Priority Tiers (P0 - P3)"]
KernelDomain --> KD3["Account & Session Lifecycles"]
PlatformDomain --> PD1["Audit & Telemetry Statuses"]
PlatformDomain --> PD2["Policy & Rule Governance"]
PlatformDomain --> PD3["Scheduler Job States"]
Core Domain Groupings:
-
domain_kernel: Houses core kernel lifecycle, state, priority, and session enums: -
PlaneDraft,PlanePromoted PriorityTierP0throughPriorityTierP3AccountStatusActive,AccountStatusSuspendedSessionStatusActive,SessionStatusArchived,SessionStatusCompleted-
domain_platform: Houses platform operational, governance, and audit enums: -
AuditStatusActive,AuditStatusArchived PolicyStatusActive,PolicyStatusInactiveRuleStatusImplemented,RuleStatusDraftSchedulerJobStatusActive,SchedulerJobStatusPending
Each domain package exports strongly-typed enums backed by primitive Go types (string), annotated with serialization helpers and validated against canonical definitions in pkg/objects.
3. AST Pruning & Architectural Guardrails
To prevent package bloat from recurring, automated verification in pkg/testkit/enum_consolidation_test.go enforces structural ceilings on generated packages:
// Enforces a strict ceiling on bldr_enum_v1 directory count.
func TestEnumConsolidation_DirectoryCount_StaticFloor(t *testing.T) {
...
assert.LessOrEqual(t, dirCount, 140, "bldr_enum_v1 package count must not exceed static ceiling")
}
Fail-Closed Validation Invariant
All domain enums implement fail-closed boundary checking. Any unmapped or unrecognized status string coerced to a domain enum type is rejected by validation assertions, preventing silent data corruption across subsystem boundaries:
func TestEnumConsolidation_InvalidEnumRejection_NegativeBoundary(t *testing.T) {
...
for _, invalid := range invalidStatuses {
coerced := domain_kernel.ZqkSessionStatus(invalid)
assert.False(t, validSessionStatuses[coerced], "invalid status %q must be rejected by domain enum validator", invalid)
}
}
4. Migration & Evolution Principles
- Cohesive Domain Boundaries: New schema enums must be mapped into their existing domain package (
domain_kernel,domain_platform, or domain-specific packs) rather than creating new standalone micro-packages. - Canonical Correspondence: All enum string literals must correspond 1:1 with lifecycle definitions in
.zqk/specs/lifecycles/and object metaschemas in.zqk/specs/objects/. - Continuous AST Compaction: Builders and enum sets must be verified against
make lintandzqk-vetto prevent code duplication or unnecessary symbol exports.