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 compilenow 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 --checkis 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
Recreateupdate 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
effectuscfor 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 usesuniversefor compatibility. - The Go API now accepts a context-aware executor without a deprecated
Domethod. - 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 compileoutput is binary checked IR, not legacy JSON. Consumers must parse the artifact through the checked IR API.- Production
effectusdrequires PostgreSQL for durable admission and recovery. - Normal daemon startup validates the database schema and does not apply DDL.
- Use
effectusd --database-migrations=applywith a DDL credential before deployment. - The
legacy-applymigration 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
namespaceanduniverse. The namespace identifies the tenant, and the universe identifies the projection. - HTTP clients must reuse one
Idempotency-Keyfor retries of the same logical request. - gRPC clients must use
typed_facts. The legacyfactsfield remains for wire compatibility. - Adapter embedders must call
TypedFact.Acknowledgeafter durable processing when the callback is present. - The VS Code extension requires a compatible
effectuscexecutable. The extension does not include a fallback language server.
Database migration¶
Version 0.2.1 adds migration 10004_retention_indexes.sql.
- Back up all
effectus_*tables and test the restore. - Stop the old singleton pod.
- Run
effectusd --database-migrations=applywith the DDL credential. - Start version 0.2.1 with the DML credential and schema validation mode.
- 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.