-
v0.3.5 Stable
released this
2026-07-16 06:18:01 +00:00 | 34 commits to main since this releaseChanged
- Onboarded to the pipeline (go-operator-image PipelineProject): trunk branch,
VERSION,ci-test.Dockerfilevalidate gate, CHANGELOG merge=union, Dockerfile
aligned with siblings (digest-pinned golang, Athens GOPROXY, BuildKit cache
mounts, nogo build -a); legacy.argo/CI retired. Replaces the raw
codeberg-main flux + Shipwright build path. - Bump
libseanfarm-operatorv0.4.1 -> v0.4.10: nine releases of shared-harness
fixes, headlined by the R5 wave (dry-run delete no longer touches the remote —
this operator sets DryRunAnnotation + HoldUntilSuccess, so the v0.4.1 dry-run
delete could REALLY delete buckets/users; empty Ready=False reason 422 guard;
Degraded truncation; stale Progressing clear).
v0.1.2
Quality checkpoint release after comprehensive bug hunting analysis. No issues found.
Validation Performed
Round 1: Race Condition Analysis
- ✅ All tests pass with
-raceflag (controller + minioclient packages) - ✅ Verified proper mutex usage (RWMutex in circuit breaker, mutex in fake client)
- ✅ No data races detected in concurrent reconciliation
Round 2: Nil Pointer Dereference Analysis
- ✅ All Status field accesses safe (embedded struct, never nil)
- ✅ Helper functions have proper nil checks (
observedGeninhandleResolveBucketTransient) - ✅ BucketRef validation enforced via webhooks (MinLength, Pattern constraints)
Round 3: Resource Leak Analysis
- ✅ Contexts properly canceled (
defer cancel()inIsBucketEmpty) - ✅ No goroutines spawned in production code (test-only usage with proper synchronization)
- ✅ MinIO client uses SDK connection pooling (no manual cleanup required)
- ✅ No file handles or unclosed resources
Round 4: Dead Code Analysis
- ✅
go vet ./...clean (no unused variables) - ✅
staticcheck ./...clean (no unused code) - ✅ All constants properly used (
ReasonInvalidPolicy, error variables) - ✅ No TODOs or FIXMEs in production code
- ✅ No commented-out code blocks
Round 5: Edge Case & Validation Analysis
- ✅ Backoff handles negative
failureCount(clamped to 0) - ✅ Backoff handles overflow (capped at
maxBackoff) - ✅ Backoff jitter ensures positive result (defensive check at line 84-86)
- ✅ Bucket name validation via OpenAPI schema (MinLength=3, MaxLength=63, Pattern for S3 compliance)
- ✅ Webhook singleton enforcement prevents configuration races
- ✅ All internal documentation links verified
Test Results
- 265 controller tests passing
- 17 circuit breaker tests passing
- 11 backoff tests passing
- Race detector: Clean (no races detected)
Notes
- No code changes in this release
- No API changes
- All existing deployments continue to work unchanged
- This release serves as a documented quality checkpoint after v0.1.1
v0.1.1
Patch release with bug fixes and documentation corrections found during post-release validation.
Bug Fixes
Round 1-2: Build & Resource Management
- Fixed stray
cmd/cmdbinary created during build interfering with compilation - Added
cmd/cmdto.gitignoreto prevent accidental commits - Added defensive nil check for
condsparameter inhandleTransientDeleteNotReady()(defensive programming improvement)
Round 3-4: Dead Code & Documentation
- CRITICAL: Removed unimplemented custom metrics (
minio_operator_reconcile_duration_seconds,minio_operator_client_errors_total)- These metrics were documented but never instrumented in the code
- Replaced with placeholder comment pointing to controller-runtime built-in metrics
- Impact: Documentation now accurately reflects available metrics
- Updated
docs/SCALE.mdto remove references to unimplemented metrics - Updated
docs/operations/monitoring.mdto document actual circuit breaker metrics:minio_operator_circuit_breaker_state(gauge: 0=Closed, 1=Open, 2=HalfOpen)minio_operator_circuit_breaker_transitions_total(counter with from_state/to_state labels)minio_operator_circuit_breaker_failures_total(counter)minio_operator_circuit_breaker_successes_total(counter)minio_operator_circuit_breaker_rejections_total(counter)
- Updated CHANGELOG.md v0.1.0 section to list correct metrics
Round 5: Final Integration
- Verified all tests pass (265 controller tests, circuit breaker tests, backoff tests)
- Confirmed no race conditions with
go test -race - Validated circuit breaker concurrency patterns (mutex-protected state machine)
- Verified backoff handles edge cases (negative failureCount, int32 overflow)
Notes
- No functional changes to circuit breaker or exponential backoff logic
- No API changes
- All existing deployments continue to work unchanged
- Built-in controller-runtime metrics remain available:
controller_runtime_reconcile_time_seconds(histogram with controller label)controller_runtime_reconcile_errors_total(counter with controller label)workqueue_*(depth, adds, retries)
Upgrade Instructions
No special upgrade steps required. Deploy as usual:
kubectl apply -f https://codeberg.org/someara/minio-resource-operator/raw/tag/v0.1.1/dist/install.yamlv0.1.0
Production-ready release with stable v1beta1 API, comprehensive operations documentation, automated CI/CD via Argo Workflows, and extensive migration tooling.
API Stability (Breaking Change)
- v1beta1 API introduced: Production-stable API with backward compatibility guarantees
- All 16 CRD kinds available under
minio.sean.farm/v1beta1 - Storage version: v1beta1 (new CRs stored as v1beta1)
- Served versions: v1alpha1 (deprecated) + v1beta1 (stable)
- All 16 CRD kinds available under
- v1alpha1 API deprecated: No breaking changes yet, but migration recommended
- Deprecated as of v0.1.0, will be removed in v0.3.0 (6+ months)
- Conversion webhook provides transparent bidirectional translation
- See Migration Guide
- Conversion webhooks: Hub/Spoke pattern with lossless round-trip conversion
- v1beta1 as Hub (storage version)
- v1alpha1 as Spoke (deprecated, converted via webhook)
- 32 conversion files (16 types × 2 directions)
/convertendpoint handles all API version translation
Resilience & Scale Features (Phase 2)
- Circuit Breaker: Prevents reconcile storms during persistent MinIO outages
- 3-state machine: Closed → Open (fail-fast) → HalfOpen (probe recovery)
- Configurable thresholds:
--circuit-breaker-threshold=5(failures before opening) - Configurable timeout:
--circuit-breaker-timeout=30s(wait before probe) - Health check endpoint:
/readyz/minio-circuitreports circuit state - Prometheus metrics:
minio_operator_circuit_breaker_state,minio_operator_circuit_breaker_transitions_total
- Exponential Backoff: Intelligent retry delays for transient errors
- Progression: 5s → 10s → 20s → 40s → 80s → 160s → 300s (capped)
- Per-CR
FailureCountfield tracks consecutive transient failures - Automatic reset to 0 on success (Ready=True)
- Preserves drift detection: Success paths still requeue at 5-minute intervals
- Applied across all 16 reconcilers for
ReasonDependencyNotReadyerrors
- Load Testing Framework:
test/load/load_test.go: 5 load test scenarios (baseline, churn, outage recovery, dependency ordering, scale ceiling)test/load/helpers.go: Fixture creation, metrics collection, percentile calculation- Makefile targets:
make test-load,make profile-load(with CPU/memory profiling)
- Scale Documentation:
docs/SCALE.md: Comprehensive scale guide (800+ lines)- Tested configurations: Small (100 CRs), Medium (500 CRs), Large (1000 CRs)
- Performance characteristics: Convergence time, memory/CPU usage, reconcile latency
- Bottlenecks identified: Informer cache memory, MinIO IAM write amplification
- Tunables: MaxConcurrentReconciles, DefaultResyncInterval, circuit breaker thresholds
- Monitoring: Prometheus metrics (built-in + circuit breaker), alert rules, troubleshooting guide
- Prometheus Metrics:
- Built-in controller-runtime metrics:
controller_runtime_reconcile_time_seconds,controller_runtime_reconcile_errors_total,workqueue_* - Circuit breaker metrics:
minio_operator_circuit_breaker_state,minio_operator_circuit_breaker_transitions_total,minio_operator_circuit_breaker_failures_total,minio_operator_circuit_breaker_successes_total,minio_operator_circuit_breaker_rejections_total
- Built-in controller-runtime metrics:
Operations & Production Readiness
- Security documentation:
SECURITY.md: Vulnerability disclosure policy, security contactdocs/security-best-practices.md: Pod Security Standards, NetworkPolicies, RBAC, Secret management, audit logging (518 lines)
- Operations runbooks (3,416 lines total):
docs/operations/troubleshooting.md: 9 common failure modes with diagnosis and fixes (710 lines)docs/operations/monitoring.md: Prometheus ServiceMonitor, Grafana dashboards, 11 alert rules (689 lines)docs/operations/capacity-planning.md: Resource sizing for 100-2000 CR scales (654 lines)docs/operations/ha-dr.md: HA deployment, leader election, backup/DR procedures (845 lines)
- API stability policy:
docs/api-stability.md: Version support matrix, deprecation policy, schema change rulesdocs/migration-guide-v1beta1.md: Step-by-step migration guide with 3 migration methods, troubleshooting, FAQs
CI/CD & Automation
- Argo Workflows integration:
.argo/workflow-ci.yaml: PR checks (lint, test, verify-installer, e2e) with DAG-based parallel execution.argo/cronworkflow-security.yaml: Weekly security scanning (govulncheck, Trivy repo/image, go mod verify).argo/workflowtemplate-common.yaml: Reusable workflow templates (checkout, golang-base, docker-build).argo/workflow-release.yaml: Automated release pipeline (build multi-arch images, generate installer, create release).argo/setup.sh: One-command setup script for deploying workflows to cluster.argo/README.md+QUICKSTART.md: Comprehensive documentation
Migration Tooling
- Automated migration:
hack/migrate-to-v1beta1.sh: Script with dry-run, namespace filtering, backup/restore (300+ lines)- Validates prerequisites (kubectl, v1beta1 API availability)
- Backs up all v1alpha1 CRs before migration
- Handles 16 CRD kinds in dependency order
- Sample CRs:
config/samples-v1beta1/: 16 v1beta1 sample files + kustomization.yaml- Updated from v1alpha1 samples with new apiVersion
- Testing:
test/e2e/api_version_migration_test.go: 10 conversion specs (460+ lines)- Round-trip conversion validation (v1alpha1 ↔ v1beta1)
- Cross-version updates (create v1alpha1, update v1beta1)
- Enum and complex type conversion (ILMRule nested structs)
- Mixed version reconciliation (bucket v1alpha1 + sub-resource v1beta1)
- Status field preservation
- Storage version verification
Configuration & Deployment
- CRD conversion patches:
config/crd/patches/webhook_in_all_crds.yaml: Conversion webhook configurationconfig/crd/patches/cainjection_in_all_crds.yaml: cert-manager CA injection- Updated
config/crd/kustomization.yamlwith conversion webhook patches
- Dual API version support: All CRDs serve both v1alpha1 (deprecated) and v1beta1 (stable)
Breaking Changes & Migration
- v1alpha1 deprecation: Begin migration planning now. v1alpha1 will be removed in v0.3.0 (estimated Q4 2026).
- Storage version change: New CRs stored as v1beta1. Existing v1alpha1 CRs work unchanged via conversion webhook.
- Zero-downtime migration: Operator upgrade to v0.1.0 does not require CR migration. CRs can be migrated incrementally.
Upgrade Instructions
- Upgrade operator:
kubectl apply -f https://codeberg.org/someara/minio-resource-operator/raw/tag/v0.1.0/dist/install.yaml - Verify webhook:
kubectl get certificate -n minio-operator-system minio-operator-serving-cert(Ready=True) - Test conversion:
kubectl get miniouser.v1beta1 <name>(should work for existing v1alpha1 CRs) - Optional: Migrate CRs:
./hack/migrate-to-v1beta1.sh --dry-run(see Migration Guide)
Compatibility
- Kubernetes: 1.30+ (tested with 1.35)
- Go: 1.25+
- cert-manager: 1.16.5+
- MinIO: RELEASE.2024-* (tested with RELEASE.2024-11-07T00-52-20Z)
Known Issues
- None at release time
Contributors
This release includes contributions from Claude Opus 4.6 (AI pair programming assistant).
For detailed migration instructions, see Migration Guide.
For API stability commitments, see API Stability Policy.v0.0.81
test/e2e: four new Ordered Contexts covering referenced-delete
refusal — proves the operator blocks CR deletion with
reason=Referenceduntil in-cluster references are dropped:- "MinioPolicy delete refusal while referenced" — creates a
MinioPolicy, binds it to a MinioUser (deletionPolicy: Deleteso
the server-side user unbinds cleanly on drain), deletes the
policy, asserts the finalizer + server-side policy persist and
status.conditions[Ready].reason=Referenced; drops the user and
nudges the policy; asserts the CR and MinIO-side policy drain.
Guardsminiopolicy_controller.go:117-193. - "MinioUser delete refusal while referenced by MinioServiceAccount"
— creates a MinioUser, seeds a MinioServiceAccount with
spec.parentUserpointing at it, attempts the user delete,
asserts refusal withreason=Referenced; drops the SA, nudges
the user; asserts drain. Guards
miniouser_controller.go:445-538. - "MinioUser delete refusal while referenced by MinioGroupMembership"
— same shape, referencing CR is a MinioGroupMembership with the
user inspec.users. - "MinioGroup delete refusal while referenced" — creates a
MinioGroup, seeds a MinioGroupMembership targeting it, asserts
refusal; drops the MGM; tolerates the MinioGroup's watch on
MinioGroupMembership auto-reconciling the group before the nudge
lands; asserts the server-side group is drained (gone OR empty).
Guardsminiogroup_controller.go:187-308.
- "MinioPolicy delete refusal while referenced" — creates a
- Total e2e spec count: 55 → 59.
v0.0.80
test/e2e: three new Ordered Contexts continuing the mutation-path
coverage push started in v0.0.79:- "MinioGroup spec.policies mutation" — mirror of the MinioUser
policies mutation spec against a group target. Creates two
MinioPolicy fixtures, binds one to a group (seeded with a
MinioGroupMembership so the IAM group exists), then adds and drops
policies; assertsmc admin group inforeflects each transition.
Guards the group policy diff path at
internal/controller/miniogroup_controller.go:175-180. - "MinioBucketPolicy body mutation" — applies a BucketPolicy granting
anonymouss3:GetObjecton a fresh bucket, then mutates
spec.policytos3:ListBucket; assertsmc anonymous get-json
reflects each body. - "MinioPolicy spec.buckets mutation" — applies a profile-backed
MinioPolicy scoped to bucketA, capturesstatus.appliedPolicyHash,
then retargets to bucketB; asserts the hash advances and the
rendered policy body's resource ARNs flip.
- "MinioGroup spec.policies mutation" — mirror of the MinioUser
v0.0.79
test/e2e: three new Ordered Contexts covering mutation/update paths
across the identity graph:- "MinioUser spec.policies mutation" — boots two fresh MinioPolicy
fixtures, attaches one to a MinioUser, then mutatesspec.policies
to add the second and drop the first; assertsmc admin user info
reflects each transition. GuardssyncUserPoliciesat
internal/controller/miniouser_controller.go:337-411
(AttachPolicy / DetachPolicy drift reconciliation). - "MinioPolicy body mutation" — applies a MinioPolicy with
profile: ro, capturesstatus.appliedPolicyHash, then switches
toprofile: rw; asserts the hash advances andmc admin policy infoemitss3:PutObject(absent from ro). Guards the re-push
path atinternal/controller/miniopolicy_controller.go:81-109. - "MinioGroupMembership spec.users add/remove" — creates two
MinioUser fixtures, binds only one via a MinioGroupMembership,
then mutatesspec.usersto add and drop members; asserts
mc admin group inforeflects each membership transition. Guards
UpdateGroupMembersat
internal/controller/miniogroupmembership_controller.go:129-144.
- "MinioUser spec.policies mutation" — boots two fresh MinioPolicy
v0.0.78
test/e2e: four new Ordered Contexts pinning credential-lifecycle and
policy-body contracts that previously had only unit coverage:- "MinioUser spec.secret.name target move" — mutates
spec.secret.name
after Ready, asserts the new managed Secret carries the same
access key and secret key (no rotation during migration), the old
Secret is deleted,status.observedSecretadvances, and the
preserved creds still authenticate against MinIO. Guards F64 at
internal/controller/miniouser_controller.go:91-103,315-327. - "MinioServiceAccount spec.secret.name target move" — same contract
for SAs, guarding F65 at
internal/controller/minioserviceaccount_controller.go:168-179,504-515. - "MinioServiceAccount update semantics" — mutates
spec.description
andspec.policyJsonafter Ready, assertsstatus.appliedPolicyHash
advances andmc admin user svcacct inforeflects the new
description. Guards theUpdateServiceAccountpaths at
internal/controller/minioserviceaccount_controller.go:421-476. - "MinioPolicy raw JSON with nameOverride" — applies a
spec.policyJson
MinioPolicy with aspec.nameOverride, assertsstatus.policyName
equals the override,mc admin policy info <override>returns the
raw Sid/Action, and the policy is NOT addressable under the CR name.
GuardseffectivePolicyNameat
internal/controller/miniopolicy_controller.go:204-206.
- "MinioUser spec.secret.name target move" — mutates
v0.0.77
test/e2e: three new Ordered Contexts covering data-loss-guard paths:- "Non-empty bucket delete refusal" — seeds an object via
mc cp,
triggerskubectl delete miniobucketwith DeletionPolicy=Delete, and
asserts the finalizer stalls withReady=False/reason=BucketNotEmpty
and the bucket survives server-side until the object is removed. - "MinioUser spec.enabled toggle" — flips
spec.enabledbetween true and
false and proves the server-side IAM status propagates by observing
runMCWithCredsauth rc flip (guardssyncUserStatusat
internal/controller/miniouser_controller.go:424-440). - "MinioUser managed Secret loss refusal" — deletes the managed Secret
out-of-band after Ready, assertsreason=ManagedSecretLost, and
confirms with a 15sConsistentlythat the Secret is NOT silently
recreated (guards the refusal branch at
internal/controller/miniouser_controller.go:117-128).
- "Non-empty bucket delete refusal" — seeds an object via
test/e2e/live_minio_helpers_test.go: addedmcSeedObject(bucket, key, content)helper that runs a custom one-shot pod script to chain
echo > file && mc cp, unblocking specs that need to populate a
bucket before exercising delete-refusal paths.README.md: release checklist now includes an explicit step to update
CHANGELOG.mdbefore tagging.
v0.0.76
test/e2e: "Idempotent reapply" Ordered Context. Re-applies an
unchanged MinioUser manifest N times and asserts over a 15s window
that the managed Secret'sminio_secret_keyand the CR's
status.appliedSecretKeyHashare stable, proving the F124–F153
drift-skip fast path engages.
v0.0.75
test/e2e: "Concurrent reconcile" Ordered Context. Applies a set of
sibling MinioBuckets in a single manifest and asserts they all reach
Ready within a common deadline, proving the controller's parallel
reconcile path does not deadlock on a shared MinIO client.
v0.0.74
CHANGELOG.md: introduced; backfilled entries for v0.0.65 through
v0.0.73. Release checklist continues from main branch.
v0.0.73
hack/smoke-install.sh:IMGis now mandatory;:latestand unqualified
values are rejected up front. The webhook-readiness probe fails closed
("webhook service never answered on :9443 after 120s") instead of silently
falling through. cert-manager pinned version bumped from v1.16.2 to v1.16.5.
v0.0.72
config/prometheus/monitor.yaml: corrected cross-reference to
monitor_tls_patch.yaml(was pointing at the non-existent
servicemonitor_tls_patch.yaml).config/prometheus/monitor_tls_patch.yaml:SERVICE_NAME/SERVICE_NAMESPACE
placeholders replaced with the concrete namePrefixed service DNS name.config/default/kustomization.yaml: added a commented
[METRICS WITH CERTMANAGER]patch entry referencing
cert_metrics_manager_patch.yaml, which was previously an orphan file.
v0.0.71
config/samples/: replaced the 16# TODO(user): Add fields herestubs
with runnable examples exercising each CRD's required fields. Cross-refs
(MinioILMPolicy -> MinioBucket, MinioServiceAccount -> MinioUser, etc.)
line up sokubectl apply -f config/samples/yields a coherent graph.
v0.0.70
test/e2e: out-of-order dependency-recovery coverage. Applies child
resources before their parents (MinioUser -> MinioPolicy,
MinioGroupMembership -> MinioGroup + MinioUser, MinioBucketTags ->
MinioBucket), asserts the child stays Ready=False until the parent
arrives, then converges.
v0.0.69
test/e2e: DeletionPolicy=Delete coverage for bucket lifecycle CRs
(MinioBucket, MinioBucketObjectLock, MinioBucketRetention). Verifies
server-side state is reaped on CR deletion when policy is Delete and
preserved when Retain.
v0.0.68
- Bugfix:
MinioGroupcontroller now always issues anUpdateGroupMembers
request withIsRemove=truewhen the desired member set is empty,
tolerating NotFound. Previously the controller short-circuited when
desc.Memberswas empty, leaving the MinIO-side group un-GC'd if it still
had policies attached. Seeinternal/controller/miniogroup_controller.go. test/e2e: DeletionPolicy=Delete coverage for identity CRs (MinioUser,
MinioServiceAccount, MinioGroup, MinioPolicy).
v0.0.67
test/e2e: DeletionPolicy=Delete coverage for bucket-subresource CRs
(MinioBucketCORS, MinioBucketEncryption, MinioBucketPolicy,
MinioBucketQuota, MinioBucketTags, MinioBucketVersioning).
v0.0.66
test/e2e: credential-rotation coverage for MinioUser and
MinioServiceAccount (rotate annotation drives a new secret key and the
managed Secret is updated).
v0.0.65
test/e2e:clientSecretRefis now included in the reserved-extra-key
admission-denial specs for MinioIDPOpenID.
v0.0.64
test/e2e: live webhook admission-denial coverage. Each CRD's negative
paths (bad bucket names, reserved extras, immutable-field mutation, etc.)
round-trip through the real cert-manager-wired validating webhook.
v0.0.63
test/e2e: live-MinIO coverage extended to MinioBucketEncryption,
MinioILMPolicy, MinioBucketObjectLock, MinioBucketRetention, and
MinioIDPOpenID.
v0.0.62
test/e2e: dropped the F92 poke workaround and added coverage for four
bucket subresources (Tags, CORS, Quota, Versioning).
v0.0.61
test/e2e: extended live-MinIO coverage to MinioPolicy, MinioUser,
MinioGroup, and MinioServiceAccount.config/manager: bumped manager container memory limit.
v0.0.60
- Project rename:
minio-operator->minio-resource-operatorto
disambiguate from the upstreamminio/operatorproject. Go module path,
image name, and CRD group (minio.sean.farm) unchanged.
v0.0.59 and earlier (v0.0.44 - v0.0.58)
Rapid-fire feature/fix pipeline (F80-F153), summarized:
- iamdoc validator hardening (F101-F111): Resource/Action shape checks,
top-level key whitelist, Id shape check, Condition operator block
validation, FuzzValidate panic guard, document/statement size and array
caps, ASCII control-character rejection, exported limit constants. - profile bucket-name validation (F114-F123): webhook + controller
enforcement of S3-legal bucket names when rendering canned profiles. - drift-skip + appliedPolicyHash (F124-F143): every policy-bearing CR
gained anappliedPolicyHash/appliedSecretKeyHashstatus field so
steady-state reconciles skip the expensive MinIO round-trip when the
server-side state already matches. - identity-name validation + drift-skip (F144-F153): MinioUser /
MinioServiceAccount got the same hash-gated fast path; usernames /
parentUser strings validated at admission. - taxonomy refactor + rotate-ack conflict retry + mapper/formatter
hardening (F80-F99, v0.0.59): error-taxonomy cleanup across the
controller set and MinIO-client mappers.
For the v0.0.1 - v0.0.43 prehistory, consult
git logdirectly; those
releases predate the F-feature numbering scheme.Included changes (v0.3.4 -> v0.3.5)
a4090f25fc86fix(backoff): cap exponential backoff in the float domain (amd64 float->int64 overflow)6986160bd601chore(ci): refire — real corrupt module was klauspost/compress v1.18.2 on Athens (truncated, non-zero-byte; EOCD scan), now purged + re-fetch verified14fec95982bffix(build): gomod-mro2 — first mro mount caught a partial minio-go zip from the aborted cold fetcha303bedfebcdfix(build): gomod-mro2 — first mro mount got a partial minio-go zip from the aborted cold fetch26700f7b97e7chore(ci): refire build — poisoned Athens entries purged (28 zero-byte version dirs)d6c0d9e69405fix(build): repo-scoped gomod cache id (poisoned shared mount: minio-go zip corruption)4624a2467eb1chore(ci): refire build — transient shared-Athens cold-fetch zip corruption (known class, self-healing)32821d3577fcfeat(cicd): pipeline onboarding contract + libseanfarm-operator v0.4.1 -> v0.4.10
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Onboarded to the pipeline (go-operator-image PipelineProject): trunk branch,