Releases: carolsimone/continuo
Release list
v0.4.1
Install
helm install continuo oci://ghcr.io/carolsimone/charts/continuo \
--version 0.4.1 -n continuo --create-namespaceChanged
- Comment-only:
files/dbt-commands.yamlnow names the demo repository by its
new name,continuo-demo(renamed fromcontinuo-dbt-demo). No rendered
template, values key, or behavior changes; PATCH when released. validation.imageTagdefault bumpedv0.4.0→v0.4.1. The
continuo-python-runtime-<engine>image now installs its runtime and engine
adapter from PyPI (versioned) instead of building from source, and the
adapter packages were renamed tocontinuo-<engine>-adapter. The image name,
entrypoint,run/validation-opcommands, uid65532, and adapter
discovery are unchanged, so it is a drop-in; an unmodified existing values
file that keepsimageTag: "v0.4.0"still installs and runs. PATCH when
released.
v0.4.0
Install
helm install continuo oci://ghcr.io/carolsimone/charts/continuo \
--version 0.4.0 -n continuo --create-namespaceAdded
networkPolicy.enablednow also renders anallow-acme-solverpolicy when
ingress.enabled=true: cert-manager's HTTP-01 solver pods (label
acme.cert-manager.io/http01-solver, port 8089) answer ACME challenges
through the ingress controller, and the chart's default-deny would otherwise
block the challenge so certificate issuance times out. Selects only pods
carrying cert-manager's solver label, so it is inert for installs that
terminate TLS elsewhere or bring their own certificate Secret. No values
schema change; an unmodified existing values file renders the same
manifests as before unless both toggles are already on.
Changed
- Bumped the default
validation.imageTag(and its_helpers.tplfallback)
fromv0.3.0tov0.4.0. The runner at that release adds python-csv node
support. No values key changes shape, so an unmodified existing values file
keeps working and simply picks up the new default on upgrade. Installs
pinningvalidation.imageTagmust re-pin tov0.4.0(or drop the
override to track the chart's default) before upgrading, the same way as
any othercontinuo-python-runtime-<engine>tag bump — an unmirrored or
stale pin otherwise renders healthy at install and only fails later, at the
next release promotion, as a validation-podErrImagePull. A pin to an
older tag is now caught at render time rather than left as a warning here:
see thevalidation.imageTagcapability gate under Breaking below.
Breaking
- Renamed service
ui-servicetoui: theservices[]entry, Deployment,
Service, NetworkPolicy, and ingress backend now use the nameui.
Image is nowcontinuo-ui. The defaultingress.tls.secretNamealso
changed, fromui-service-tlstoui-tls: any install with
ingress.tls.enabled=truethat relies on this default (rather than
settingingress.tls.secretNameexplicitly) must rename/recreate the
Secret before upgrading, or TLS termination breaks. - Renamed service
agent-runnertoagent-chat; its database
continuo_agentis nowcontinuo_agent_chat(renamed in place on
upgrade — see NOTES). Image is nowcontinuo-agent-chat. The
global.agentRunnerGrpcAddrvalues key is renamed to
global.agentChatGrpcAddr; any install overriding it must rename the
key before upgrading. - Renamed service
remediation-agenttoagent-remediation; database
continuo_remediation_agentis nowcontinuo_agent_remediation(rename in
place on upgrade — see NOTES); consumer group
remediation-agent-remediation-requestedis now
agent-remediation-remediation-requested. Image is now
continuo-agent-remediation. - Renamed service
manifest-controllertotopology-controller; consumer
groupmanifest-controller-release-requestedis now
topology-controller-release-requested(drained group deleted on upgrade —
see NOTES). Image is nowcontinuo-topology-controller. Stream names are
unchanged —manifest.loaded.candidate:v1still names the dbt-manifest
artifact this service loads, not the service itself. validation.imageTag, when set explicitly, is now checked against the tag
ranges known to predate python-csv validation support:_helpers.tpl's
continuo.validation.imagefails the render (rather than only warning here)
when the tag matchesv0.1.x-v0.3.x, or when it isn't shaped like a
released tag ("vX.Y.Z"or"vX.Y.Z@sha256:<digest>") at all — an
unparseable tag can't be checked against that known-bad range, so it fails
closed the same way. BREAKING only for an install that explicitly pins
validation.imageTagto one of those tags (or to something unparseable):
it previously rendered and installed, silently running a validation runner
that ignores a python-csv node'scsv_sourcecontract field and reports
success without checking the file's header, letting a mismatched-header csv
promote unvalidated; it now failshelm template/helm install/helm upgradeoutright, naming the tag and the required floor. No values key is
added, renamed or removed, and an install that has never overridden
validation.imageTag(or that already pinsv0.4.0or later) is
unaffected. Re-pin tov0.4.0or later, or drop the override, before
upgrading.
v0.3.0
What's Changed
- feat(release-controller): kind threading + skip-compile branch (python nodes step 5) by @carolsimone in #407
- fix(manifest-controller): wait out a Redis that is not reachable yet at startup by @carolsimone in #408
- Production execution records carry their log and structured result by @carolsimone in #409
- Executor python runtime dispatch (python nodes step 6) by @carolsimone in #410
- ci(release): install the published chart before declaring the release good by @carolsimone in #411
- Reject a release when two models claim the same warehouse table by @carolsimone in #412
- fix(k8s-controller): give the compile leg an object key MinIO will accept by @carolsimone in #413
- Code-version history in the graph (graph versioning PR 2) by @carolsimone in #415
- feat: promoted seeds run through the standard run lifecycle by @carolsimone in #414
- chore(deps): bump the go-minor-patch group across 10 directories with 5 updates by @dependabot[bot] in #419
- chore(deps): bump the npm-minor-patch group in /ui-service with 6 updates by @dependabot[bot] in #418
- Code-version read paths: OrchestratorQuery RPCs + CLI (graph versioning PR 4) by @carolsimone in #416
- Failure-precedent case base: GetPrecedents + CLI, :PREVIOUS removal (graph versioning PR 3) by @carolsimone in #420
- Remediation switch: fix prompts read the graph and the release code bundle (graph versioning PR 5) by @carolsimone in #421
- remediation-agent: refuse a non-sql fallback source path (closes the python residual) by @carolsimone in #422
- fix(ui): keep manually placed graph nodes where the operator drops them by @carolsimone in #423
- Multi-file proposal chassis: proposals carry N file edits (python-node remediation PR A) by @carolsimone in #425
- fix(ui): stop re-framing the dependency graph once the operator zooms it by @carolsimone in #426
- fix(ui-service): sort NodesPanel same-status rows by completed_at, add Completed column by @carolsimone in #427
- chore(deps): bump the go-security group across 6 directories with 1 update by @dependabot[bot] in #424
- fix(k8s-controller): failed runs report the sentinel message, not marker noise by @carolsimone in #428
- Python-node remediation: shadow-release verified contract fixes by @carolsimone in #429
- fix(executor-controller): restore the adapter → port arrow for UnitOfWork by @carolsimone in #435
- feat(state,orchestrator,agent-runner): /livez so a wedged consumer restarts the pod by @carolsimone in #436
- refactor(lifecycle): one pkg/lifecycle, and the v1 shutdown bug fixed in the two services still carrying it by @carolsimone in #438
- fix(pkg/lifecycle): close two shutdown-path races and stop double-spending the grace period by @carolsimone in #439
- Merged runtime image: executor, chart, e2e, docs by @carolsimone in #437
Full Changelog: v0.2.0...v0.3.0
v0.2.0
Install
helm install continuo oci://ghcr.io/carolsimone/charts/continuo \
--version 0.2.0 -n continuo --create-namespaceAdded
remediation-agent.env.REMEDIATION_PR_OPENING_GRACE_PERIOD(default"10m") — how long the remediation-agent reconciler's opening sweep waits, measured against the claim's ownpr_claimed_at, before releasing a strandedpr_state='opening'proposal back to'failed'for retry. Sits alongside the existingREMEDIATION_PR_POLL_INTERVALin the same free-formenvmap, so no schema change is required; an unmodified existing values file already gets this default via the chart's ownenvdefaults.validation.imageTag— pins the externalcontinuo-validation-<engine>image version independently of the chartappVersion(defaultv0.2.0). The key is optional (not invalidation'srequiredlist), so a release that predates it — e.g. one upgraded withhelm upgrade --reuse-values— still validates and falls back to the chart's current default intemplates/_helpers.tpl'scontinuo.validation.image. An explicitimageTag: nulloverride collapses to that same "key absent, use the default" path (Helm drops a null-valued override key before merging). A present-but-empty string ("") is different — it survives the merge as a deliberate misconfiguration — and is rejected: athelm lint/installtime by the schema'sminLength: 1, and athelm upgrade --reuse-valuestime (where the schema cannot see the merged value) by afailin the same helper. Accepts an optional@sha256:<digest>suffix ("vX.Y.Z@sha256:<digest>") for an immutable pin — a plain tag is mutable, sincecontinuo-validation's publish workflow re-pushes:vX.Y.Zon every tag; seevalues.yaml/README.helm upgradeNOTES.txt now reminds operators that the validation image is externally released and pinned byvalidation.imageTagindependently ofappVersion, and that private-registry mirrors need it mirrored explicitly — an unmirrored bump otherwise renders healthy at install and only fails later, at the next release promotion, as a validation-podErrImagePull.
Changed
- The validation image is now the externally released
continuo-validation-<engine>(from github.com/carolsimone/continuo-validation), replacing the chart-appVersion-taggedcontinuo-validation-runner-<engine>;global.imageTagno longer applies to it.
Fixed
- Service pods now carry a
checksum/configannotation over the shared
ConfigMap, sohelm upgraderestarts the pods whose configuration actually
changed. Services read that ConfigMap throughenvFrom, and Kubernetes never
refreshes environment variables in a running pod, so changingREDIS_HOST,
S3_BUCKET,LOG_LEVELorvalidation.enginepreviously rendered an
identical Deployment and every pod kept serving the old value indefinitely.
The engine case corrupted output rather than merely going stale:
executor-controllerrolls on an engine change because its validation image
reference changes, somanifest-controllerwould have kept uploading the
previous engine's SQL to the new engine's validator. Upgrade note: an
upgrade that changes any shared ConfigMap value now performs a rolling
restart of the affected services; an upgrade that changes none does not, as
the digest covers only values derived deterministically fromvalues.yaml
(generated credentials live in Secrets). manifest-controllernow reads and re-renders SQL in the dialect of the
engine the install actually targets, instead of always assuming Postgres. The
shared ConfigMap gained aWAREHOUSE_ENGINEkey derived from the existing
validation.enginevalue — no new values key, so unmodified overrides keep
working. On avalidation.engine: trinoinstall, the candidate SQL uploaded
for blue/green validation was previously re-rendered through sqlglot's
postgresdialect, emitting constructs Trino rejects (a cast came out as
CAST(x AS TEXT)rather thanCAST(x AS VARCHAR)), so validation could fail
on SQL the warehouse would otherwise have accepted. An engine with no dialect
mapping now fails the service at startup rather than silently emitting another
engine's SQL.- Redis-backed services (
manifest-controller,ui-service) no longer start
before the bundled Redis is reachable. They previously raced the Redis
StatefulSet, crashed on connect, and entered CrashLoopBackOff — whose
exponential backoff (10s, 20s, 40s, 80s...) kept them down well after Redis
became ready, so the restart loop cost more time than the wait it replaced. A
wait-for-redisinitContainer now gates them, mirroring the existing
wait-for-migrationsgate for Postgres-backed services. Bundled installs only;
BYO installs point at Redis that is already running and render no initContainer. - The quickstart's
/etc/hostsstep is documented with the two things operators
actually get stuck on: it must be run from a real terminal, because sudo reads
the password from the controlling terminal and exits witha terminal is required to read the passwordin an IDE pane or agent shell; and the password
it asks for is the local account password, not the Dex demo login printed
directly below it. The chart README now also documents a browser
--host-resolver-rulesflag that resolves the issuer hostname without root,
for operators who cannot use sudo at all.
v0.1.1 — multi-arch images
Multi-architecture images, a validated chart values contract, and a security scanning baseline.
If you are on Apple Silicon, this is the first release that works. 0.1.0 published linux/amd64 only, so an install on arm64 left every Continuo pod in ImagePullBackOff.
Install
helm install continuo oci://ghcr.io/carolsimone/charts/continuo \
--version 0.1.1 -n continuo --create-namespaceUpgrading from 0.1.0 needs no values changes.
Multi-architecture images
Every service image now publishes for linux/amd64 and linux/arm64, including the dbt base image. Go builder stages cross-compile via BUILDPLATFORM/TARGETARCH rather than emulating, so build times stay reasonable on x86 runners.
Two guards keep it honest: CI fails the build if a published image is not multi-arch, and each arm64 image is smoke-run under QEMU to catch a wrong GOARCH slipping through.
Chart
values.schema.jsonvalidates your values onhelm lint,install, andupgrade— typos and wrong-shaped overrides now fail before template rendering rather than at runtime.NOTES.txtprints real post-install access instructions, including the Dex port-forward and/etc/hostssteps the quickstart login actually needs.- A changelog (
deploy/continuo/CHANGELOG.md) with a CI gate requiring it to be updated whenever the chart's user-facing surface changes.
Two schema bugs from 0.1.0 are fixed: services[].image overrides and resource keys beyond cpu/memory (such as ephemeral-storage or nvidia.com/gpu) were being rejected despite being supported.
Security
govulncheckandgitleaksnow block a merge; Trivy dependency and config scans run advisory.- Dependabot covers Go, npm, uv, GitHub Actions, and Docker.
google.golang.org/grpcbumped to v1.82.1 for GO-2026-6061.
Fixes
orchestratorno longer prunes dedup rows still referenced by the outbox.executor-controllergarbage-collects failed one-shot Job pods after 24 hours.
Status
Beta. dbt remains the only supported runtime.
Full changelog: v0.1.0...v0.1.1
v0.1.0
First tagged release of Continuo — a control plane for data pipelines with built-in agentic remediation.
This is the release that made Continuo installable by someone other than its author: every service image published to a public registry, and a single Helm chart that stands the whole system up.
Install
helm install continuo oci://ghcr.io/carolsimone/charts/continuo \
--version 0.1.0 -n continuo --create-namespaceApple Silicon users: use v0.1.1 instead. The images in this release are
linux/amd64only, so an install on arm64 fails withImagePullBackOff. Multi-arch publishing landed in 0.1.1.
What's in it
- One chart installs everything. All ten backend services, plus optional bundled quickstart datastores (PostgreSQL, Redis, Neo4j, MinIO, Dex) with auto-generated passwords — or point
external*/existingSecretvalues at datastores you already run. - Images on GitHub Container Registry at
ghcr.io/carolsimone/continuo-*, pinned by digest at deploy time. - Hardened by default. Every workload runs non-root (uid 65532) with dropped Linux capabilities,
seccompProfile: RuntimeDefault, resource requests and limits, behind default-deny NetworkPolicies. - Database bootstrap included. The db-init step idempotently creates all nine service databases and runs Flyway migrations.
Status
Beta. dbt is the only supported runtime. Evaluate freely; read deploy/README.md before running it anywhere that matters.