All notable changes to this project are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. While the version is 0.x, breaking changes are expected and only require a minor bump; consumers pin an exact tag or Git revision rather than a range.

Unreleased

0.1.0 - 2026-08-21

Added

  • Bounded synchronous OpenAI-compatible text streaming through stream/5, including incremental SSE parsing, natural callback backpressure, early halt, terminal usage, redacted stream results, and deterministic cleanup.

  • Strict OpenAI-compatible function tools, assistant/tool replay messages, parallel returned tool calls with bounded schema-validated arguments, and redacted tool-call accessors.

  • Strict JSON Schema and JSON-object response formats with pre-admission target capability checks, a closed bounded schema dialect, exact local fixtures, recursive response validation, and canonical JSON output.

  • The error-openai-v2 contract, adding a model-scoped structured-output refusal outcome without retaining provider refusal text.

  • Public bounded OpenAI-compatible non-streaming text calls with validated and redacted requests, deterministic /chat/completions encoding, response and usage accessors, bounded codec-role JSON decoding, exact local wire fixtures, and one-attempt integration coverage.

  • The completed error-openai-v1 contract, including classified DNS, connection, TLS, HTTP framing, response-limit, status, documented provider code, and malformed-provider-response facts with exhaustive contract tests.

  • A runtime-gated HTTP/1.1 core with bounded DNS results, address-policy enforcement, one pinned TCP/TLS connection, exact request serialization, strict incremental response parsing, content-length and chunked framing, bounded informational responses and trailers, and deterministic close on every outcome. Raw TCP/TLS and property-based fragmentation tests exercise arbitrary JSON echo traffic without exposing the provider call API early.

  • Opaque, redacted target, credential, absolute-deadline, process-budget, and closed error contracts, including current address-policy and bearer-token validation.

  • A fail-stop physical-admission runtime with atomic global/group ceilings, fixed-role bounded attempt trees, caller-retained terminal handoff, bounded concurrent cleanup, provisional caller-death-safe startup, generation fencing, and readiness/counter snapshots.

  • Versioned resource-v1, process-v1, runtime-control-v1, and error-base-v1 data contracts for consumer integration checks.

  • Bounded socket backends for plain TCP and verified TLS, behind one internal recv_up_to/3 contract: prompt partial delivery, an exact per-call maximum, unread bytes preserved in order, and timeout, closure, and transport failure told apart. Both are proven by one conformance suite against scripted local TCP and TLS peers, including deadline, peer-close, owner-death, flow-control, certificate-chain, and fragmentation cases.

  • docs/transport-backend.md: the retained socket/TLS decisions and the measurements behind them.

  • Platform-trust lookup runs under the attempt's deadline, in a process the caller can walk away from and cannot be hurt by.

  • Repository infrastructure: Mix project, formatter, Credo, Dialyzer, ExDoc, StreamData, and usage-rules tooling.

  • Repository-owned gates mix check and mix full_check, implemented as scripts under scripts/ci/ and shared by the Git hooks and GitHub Actions.

  • GitHub Actions workflow: quality, tests on Linux and macOS, Dialyzer, docs, and release/package verification on the supported toolchain.

  • Protected, main-only Hex dry-run and publication automation with exact version/tag checks, step-scoped credentials, immutable third-party actions, and the complete release gate.

  • The reserved public namespace PtcLlmHttp and its OTP application.

Changed

  • Elixir 1.20 and Erlang/OTP 29 are now the declared and enforced minimums, matching the only consumer and the development/CI baseline. Earlier OTP releases remain transport-spike evidence but are not supported runtimes.

Fixed

  • mix check and mix full_check now fail when a step fails. Their entry scripts ran every step regardless and reported the last one's status, so a Credo or formatting failure could pass the gate.