You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Status (2026-08-14):v0.1.0 shipped as the first EffVer release, graduating off the alpha line. The EffVer adoption + maintainer-doc slice is done (#178, ADR-003). This tracker now targets v1.0.0 - the CRD-stabilization and hardening milestone; see the scope-change comment below for the rationale. Checked items are complete; unchecked items gate v1.0.0.
Goal
Stabilize the CRD and graduate the operator to a stable v1.0.0. This issue tracks everything that needs to land - and everything we want to audit - before that release.
Current state: v0.1.0-alpha.20 (cut 2026-05-20). Twenty alphas, chart-image fix from #128 landed cleanly, Node 24 audit done. The MVP milestone "Operator: Architecture + CRDs + Decisions + MVP" is closed. Time to draw the line and call the next cut "real."
Not a feature freeze - a quality bar. Docs match the code, examples actually run, release process is reproducible without tribal knowledge.
Versioning: adopt EffVer
Done - shipped in #178 (ADR-003). Kept here for reference.
"Expect significant changes." CRD shape moved meaningfully, you'll touch your pack manifests.
MESO (x.Y.z)
"Could break, watch for warnings." New fields, optional opt-ins, deprecations.
MICRO (x.y.Z)
"Should be safe." Bug fixes, doc updates, operator-internal refactors with no CRD impact.
Why EffVer over SemVer:
SemVer demands backwards-compat precision we don't have yet. Pre-1.0 we already break things on minor bumps; SemVer says that warrants a major. EffVer just says "watch the MACRO digit for migration work."
Maps cleanly to what pack authors care about: "do I need to read release notes or can I just bump."
Honest signal during pre-stable.
Tag format stays vX.Y.Z (Helm chart + GitHub Releases want SemVer-shaped tags). Interpretation in docs changes.
Maintainer docs that mentioned "semantic versioning" - now updated to EffVer in #178:
CONTRIBUTING.md - review against current PR / branch / lint workflow.
Decide: curated CHANGELOG.md, or rely solely on GitHub-generated release notes.
User-facing docs (docs/)
docs/quickstart.md - verify steps still match dev/Makefile. Cover the user-provided-TLS path and the new chart manager.image.* defaults.
docs/configuration-reference.md - audit for every CRD field added since 2026-03: routing.tls.secretName, auth.forwardAccessToken, auth.denyRedirect, auth.tokenExchange, auth.spaClient, auth.deviceFlowClient, plus whatever lands from the gating set (multi-port, dark/light icons, etc.).
docs/troubleshooting.md - sanity-check the symptom list against currently surfaced condition reasons.
docs/api-reference.md - auto-generated via make docs; verify it generates clean from main HEAD.
docs/reconcilers/{README,routing,validation,authentication}.md - match current responsibilities. TLS reconciler probably wants its own doc.
docs/makefile-reference.md - verify coverage of new/changed targets (generate-dev, helm-chart-version semantics).
release-checklist.md - EffVer language (docs: adopt Effort-based Versioning (EffVer) #178). Still open: job-name list (lines 84-90) is wrong vs current release.yml - five jobs (tests, build-manifests, goreleaser, publish-helm-chart, sync-helm-repository), not seven.
A non-routing NebariApp (operator-as-contract-aggregator mode).
Each example: kubectl apply -f-able against the dev cluster, with an inline comment explaining what it demonstrates.
Automated documentation: what we have, what to expand
Today: docs/api-reference.md auto-generated from api/v1/ via crd-ref-docs (make docs).
Add at least one of these before v1.0.0:
Condition / event reason table from the EventReason* / Reason* constants in api/v1/nebariapp_types.go. Lowest-friction starting point.
RBAC summary table from // +kubebuilder:rbac: markers.
Helm values reference (e.g. via helm-docs).
Naming-rules diagram from naming.ValidateResourceNames so pack authors see name-length implications early.
Goal: a new pack author shouldn't have to read the operator source to understand what their NebariApp produces.
Triage
Rule: anything that touches the CRD spec lands pre-v1.0.0 - especially field removals. After v1.0.0, CRD shape changes become MACRO bumps and real migration work for consumers. (Pre-1.0, on the 0.x line, CRD changes still ship but are signposted MESO/MACRO-in-0.x bumps.)
Gating set for v1.0.0 (must close before the stable cut)
Goal
Stabilize the CRD and graduate the operator to a stable
v1.0.0. This issue tracks everything that needs to land - and everything we want to audit - before that release.Current state:
v0.1.0-alpha.20(cut 2026-05-20). Twenty alphas, chart-image fix from #128 landed cleanly, Node 24 audit done. The MVP milestone "Operator: Architecture + CRDs + Decisions + MVP" is closed. Time to draw the line and call the next cut "real."Not a feature freeze - a quality bar. Docs match the code, examples actually run, release process is reproducible without tribal knowledge.
Versioning: adopt EffVer
Going forward (starting with
v0.1.0), use Effort-based Versioning (EffVer) -MACRO.MESO.MICRO- instead of strict SemVer.X.y.z)x.Y.z)x.y.Z)Why EffVer over SemVer:
Tag format stays
vX.Y.Z(Helm chart + GitHub Releases want SemVer-shaped tags). Interpretation in docs changes.Maintainer docs that mentioned "semantic versioning" - now updated to EffVer in #178:
docs/maintainers/release-process.mddocs/maintainers/release-setup.mddocs/maintainers/release-checklist.mdDocumentation readiness for v1.0.0
Top-level
README.md- softened "may change without notice" into a concrete EffVer statement (docs: adopt Effort-based Versioning (EffVer) #178).CONTRIBUTING.md- review against current PR / branch / lint workflow.CHANGELOG.md, or rely solely on GitHub-generated release notes.User-facing docs (
docs/)docs/quickstart.md- verify steps still matchdev/Makefile. Cover the user-provided-TLS path and the new chartmanager.image.*defaults.docs/configuration-reference.md- audit for every CRD field added since 2026-03:routing.tls.secretName,auth.forwardAccessToken,auth.denyRedirect,auth.tokenExchange,auth.spaClient,auth.deviceFlowClient, plus whatever lands from the gating set (multi-port, dark/light icons, etc.).docs/troubleshooting.md- sanity-check the symptom list against currently surfaced condition reasons.docs/api-reference.md- auto-generated viamake docs; verify it generates clean frommainHEAD.docs/reconcilers/{README,routing,validation,authentication}.md- match current responsibilities. TLS reconciler probably wants its own doc.docs/makefile-reference.md- verify coverage of new/changed targets (generate-dev,helm-chart-versionsemantics).Maintainer docs (
docs/maintainers/)release-process.md- EffVer language (docs: adopt Effort-based Versioning (EffVer) #178).release-checklist.md- EffVer language (docs: adopt Effort-based Versioning (EffVer) #178). Still open: job-name list (lines 84-90) is wrong vs currentrelease.yml- five jobs (tests,build-manifests,goreleaser,publish-helm-chart,sync-helm-repository), not seven.release-setup.md- EffVer language (docs: adopt Effort-based Versioning (EffVer) #178).Design / decision / plan archives
docs/plans/is an orphan (never landed, never decisioned).Examples
Currently
dev/examples/has just two files. For v1.0.0:make setup).auth.enabled: true+ Keycloak provisioning.routing.tls.secretName(user-provided cert).routing.publicRoutesfor health endpoints.routing.routes[].port(multi-port - gated on feat(api): per-route port overrides on NebariApp routes #121).Each example:
kubectl apply -f-able against the dev cluster, with an inline comment explaining what it demonstrates.Automated documentation: what we have, what to expand
Today:
docs/api-reference.mdauto-generated fromapi/v1/viacrd-ref-docs(make docs).Add at least one of these before v1.0.0:
EventReason*/Reason*constants inapi/v1/nebariapp_types.go. Lowest-friction starting point.// +kubebuilder:rbac:markers.helm-docs).naming.ValidateResourceNamesso pack authors see name-length implications early.Goal: a new pack author shouldn't have to read the operator source to understand what their NebariApp produces.
Triage
Rule: anything that touches the CRD spec lands pre-v1.0.0 - especially field removals. After v1.0.0, CRD shape changes become MACRO bumps and real migration work for consumers. (Pre-1.0, on the
0.xline, CRD changes still ship but are signposted MESO/MACRO-in-0.xbumps.)Gating set for v1.0.0 (must close before the stable cut)
Bugs / security
enforceAtGatewayproduces two competing HTTPRoutes (contract bug)syncClientScopesdoesn't remove scopes no longer in spec (drift bug)CRD-spec changes (must land pre-v1.0.0)
RouteMatch.port- additive)status.serviceDiscovery.children(status shape change)auth.keycloakConfigadditions)forwardAccessToken, add app-level OIDC redirect URIs (field removal - the most stability-critical of all; if it lands after a public0.x, signpost it as a breaking0.xbump)Auth quality
Release readiness
main).Doc / process
v1.0.0 is a real milestone: the point where the CRD is settled and consumers can depend on it.
Worth landing if cheap (no CRD touch)
Decision point
charts/nebari-app).Punt to v0.1.x patches (MICRO under EffVer, no CRD shape change)
SecurityPolicy.spec.oidc.providerReconciletest coveragePunt to v0.2.0+ (no CRD touch but larger scope / epic-level)
SecurityPolicy.Issuerinvestigation (diagnostic, may be no-op)Tracking epics
The existing epics (#78 CRD evolution, #79 Keycloak & Auth, #80 Reconciler & Tech Debt) cover most child issues already, and a final one:
Ordering recommendation (within the gating set)
#132 (release validation) explicitly depends on the rest of the gating set being on
main. Suggested order:Cut v1.0.0 when this issue's "Done when" checklist is fully ticked.
Release process audit
Verified end-to-end via
v0.1.0-alpha.20:values.yamlcorrectly stamped with registry-qualified image + version tag (ci(release): pass IMG to make helm-chart so values.yaml inherits the pinned image #128).Stale items:
docs/maintainers/release-checklist.mdjob-name list. (Still open.)docs/maintainers/*.md(docs: adopt Effort-based Versioning (EffVer) #178).Out-of-repo follow-up (doesn't gate v1.0.0):
sync-chartcomposite action.Done when (acceptance criteria for v1.0.0)
docs/maintainers/release-checklist.mdjob-name list matches actualrelease.yml.v0.1.0cut exercised the full pipeline (five jobs) and the firstnebari-appchart publish end-to-end.v1.0.0.When to formalize as a GitHub Milestone
Once triage above is locked, create the
v1.0.0Milestone in GitHub and attach the gating issues. Holding off until then to avoid premature attachment.