Skip to content

Effectus v0.2.1

Effectus v0.2.1 fixes the P1 and P2 defects found during the release review. This release also narrows the supported production runtime contract.

Fixed P1 defects

  • effectusc compile now writes checked protobuf IR. It no longer tries to encode Go closures as JSON.
  • Compiler commands now fail when a requested schema or verb declaration does not load.
  • effectusc format --check is read-only and returns a failure when formatting is required.
  • The checked daemon now rejects rule, schema, bundle, and extension mutation. Status and execution cannot use different generations.
  • Recovery keeps transient storage failures recoverable. A terminal business failure no longer stops the daemon recovery service.
  • PostgreSQL, MySQL, S3, Redis, AMQP, and gRPC adapters no longer advance delivery state before the configured acknowledgement boundary.
  • Adapter shutdown now waits for senders. A normal stop no longer closes an output channel under an active sender.
  • PostgreSQL polling now uses durable processed keys instead of a wall-clock cursor.
  • Redis Streams now recovers pending records and checks acknowledgement failures.
  • S3 scans retain pagination and retry failed object delivery before cursor progress.
  • HTTP shutdown uses the configured deadline and drains active handlers.
  • Runtime metrics now observe checked HTTP, Kafka, gRPC, and recovery paths. Histogram counts now follow the Prometheus format.
  • The HTTP rate limiter uses bounded entries and trusts forwarded addresses only from configured proxies.
  • The Helm chart now uses a Recreate update strategy. It also keeps OCI cache paths writable in ConfigMap mode.
  • The Helm chart separates database migration credentials from runtime credentials.
  • The UI, gRPC, and compiler examples now use supported flags, typed facts, namespaces, and idempotency keys.
  • The VS Code extension now uses effectusc for supported compiler operations. It no longer advertises runtime hot reload.
  • Release publication now starts only from an immutable tag on main. It validates, scans, signs, and stages artifacts before ordered promotion.

Fixed P2 defects

  • Schema evaluation now snapshots registry state under a read lock.
  • Verb registries clone contract data. A caller cannot change a cached contract hash through a returned pointer.
  • Compiler commands now share one source front end.
  • Runtime generation publication and recovery now use one checked artifact authority.
  • Runtime close now releases resources held by accepted or recovered executions.
  • gRPC reports each unsupported execution option by field. Existing unsupported fields remain wire-compatible and deprecated.
  • HTTP ingestion now accepts an explicit namespace. An omitted namespace still uses universe for compatibility.
  • The Go API now accepts a context-aware executor without a deprecated Do method.
  • CI now tests all nested example modules, packaged VS Code activation, Helm renders, races, formal models, and live adapter paths.
  • The daemon now reports recovery backlog, blocked executions, outbox age, and database pool pressure.
  • Durable terminal records now have a guarded, batched prune command and retention indexes.

Compatibility changes

  • effectusc compile output is binary checked IR, not legacy JSON. Consumers must parse the artifact through the checked IR API.
  • Production effectusd requires PostgreSQL for durable admission and recovery.
  • Normal daemon startup validates the database schema and does not apply DDL.
  • Use effectusd --database-migrations=apply with a DDL credential before deployment.
  • The legacy-apply migration mode exists only for a controlled transition.
  • Checked runtime hot reload is not supported. Deploy a new immutable bundle and process version instead.
  • The chart supports one replica and uses Recreate. Plan for HTTP and gRPC downtime during an upgrade.
  • HTTP clients should send both namespace and universe. The namespace identifies the tenant, and the universe identifies the projection.
  • HTTP clients must reuse one Idempotency-Key for retries of the same logical request.
  • gRPC clients must use typed_facts. The legacy facts field remains for wire compatibility.
  • Adapter embedders must call TypedFact.Acknowledge after durable processing when the callback is present.
  • The VS Code extension requires a compatible effectusc executable. The extension does not include a fallback language server.

Database migration

Version 0.2.1 adds migration 10004_retention_indexes.sql.

  1. Back up all effectus_* tables and test the restore.
  2. Stop the old singleton pod.
  3. Run effectusd --database-migrations=apply with the DDL credential.
  4. Start version 0.2.1 with the DML credential and schema validation mode.
  5. Verify readiness, the active generation digest, recovery metrics, and Kafka position.

Do not run old and new daemon versions at the same time. Do not use a rolling Deployment strategy.

Remaining external assumptions

  • Operators must provide PostgreSQL high availability, capacity limits, monitoring, backups, point-in-time recovery, and tested restores.
  • A trusted ingress or service mesh must provide HTTP TLS. It must remove untrusted forwarded-address headers.
  • External effect destinations must enforce the supplied idempotency key or fencing token.
  • Kafka DLQ publication and source-offset commit are not atomic. A crash can create a duplicate DLQ record.
  • Operators must provide the OCI verifier binary and its identity, issuer, key, and certificate policy.
  • Secret and certificate changes require a controlled pod restart. The process does not reload them in place.
  • Registry settings must reject mutation of published semantic-version tags. The workflow checks for existing tags but cannot make a mutable registry immutable.
  • Live service guarantees still depend on the configured PostgreSQL, Kafka, Redis, MySQL, AMQP, and S3-compatible implementations.