Spec Builders (bldr_v2)
Status: Active
Last Updated: 2026-01-27
Package: github.com/zqk-os/zqk/pkg/specbuilder/bldr_v2
Overview
This package contains generated spec builders for system object types. All files in this directory are automatically generated from YAML object specifications located in .zqk/specs/objects/.
⚠️ IMPORTANT: DO NOT EDIT FILES IN THIS DIRECTORY MANUALLY
All changes must be made to the YAML spec files, then regenerated using:
zqk system generate-instance-builders --overwrite
Architecture
This package follows the spec-driven builder pattern:
YAML Specs (.zqk/specs/objects/*.yaml)
↓
Codegen (pkg/specbuilder/builders/codegen.go)
↓
Generated Builders (this package)
↓
Runtime Usage (pkg/objects, pkg/storage, etc.)
Generated Files
Each object type has a corresponding builder file:
{ontology}_builder.go- Generated builder structs that extendBaseSpecBuilder{ontology}_constants.go- Generated field name constants for type-safe field access- Functions follow the pattern:
New{Ontology}Builder() *{Ontology}Builder
Builder Pattern
All builders extend BaseSpecBuilder from pkg/specbuilder/builders/:
type BacklogItemBuilder struct {
*builders.BaseSpecBuilder
}
func NewBacklogItemBuilder() *BacklogItemBuilder {
builder := &BacklogItemBuilder{
BaseSpecBuilder: builders.NewBaseSpecBuilder("backlog_item", "v2_0_0"),
}
// Configure spec...
return builder
}
Field Constants
Each builder has a corresponding constants file for type-safe field access:
// From backlog_item_constants.go
const (
FieldID = "id"
FieldTitle = "title"
FieldStatus = "status"
// ...
)
Persisted object maps (CAS YAML, map[string]any): prefer pkg/objects FieldKey* from field_keys.go (zqk system generate-field-keys). That is the single, spec-union namespace for field names. Per-kind *_constants.go names here differ only because this package is flat (Go symbol collisions); they are for builders and spec tooling, not the canonical key for cross-kind storage code.
Use bldr_v2 per-kind constants when working inside the generated builder for that ontology; use objects.FieldKey* when reading/writing stored instances by field name.
Inheritance and Traits
Builders support:
- Inheritance:
SetExtends("base_object")- Inherit fields from parent specs - Traits:
AddTrait("listable")- Add trait-based functionality - Schema Versioning: Each builder targets a specific schema version (e.g.,
v2_0_0)
Integration Points
With CLI Command Builders
The CLI command builder system (pkg/cli/bldr_cli_cmd_v1/) references traits from this system:
# .zqk/cli/specs/list_command.yaml
required_traits:
- listable # References trait from pkg/specbuilder/bldr_trait_v1/
With Object System
Builders generate *objects.Spec instances that are used by:
pkg/objects- Object type systempkg/storage- Storage backendspkg/validation- Validation system
Build Process
The Makefile automatically regenerates these builders before each build:
codegen:
go run ./cmd/zqk system generate-instance-builders --overwrite
This ensures generated code is always up-to-date.
Related Documentation
- Specbuilder Package README - Overview of the specbuilder package
- Builders README - Base builder implementation
- CLI Command Taxonomy Standards - Canonical CLI architecture and taxonomy standards
- Object Specs Documentation - Spec file format reference
Versioning
The v2 suffix indicates this is version 2 of the spec builder system. Version 1 (bldr_v1/) may still exist for backward compatibility. Future breaking changes would result in bldr_v3/, maintaining immutable version history.
Constants Files
Some builders may have empty constants files (e.g., list_metric_sampler_constants.go) when all fields are inherited from parent specs. This is expected and normal - inherited fields are accessible via the parent spec's constants.