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
215
internal/contract/revision_descriptor_gen.go
Normal file
215
internal/contract/revision_descriptor_gen.go
Normal file
|
|
@ -0,0 +1,215 @@
|
|||
// Code generated by tools/schemagen. DO NOT EDIT.
|
||||
// Source: schemas/. Regenerate with `make generate`.
|
||||
|
||||
package contract
|
||||
|
||||
type RevisionContractType string
|
||||
|
||||
const (
|
||||
RevisionContractTypeOpenapi RevisionContractType = "openapi"
|
||||
RevisionContractTypeGraphql RevisionContractType = "graphql"
|
||||
RevisionContractTypeProtobuf RevisionContractType = "protobuf"
|
||||
RevisionContractTypeAsyncapi RevisionContractType = "asyncapi"
|
||||
RevisionContractTypeJsonschema RevisionContractType = "jsonschema"
|
||||
RevisionContractTypeCustom RevisionContractType = "custom"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined RevisionContractType.
|
||||
func (v RevisionContractType) Valid() bool {
|
||||
switch v {
|
||||
case RevisionContractTypeOpenapi, RevisionContractTypeGraphql, RevisionContractTypeProtobuf, RevisionContractTypeAsyncapi, RevisionContractTypeJsonschema, RevisionContractTypeCustom:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type RevisionContract struct {
|
||||
Digest Digest `json:"digest" yaml:"digest"`
|
||||
|
||||
// Where the contract artifact can be fetched.
|
||||
Source string `json:"source,omitempty" yaml:"source,omitempty"`
|
||||
Type RevisionContractType `json:"type" yaml:"type"`
|
||||
}
|
||||
|
||||
// Which interface evolution intent governs this revision. Required: a revision with
|
||||
// no governing intent cannot be audited.
|
||||
type RevisionIntent struct {
|
||||
Digest *Digest `json:"digest,omitempty" yaml:"digest,omitempty"`
|
||||
Version string `json:"version" yaml:"version"`
|
||||
}
|
||||
|
||||
type RevisionPolicyCompatibility string
|
||||
|
||||
const (
|
||||
RevisionPolicyCompatibilityBackwardCompatible RevisionPolicyCompatibility = "backward_compatible"
|
||||
RevisionPolicyCompatibilityForwardCompatible RevisionPolicyCompatibility = "forward_compatible"
|
||||
RevisionPolicyCompatibilityAdditive RevisionPolicyCompatibility = "additive"
|
||||
RevisionPolicyCompatibilityBehavioralChange RevisionPolicyCompatibility = "behavioral_change"
|
||||
RevisionPolicyCompatibilityBreaking RevisionPolicyCompatibility = "breaking"
|
||||
RevisionPolicyCompatibilityMigrationOnly RevisionPolicyCompatibility = "migration_only"
|
||||
RevisionPolicyCompatibilityInternalOnly RevisionPolicyCompatibility = "internal_only"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined RevisionPolicyCompatibility.
|
||||
func (v RevisionPolicyCompatibility) Valid() bool {
|
||||
switch v {
|
||||
case RevisionPolicyCompatibilityBackwardCompatible, RevisionPolicyCompatibilityForwardCompatible, RevisionPolicyCompatibilityAdditive, RevisionPolicyCompatibilityBehavioralChange, RevisionPolicyCompatibilityBreaking, RevisionPolicyCompatibilityMigrationOnly, RevisionPolicyCompatibilityInternalOnly:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type RevisionPolicyPolicyCheck string
|
||||
|
||||
const (
|
||||
RevisionPolicyPolicyCheckPending RevisionPolicyPolicyCheck = "pending"
|
||||
RevisionPolicyPolicyCheckPassed RevisionPolicyPolicyCheck = "passed"
|
||||
RevisionPolicyPolicyCheckFailed RevisionPolicyPolicyCheck = "failed"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined RevisionPolicyPolicyCheck.
|
||||
func (v RevisionPolicyPolicyCheck) Valid() bool {
|
||||
switch v {
|
||||
case RevisionPolicyPolicyCheckPending, RevisionPolicyPolicyCheckPassed, RevisionPolicyPolicyCheckFailed:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type RevisionPolicySecurityCheck string
|
||||
|
||||
const (
|
||||
RevisionPolicySecurityCheckPending RevisionPolicySecurityCheck = "pending"
|
||||
RevisionPolicySecurityCheckPassed RevisionPolicySecurityCheck = "passed"
|
||||
RevisionPolicySecurityCheckFailed RevisionPolicySecurityCheck = "failed"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined RevisionPolicySecurityCheck.
|
||||
func (v RevisionPolicySecurityCheck) Valid() bool {
|
||||
switch v {
|
||||
case RevisionPolicySecurityCheckPending, RevisionPolicySecurityCheckPassed, RevisionPolicySecurityCheckFailed:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type RevisionPolicy struct {
|
||||
Compatibility RevisionPolicyCompatibility `json:"compatibility" yaml:"compatibility"`
|
||||
PolicyCheck *RevisionPolicyPolicyCheck `json:"policy_check,omitempty" yaml:"policy_check,omitempty"`
|
||||
RollbackTo *RevisionID `json:"rollback_to,omitempty" yaml:"rollback_to,omitempty"`
|
||||
SecurityCheck RevisionPolicySecurityCheck `json:"security_check" yaml:"security_check"`
|
||||
}
|
||||
|
||||
type RevisionRouting struct {
|
||||
// Empty or absent means all cohorts are eligible.
|
||||
EligibleCohorts []CohortID `json:"eligible_cohorts,omitempty" yaml:"eligible_cohorts,omitempty"`
|
||||
|
||||
// Ceiling the router enforces regardless of what a routing policy asks for.
|
||||
MaxTrafficShare *UnitInterval `json:"max_traffic_share,omitempty" yaml:"max_traffic_share,omitempty"`
|
||||
}
|
||||
|
||||
type RevisionRuntimeCircuitBreaker struct {
|
||||
FailureThreshold *int64 `json:"failure_threshold,omitempty" yaml:"failure_threshold,omitempty"`
|
||||
ResetAfterMS *int64 `json:"reset_after_ms,omitempty" yaml:"reset_after_ms,omitempty"`
|
||||
}
|
||||
|
||||
type RevisionRuntimeRetry struct {
|
||||
BackoffMS *int64 `json:"backoff_ms,omitempty" yaml:"backoff_ms,omitempty"`
|
||||
MaxAttempts *int64 `json:"max_attempts,omitempty" yaml:"max_attempts,omitempty"`
|
||||
RetryOn []string `json:"retry_on,omitempty" yaml:"retry_on,omitempty"`
|
||||
}
|
||||
|
||||
// Out-of-process attachment: the adapter is an upstream reached over the network,
|
||||
// so it may be implemented in any language.
|
||||
type RevisionRuntime struct {
|
||||
CircuitBreaker *RevisionRuntimeCircuitBreaker `json:"circuit_breaker,omitempty" yaml:"circuit_breaker,omitempty"`
|
||||
Digest *Digest `json:"digest,omitempty" yaml:"digest,omitempty"`
|
||||
Image string `json:"image,omitempty" yaml:"image,omitempty"`
|
||||
Retry *RevisionRuntimeRetry `json:"retry,omitempty" yaml:"retry,omitempty"`
|
||||
TimeoutMS *int64 `json:"timeout_ms,omitempty" yaml:"timeout_ms,omitempty"`
|
||||
|
||||
// Base URL of the adapter process serving this revision.
|
||||
Upstream string `json:"upstream" yaml:"upstream"`
|
||||
}
|
||||
|
||||
type RevisionSignatureAlgorithm string
|
||||
|
||||
const (
|
||||
RevisionSignatureAlgorithmEd25519 RevisionSignatureAlgorithm = "ed25519"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined RevisionSignatureAlgorithm.
|
||||
func (v RevisionSignatureAlgorithm) Valid() bool {
|
||||
switch v {
|
||||
case RevisionSignatureAlgorithmEd25519:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// The router accepts only signed published descriptors (ArchitectureBlueprint.md
|
||||
// section 35). The signature covers the canonical form of this document with the
|
||||
// signature member removed.
|
||||
type RevisionSignature struct {
|
||||
Algorithm RevisionSignatureAlgorithm `json:"algorithm" yaml:"algorithm"`
|
||||
KeyID string `json:"key_id" yaml:"key_id"`
|
||||
SignedAt *Timestamp `json:"signed_at,omitempty" yaml:"signed_at,omitempty"`
|
||||
Value string `json:"value" yaml:"value"`
|
||||
}
|
||||
|
||||
// The router refuses to route to created, failed or retired revisions
|
||||
// (ArchitectureBlueprint.md section 5.3).
|
||||
type RevisionState string
|
||||
|
||||
const (
|
||||
RevisionStateCreated RevisionState = "created"
|
||||
RevisionStateVerified RevisionState = "verified"
|
||||
RevisionStateExperiment RevisionState = "experiment"
|
||||
RevisionStateCandidate RevisionState = "candidate"
|
||||
RevisionStateStable RevisionState = "stable"
|
||||
RevisionStateDeprecated RevisionState = "deprecated"
|
||||
RevisionStateRetired RevisionState = "retired"
|
||||
)
|
||||
|
||||
// Valid reports whether v is a defined RevisionState.
|
||||
func (v RevisionState) Valid() bool {
|
||||
switch v {
|
||||
case RevisionStateCreated, RevisionStateVerified, RevisionStateExperiment, RevisionStateCandidate, RevisionStateStable, RevisionStateDeprecated, RevisionStateRetired:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type Revision struct {
|
||||
Contract RevisionContract `json:"contract" yaml:"contract"`
|
||||
ID RevisionID `json:"id" yaml:"id"`
|
||||
|
||||
// Which interface evolution intent governs this revision. Required: a revision
|
||||
// with no governing intent cannot be audited.
|
||||
Intent RevisionIntent `json:"intent" yaml:"intent"`
|
||||
Interface InterfaceID `json:"interface" yaml:"interface"`
|
||||
Policy RevisionPolicy `json:"policy" yaml:"policy"`
|
||||
Routing *RevisionRouting `json:"routing,omitempty" yaml:"routing,omitempty"`
|
||||
|
||||
// Out-of-process attachment: the adapter is an upstream reached over the network,
|
||||
// so it may be implemented in any language.
|
||||
Runtime RevisionRuntime `json:"runtime" yaml:"runtime"`
|
||||
SchemaVersion SchemaVersion `json:"schema_version" yaml:"schema_version"`
|
||||
|
||||
// The router accepts only signed published descriptors (ArchitectureBlueprint.md
|
||||
// section 35). The signature covers the canonical form of this document with the
|
||||
// signature member removed.
|
||||
Signature *RevisionSignature `json:"signature,omitempty" yaml:"signature,omitempty"`
|
||||
|
||||
// The router refuses to route to created, failed or retired revisions
|
||||
// (ArchitectureBlueprint.md section 5.3).
|
||||
State RevisionState `json:"state" yaml:"state"`
|
||||
}
|
||||
|
||||
// The runtime-facing projection of a revision, deliberately small enough to be
|
||||
// consumed deterministically by infrastructure (ArchitectureBlueprint.md section
|
||||
// 36). This is a wire artifact: the gateway must be able to read it without any
|
||||
// fluid-core library.
|
||||
type RevisionDescriptorDocument struct {
|
||||
Revision Revision `json:"revision" yaml:"revision"`
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue