Generate contract types, pin fixtures to spec, add build and ADRs
Some checks failed
ci / build (push) Failing after 1m6s
Some checks failed
ci / build (push) Failing after 1m6s
Completes FLUID-WP-0002. The record types in internal/contract are generated from schemas/ by a dependency-free generator; fixtures transcribed from the spec's worked examples validate against those schemas and round-trip through the generated types with DisallowUnknownFields, so a spec change that misses the schemas fails CI rather than drifting silently. Adds identifier prefix helpers, Makefile, GitHub Actions, and five ADRs recording the Go choice, out-of-process attachment, the wire contract as boundary, the evidence store, and revision identity. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014KmVxhJ35tCo7rE7UnLwWu Assistant: claude-code Assistant-Model: opus Assistant-Process: 1116572@bnt-lap001 Assistant-Session: 8ba9bb93-a72a-4883-b189-2499cce5c400
This commit is contained in:
parent
fbbf56df7a
commit
76912adef8
44 changed files with 4010 additions and 7 deletions
314
internal/contract/revision_gen.go
Normal file
314
internal/contract/revision_gen.go
Normal file
|
|
@ -0,0 +1,314 @@
|
|||
// Code generated by tools/schemagen. DO NOT EDIT.
|
||||
// Source: schemas/. Regenerate with `make generate`.
|
||||
|
||||
package contract
|
||||
|
||||
// Adoption is evidence, not proof of quality (FluidAPIStandards.md section 32).
|
||||
type FluidRevisionAdoption struct {
|
||||
ActiveConsumers *int64 `json:"active_consumers,omitempty" yaml:"active_consumers,omitempty"`
|
||||
AdoptionRate *UnitInterval `json:"adoption_rate,omitempty" yaml:"adoption_rate,omitempty"`
|
||||
EligibleConsumers *int64 `json:"eligible_consumers,omitempty" yaml:"eligible_consumers,omitempty"`
|
||||
RetainedAdoptionRate *UnitInterval `json:"retained_adoption_rate,omitempty" yaml:"retained_adoption_rate,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionAudit struct {
|
||||
ImmutableEventRefs []EventID `json:"immutable_event_refs,omitempty" yaml:"immutable_event_refs,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionCompatibilityClass string
|
||||
|
||||
const (
|
||||
FluidRevisionCompatibilityClassBACKWARDCOMPATIBLE FluidRevisionCompatibilityClass = "BACKWARD_COMPATIBLE"
|
||||
FluidRevisionCompatibilityClassFORWARDCOMPATIBLE FluidRevisionCompatibilityClass = "FORWARD_COMPATIBLE"
|
||||
FluidRevisionCompatibilityClassADDITIVE FluidRevisionCompatibilityClass = "ADDITIVE"
|
||||
FluidRevisionCompatibilityClassBEHAVIORALCHANGE FluidRevisionCompatibilityClass = "BEHAVIORAL_CHANGE"
|
||||
FluidRevisionCompatibilityClassBREAKING FluidRevisionCompatibilityClass = "BREAKING"
|
||||
FluidRevisionCompatibilityClassMIGRATIONONLY FluidRevisionCompatibilityClass = "MIGRATION_ONLY"
|
||||
FluidRevisionCompatibilityClassINTERNALONLY FluidRevisionCompatibilityClass = "INTERNAL_ONLY"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionCompatibilityClass.
|
||||
func (v FluidRevisionCompatibilityClass) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionCompatibilityClassBACKWARDCOMPATIBLE, FluidRevisionCompatibilityClassFORWARDCOMPATIBLE, FluidRevisionCompatibilityClassADDITIVE, FluidRevisionCompatibilityClassBEHAVIORALCHANGE, FluidRevisionCompatibilityClassBREAKING, FluidRevisionCompatibilityClassMIGRATIONONLY, FluidRevisionCompatibilityClassINTERNALONLY:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type FluidRevisionCompatibility struct {
|
||||
BreakingChanges []string `json:"breaking_changes,omitempty" yaml:"breaking_changes,omitempty"`
|
||||
Class FluidRevisionCompatibilityClass `json:"class" yaml:"class"`
|
||||
CompatibilityEvidenceRefs []EvidenceRef `json:"compatibility_evidence_refs,omitempty" yaml:"compatibility_evidence_refs,omitempty"`
|
||||
Deprecations []string `json:"deprecations,omitempty" yaml:"deprecations,omitempty"`
|
||||
Supersedes []RevisionID `json:"supersedes,omitempty" yaml:"supersedes,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionComplexityBudgetStatus string
|
||||
|
||||
const (
|
||||
FluidRevisionComplexityBudgetStatusWITHINBUDGET FluidRevisionComplexityBudgetStatus = "WITHIN_BUDGET"
|
||||
FluidRevisionComplexityBudgetStatusATBUDGET FluidRevisionComplexityBudgetStatus = "AT_BUDGET"
|
||||
FluidRevisionComplexityBudgetStatusOVERBUDGET FluidRevisionComplexityBudgetStatus = "OVER_BUDGET"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionComplexityBudgetStatus.
|
||||
func (v FluidRevisionComplexityBudgetStatus) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionComplexityBudgetStatusWITHINBUDGET, FluidRevisionComplexityBudgetStatusATBUDGET, FluidRevisionComplexityBudgetStatusOVERBUDGET:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type FluidRevisionComplexity struct {
|
||||
After *ComplexityDelta `json:"after,omitempty" yaml:"after,omitempty"`
|
||||
Before *ComplexityDelta `json:"before,omitempty" yaml:"before,omitempty"`
|
||||
BudgetStatus *FluidRevisionComplexityBudgetStatus `json:"budget_status,omitempty" yaml:"budget_status,omitempty"`
|
||||
DeltaScore *float64 `json:"delta_score,omitempty" yaml:"delta_score,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionContractType string
|
||||
|
||||
const (
|
||||
FluidRevisionContractTypeOpenapi FluidRevisionContractType = "openapi"
|
||||
FluidRevisionContractTypeGraphql FluidRevisionContractType = "graphql"
|
||||
FluidRevisionContractTypeProtobuf FluidRevisionContractType = "protobuf"
|
||||
FluidRevisionContractTypeAsyncapi FluidRevisionContractType = "asyncapi"
|
||||
FluidRevisionContractTypeJsonschema FluidRevisionContractType = "jsonschema"
|
||||
FluidRevisionContractTypeCustom FluidRevisionContractType = "custom"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionContractType.
|
||||
func (v FluidRevisionContractType) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionContractTypeOpenapi, FluidRevisionContractTypeGraphql, FluidRevisionContractTypeProtobuf, FluidRevisionContractTypeAsyncapi, FluidRevisionContractTypeJsonschema, FluidRevisionContractTypeCustom:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type FluidRevisionContract struct {
|
||||
ArtifactRef ArtifactRef `json:"artifact_ref" yaml:"artifact_ref"`
|
||||
Digest Digest `json:"digest" yaml:"digest"`
|
||||
Type FluidRevisionContractType `json:"type" yaml:"type"`
|
||||
Version string `json:"version,omitempty" yaml:"version,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionDeploymentCurrentExposure struct {
|
||||
Cohorts []CohortID `json:"cohorts,omitempty" yaml:"cohorts,omitempty"`
|
||||
TrafficShare *UnitInterval `json:"traffic_share,omitempty" yaml:"traffic_share,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionDeploymentEnvironmentsItem struct {
|
||||
Name string `json:"name" yaml:"name"`
|
||||
RoutingPolicyRef string `json:"routing_policy_ref,omitempty" yaml:"routing_policy_ref,omitempty"`
|
||||
StartedAt *Timestamp `json:"started_at,omitempty" yaml:"started_at,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionDeployment struct {
|
||||
CurrentExposure *FluidRevisionDeploymentCurrentExposure `json:"current_exposure,omitempty" yaml:"current_exposure,omitempty"`
|
||||
Environments []FluidRevisionDeploymentEnvironmentsItem `json:"environments,omitempty" yaml:"environments,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionEconomics struct {
|
||||
BuildCost *float64 `json:"build_cost,omitempty" yaml:"build_cost,omitempty"`
|
||||
Currency string `json:"currency,omitempty" yaml:"currency,omitempty"`
|
||||
ExperimentCostToDate *float64 `json:"experiment_cost_to_date,omitempty" yaml:"experiment_cost_to_date,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionFitnessMetricsValue struct {
|
||||
Baseline *float64 `json:"baseline,omitempty" yaml:"baseline,omitempty"`
|
||||
Current *float64 `json:"current,omitempty" yaml:"current,omitempty"`
|
||||
Guardrail *float64 `json:"guardrail,omitempty" yaml:"guardrail,omitempty"`
|
||||
Target *float64 `json:"target,omitempty" yaml:"target,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionFitness struct {
|
||||
BaselineRevision *RevisionID `json:"baseline_revision,omitempty" yaml:"baseline_revision,omitempty"`
|
||||
MeasurementWindow *ObservationWindow `json:"measurement_window,omitempty" yaml:"measurement_window,omitempty"`
|
||||
Metrics map[string]FluidRevisionFitnessMetricsValue `json:"metrics,omitempty" yaml:"metrics,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionImplementation struct {
|
||||
ArtifactRef ArtifactRef `json:"artifact_ref" yaml:"artifact_ref"`
|
||||
BuildRef string `json:"build_ref,omitempty" yaml:"build_ref,omitempty"`
|
||||
Digest Digest `json:"digest" yaml:"digest"`
|
||||
SourceRef string `json:"source_ref,omitempty" yaml:"source_ref,omitempty"`
|
||||
}
|
||||
|
||||
// Every revision is governed by a specific intent version, so audit can ask whether
|
||||
// the change was valid under the intent that existed at the time
|
||||
// (ArchitectureBlueprint.md section 27).
|
||||
type FluidRevisionInterfaceEvolutionIntent struct {
|
||||
ArtifactRef *ArtifactRef `json:"artifact_ref,omitempty" yaml:"artifact_ref,omitempty"`
|
||||
Version string `json:"version" yaml:"version"`
|
||||
}
|
||||
|
||||
type FluidRevisionPromotionRecommendedState string
|
||||
|
||||
const (
|
||||
FluidRevisionPromotionRecommendedStateCREATED FluidRevisionPromotionRecommendedState = "CREATED"
|
||||
FluidRevisionPromotionRecommendedStateVERIFIED FluidRevisionPromotionRecommendedState = "VERIFIED"
|
||||
FluidRevisionPromotionRecommendedStateEXPERIMENT FluidRevisionPromotionRecommendedState = "EXPERIMENT"
|
||||
FluidRevisionPromotionRecommendedStateCANDIDATE FluidRevisionPromotionRecommendedState = "CANDIDATE"
|
||||
FluidRevisionPromotionRecommendedStateSTABLE FluidRevisionPromotionRecommendedState = "STABLE"
|
||||
FluidRevisionPromotionRecommendedStateDEPRECATED FluidRevisionPromotionRecommendedState = "DEPRECATED"
|
||||
FluidRevisionPromotionRecommendedStateRETIRED FluidRevisionPromotionRecommendedState = "RETIRED"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionPromotionRecommendedState.
|
||||
func (v FluidRevisionPromotionRecommendedState) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionPromotionRecommendedStateCREATED, FluidRevisionPromotionRecommendedStateVERIFIED, FluidRevisionPromotionRecommendedStateEXPERIMENT, FluidRevisionPromotionRecommendedStateCANDIDATE, FluidRevisionPromotionRecommendedStateSTABLE, FluidRevisionPromotionRecommendedStateDEPRECATED, FluidRevisionPromotionRecommendedStateRETIRED:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type FluidRevisionPromotion struct {
|
||||
AuthorizedAt *Timestamp `json:"authorized_at,omitempty" yaml:"authorized_at,omitempty"`
|
||||
AuthorizedBy *Actor `json:"authorized_by,omitempty" yaml:"authorized_by,omitempty"`
|
||||
Eligible *bool `json:"eligible,omitempty" yaml:"eligible,omitempty"`
|
||||
RecommendationReason *string `json:"recommendation_reason,omitempty" yaml:"recommendation_reason,omitempty"`
|
||||
RecommendedState *FluidRevisionPromotionRecommendedState `json:"recommended_state,omitempty" yaml:"recommended_state,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionProvenance struct {
|
||||
DecisionRefs []DecisionID `json:"decision_refs,omitempty" yaml:"decision_refs,omitempty"`
|
||||
ExperimentRefs []ExperimentID `json:"experiment_refs,omitempty" yaml:"experiment_refs,omitempty"`
|
||||
TelemetryRefs []EvidenceRef `json:"telemetry_refs,omitempty" yaml:"telemetry_refs,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionRollback struct {
|
||||
ProcedureRef string `json:"procedure_ref,omitempty" yaml:"procedure_ref,omitempty"`
|
||||
Supported bool `json:"supported" yaml:"supported"`
|
||||
TargetRevision *RevisionID `json:"target_revision,omitempty" yaml:"target_revision,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevisionState string
|
||||
|
||||
const (
|
||||
FluidRevisionStateCREATED FluidRevisionState = "CREATED"
|
||||
FluidRevisionStateVERIFIED FluidRevisionState = "VERIFIED"
|
||||
FluidRevisionStateEXPERIMENT FluidRevisionState = "EXPERIMENT"
|
||||
FluidRevisionStateCANDIDATE FluidRevisionState = "CANDIDATE"
|
||||
FluidRevisionStateSTABLE FluidRevisionState = "STABLE"
|
||||
FluidRevisionStateDEPRECATED FluidRevisionState = "DEPRECATED"
|
||||
FluidRevisionStateRETIRED FluidRevisionState = "RETIRED"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionState.
|
||||
func (v FluidRevisionState) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionStateCREATED, FluidRevisionStateVERIFIED, FluidRevisionStateEXPERIMENT, FluidRevisionStateCANDIDATE, FluidRevisionStateSTABLE, FluidRevisionStateDEPRECATED, FluidRevisionStateRETIRED:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type FluidRevisionVerificationPolicyCheck string
|
||||
|
||||
const (
|
||||
FluidRevisionVerificationPolicyCheckPENDING FluidRevisionVerificationPolicyCheck = "PENDING"
|
||||
FluidRevisionVerificationPolicyCheckPASSED FluidRevisionVerificationPolicyCheck = "PASSED"
|
||||
FluidRevisionVerificationPolicyCheckFAILED FluidRevisionVerificationPolicyCheck = "FAILED"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionVerificationPolicyCheck.
|
||||
func (v FluidRevisionVerificationPolicyCheck) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionVerificationPolicyCheckPENDING, FluidRevisionVerificationPolicyCheckPASSED, FluidRevisionVerificationPolicyCheckFAILED:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type FluidRevisionVerificationSecurityCheck string
|
||||
|
||||
const (
|
||||
FluidRevisionVerificationSecurityCheckPENDING FluidRevisionVerificationSecurityCheck = "PENDING"
|
||||
FluidRevisionVerificationSecurityCheckPASSED FluidRevisionVerificationSecurityCheck = "PASSED"
|
||||
FluidRevisionVerificationSecurityCheckFAILED FluidRevisionVerificationSecurityCheck = "FAILED"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionVerificationSecurityCheck.
|
||||
func (v FluidRevisionVerificationSecurityCheck) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionVerificationSecurityCheckPENDING, FluidRevisionVerificationSecurityCheckPASSED, FluidRevisionVerificationSecurityCheckFAILED:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type FluidRevisionVerificationStatus string
|
||||
|
||||
const (
|
||||
FluidRevisionVerificationStatusPENDING FluidRevisionVerificationStatus = "PENDING"
|
||||
FluidRevisionVerificationStatusPASSED FluidRevisionVerificationStatus = "PASSED"
|
||||
FluidRevisionVerificationStatusFAILED FluidRevisionVerificationStatus = "FAILED"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined FluidRevisionVerificationStatus.
|
||||
func (v FluidRevisionVerificationStatus) Valid() bool {
|
||||
switch v {
|
||||
case FluidRevisionVerificationStatusPENDING, FluidRevisionVerificationStatusPASSED, FluidRevisionVerificationStatusFAILED:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// The primary safety barrier between adaptive generation and deterministic runtime
|
||||
// (ArchitectureBlueprint.md section 15).
|
||||
type FluidRevisionVerification struct {
|
||||
PolicyCheck *FluidRevisionVerificationPolicyCheck `json:"policy_check,omitempty" yaml:"policy_check,omitempty"`
|
||||
SecurityCheck *FluidRevisionVerificationSecurityCheck `json:"security_check,omitempty" yaml:"security_check,omitempty"`
|
||||
Status FluidRevisionVerificationStatus `json:"status" yaml:"status"`
|
||||
TestRefs []string `json:"test_refs,omitempty" yaml:"test_refs,omitempty"`
|
||||
}
|
||||
|
||||
type FluidRevision struct {
|
||||
AdaptationClasses []AdaptationClass `json:"adaptation_classes,omitempty" yaml:"adaptation_classes,omitempty"`
|
||||
|
||||
// Adoption is evidence, not proof of quality (FluidAPIStandards.md section 32).
|
||||
Adoption *FluidRevisionAdoption `json:"adoption,omitempty" yaml:"adoption,omitempty"`
|
||||
Audit *FluidRevisionAudit `json:"audit,omitempty" yaml:"audit,omitempty"`
|
||||
BackendRequirements []BackendRequirementID `json:"backend_requirements,omitempty" yaml:"backend_requirements,omitempty"`
|
||||
Compatibility FluidRevisionCompatibility `json:"compatibility" yaml:"compatibility"`
|
||||
Complexity *FluidRevisionComplexity `json:"complexity,omitempty" yaml:"complexity,omitempty"`
|
||||
Contract FluidRevisionContract `json:"contract" yaml:"contract"`
|
||||
CreatedAt *Timestamp `json:"created_at,omitempty" yaml:"created_at,omitempty"`
|
||||
CreatedBy *Actor `json:"created_by,omitempty" yaml:"created_by,omitempty"`
|
||||
Deployment *FluidRevisionDeployment `json:"deployment,omitempty" yaml:"deployment,omitempty"`
|
||||
Economics *FluidRevisionEconomics `json:"economics,omitempty" yaml:"economics,omitempty"`
|
||||
Fitness *FluidRevisionFitness `json:"fitness,omitempty" yaml:"fitness,omitempty"`
|
||||
ID RevisionID `json:"id" yaml:"id"`
|
||||
Implementation FluidRevisionImplementation `json:"implementation" yaml:"implementation"`
|
||||
|
||||
// Every revision is governed by a specific intent version, so audit can ask
|
||||
// whether the change was valid under the intent that existed at the time
|
||||
// (ArchitectureBlueprint.md section 27).
|
||||
InterfaceEvolutionIntent FluidRevisionInterfaceEvolutionIntent `json:"interface_evolution_intent" yaml:"interface_evolution_intent"`
|
||||
InterfaceID InterfaceID `json:"interface_id" yaml:"interface_id"`
|
||||
OriginatingHypotheses []HypothesisID `json:"originating_hypotheses,omitempty" yaml:"originating_hypotheses,omitempty"`
|
||||
|
||||
// Null marks genesis.
|
||||
ParentRevision *RevisionID `json:"parent_revision" yaml:"parent_revision"`
|
||||
Promotion *FluidRevisionPromotion `json:"promotion,omitempty" yaml:"promotion,omitempty"`
|
||||
Provenance FluidRevisionProvenance `json:"provenance" yaml:"provenance"`
|
||||
RevisionNumber int64 `json:"revision_number" yaml:"revision_number"`
|
||||
Rollback FluidRevisionRollback `json:"rollback" yaml:"rollback"`
|
||||
SchemaVersion SchemaVersion `json:"schema_version" yaml:"schema_version"`
|
||||
State FluidRevisionState `json:"state" yaml:"state"`
|
||||
|
||||
// The primary safety barrier between adaptive generation and deterministic runtime
|
||||
// (ArchitectureBlueprint.md section 15).
|
||||
Verification FluidRevisionVerification `json:"verification" yaml:"verification"`
|
||||
}
|
||||
|
||||
// What deterministic interface state was built, verified, exposed and measured.
|
||||
// Published revisions should be immutable; corrections create successors
|
||||
// (FluidAPIStandards.md section 8).
|
||||
type RevisionDocument struct {
|
||||
FluidRevision FluidRevision `json:"fluid_revision" yaml:"fluid_revision"`
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue