Unreleased — highlights
Highlights accumulate here as work lands, and this heading is retitled to the dated release heading at release time. The heading is deliberately unbracketed: a bracketed form collides with release automation's version-header pattern and would be read as a release.
Nothing yet for the next release.
[0.10.0] - 2026-09-22
The public-surface and release-truth release: a documented surface an evaluator can read end to end, a storage-schema default that matches what existing installs already have, and an operator surface with a theme lane and row-level deep links.
Breaking changes
None. No commit in this release carries a breaking-change footer or a breaking-change subject marker, and the one default that did change — the storage schema — was changed toward what every existing install already runs, which is what makes this release non-breaking rather than merely declared so. See "Storage schema default" below.
Required action
Four adopter actions remain. None of them break an install that does nothing, but each one leaves something unchanged that you probably wanted changed.
- S3 export adopters — the export HTTP client moved from
:hackneyto{:req, "~> 0.7"}, and the:ex_awsfloor rose from~> 2.4to~> 2.7. Swap the dependency and raise the floor in your hostmix.exs; a raised floor is not additive. - Operator-surface mounters — two new routes,
POST <path>/themeand<path>/rows/:table/:record_id, must pass any method allowlist, proxy rule, or Content-Security-Policy in front of your/auditmount. - Custom
Threadline.Storageadapters — theThreadline.Storage.put/2callback narrowed to binary content. This is visible to Dialyzer with no runtime change; update your adapter's typespec. - Callers of implementation modules — 25 implementation modules became
@moduledoc false. They remain callable for Threadline's own composition, but they are no longer a supported surface.
Storage schema default
Threadline-owned tables, functions, and triggers now default to the host's
public schema. A dedicated schema became an explicit opt-in:
config :threadline, storage_schema: "threadline", set before
mix threadline.install.
- Existing installs need no action. The default now matches the schema your install already generated into, so the read paths and your already-deployed triggers keep agreeing about where Threadline-owned objects live. This is settled by the change in this release, not by an earlier one.
- New installs should opt in. The default no longer provides schema
isolation. Choose
storage_schemabefore you run the installer — the choice is frozen at generation time, and changing it later is deliberate migration work rather than a runtime config edit.
Added
- Architecture documentation — rewrote How Threadline Works as an end-to-end visual architecture guide and added a source-driven Code Walkthrough, with dark/light Mermaid rendering and the Threadline mark as the HexDocs favicon.
- Operator-surface theme lane —
threadline_operator_surface/2accepts:theme(:dark | :light | :system, default:dark), backed by a session-persisted picker served from the newPOST <path>/themeroute. - Row-level history deep links —
<path>/rows/:table/:record_idaddresses a single audited row's history directly, rather than only through a transaction.
Changed
Documented surface — generated module documentation now focuses on supported façades, returned data, extension points, integrations, the operator
Threadline.OperatorSurface.RouterandThreadline.OperatorSurface.Authboundary, and adopter Mix tasks. The following implementation modules that had pages in the 0.9 documentation are no longer listed:- Capture and lifecycle implementation: Threadline.Capture.Migration, Threadline.Capture.RedactionPolicy, Threadline.Capture.TriggerCaptureConfig, Threadline.Capture.TriggerSQL, Threadline.Export.CleanupTask, Threadline.Governance.ExportJob, Threadline.Governance.Migration, Threadline.Governance.RetentionRun, Threadline.Governance.SavedView, Threadline.Policy.RedactionPresenter, Threadline.Retention.Pruner, and Threadline.Semantics.Migration.
- Operator implementation: Threadline.OperatorSurface.Style, Threadline.OperatorSurface.Script, Threadline.OperatorSurface.Scope, Threadline.OperatorSurface.SessionPlug, Threadline.OperatorSurface.ExportAuthPlug, Threadline.OperatorSurface.Components.SurfaceHeader, Threadline.OperatorSurface.Controllers.ExportController, Threadline.OperatorSurface.Coverage.OnMount, Threadline.OperatorSurface.Coverage.Snapshot, Threadline.OperatorSurface.Exports.Filename, Threadline.OperatorSurface.Exports.FilterParams, Threadline.OperatorSurface.Live.ActorLive, and Threadline.OperatorSurface.Live.TransactionLive.
These modules remain callable for Threadline's own composition; this is a documentation-surface clarification, not runtime privacy or a change to supported façade behavior.
S3 export HTTP client —
:hackneygave way to{:req, "~> 0.7"}and the:ex_awsfloor rose to~> 2.7. Both remain optional dependencies; only hosts that export to S3 are affected.Threadline.Storage.put/2— the first argument narrowed from a path or content union to binary content.
0.9.0 (2026-06-03)
Features
[0.8.0] - 2026-06-03
Operator-surface release: the /audit admin UI matured into a coherent, branded operator console, backed by a fully automated (zero-human-verification) test gate.
Added
- Operator surface overhaul — dark "night infrastructure" theme; a Home task-launcher (Find / Verify / Prove) as the default
/auditpage; copy-to-clipboard affordances for correlation and transaction ids; evidence verdicts (Proven / Inferred / Unsupported) with drill-down history; forward "completion" links so every Verify/Prove screen reaches a done state; a scoped-view indicator and scope-aware empty states for support-read-only operators; explicit "all clear" success states; and restrained, brand-coherent motion. - Asset/CSP controls —
config :threadline, operator_surface_embed_scripts: falseopts out of the embedded (zero-dependency) copy-to-clipboard helper; the new "Assets and Content-Security-Policy" section inguides/operator-surface.mddocuments the inline style/font/script embeds and CSP guidance.
Changed
- Design system — consolidated onto tokenized status stripes and a letter-spacing scale, a canonical metric card (
tl-card--metric+[data-status]) and metadata row (tl-meta), and ARIA-driven selected/active state. - CI / quality — official GitHub Actions bumped to their Node 24 majors ahead of GitHub's forced migration; an opt-in/nightly flake-detection gate; and test-determinism hardening across the suite. The operator-surface behaviors are locked by deterministic LiveView + Playwright assertions that gate every PR.
0.7.0 (2026-05-30)
Features
- documentation: add Configure Threadline subsection to getting-started (7b929a1)
- documentation: add host-repository wiring prerequisite to the production checklist (a07775d)
- operator surface: wire the schemas mount and synchronize operator-surface examples (17507ba)
- auth integration: add the PhxGenAuthReference.Audit guide module (2836be1)
Bug Fixes
- ci: format the phx-gen-auth integration contract for the ci.all gate (e04f275)
- operator timeline crash on correlation_id filter (+ release-please changelog guard) (43a6f23)
- operator-surface: prevent timeline crash on correlation_id filter (d62e509)
- release: run publish chain when release-ref succeeds via dispatch (19c7549)
- release: use hex.build preflight instead of verify.release in CI (d4413ef)
[0.6.0] - 2026-05-27
Threadline 0.6.0 is the adopter-ready release: it packages the in-repo stack since 0.5.0 — the Evidence plane (Threadline.Evidence, proof vocabulary, /audit/evidence), the blessed audited write path (Threadline.Audit.transaction/3), and operator/demo surfaces from the realistic walkthrough — so Hex evaluators and pilot hosts see the same truth the library already ships in-tree.
Added
- Evidence plane —
Threadline.Evidence,Threadline.Evidence.Proof,Threadline.Evidence.Subject, evidence persistence schema, andmix threadline.evidence.showfor machine-readable proof export. - Audited write path —
Threadline.Audit.transaction/3as the blessed helper wrapping capture + semantics in one transaction. - Operator and evidence surfaces —
/audit/evidenceLiveView, host-ownedevidence_authorize_fn(not inherited from/auditauth), and viewer parity with coverage/policy Mix tasks. - Reference composition (sigra-reference) — example app and maintainer walkthrough demonstrate end-to-end audited writes and evidence mounts; see
examples/threadline_phoenix/README.mdand walkthrough docs.
Changed
- Public documentation and evidence-plane contract — Evidence-plane contract locks across public docs: canonical non-goals list, shared verdict vocabulary, and narrower
/audit/evidencesupport language. Public guidance treats/audit/evidenceas a separately authorized capability under thephoenix-surfacelane instead of a blanket/auditinheritance claim. - Release metadata — install snippets target
{:threadline, "~> 0.6"}; Hex metadata and adoption-pilot distribution preflight align with0.6.0.
Deprecated
- Manual
SET LOCALGUC recipes and hand-rolledrecord_action/2-only write paths remain supported as legacy escape hatches; new code should preferThreadline.Audit.transaction/3.
Breaking
- None for existing
capture-onlyandphoenix-surfaceadopters who do not opt into Evidence or the audited write helper.
Upgrade from 0.5.x
- Bump dependency to
{:threadline, "~> 0.6"}in hostmix.exs. - Run
mix deps.getandmix deps.compile. - If using Evidence: apply evidence schema migrations from library docs / example migrations before calling
Threadline.EvidenceAPIs. - Wire
evidence_authorize_fnonthreadline_operator_surface/2when mounting/audit/evidence— it does not inherit timeline/exportauthorize_fn. - Adopt
Threadline.Audit.transaction/3for new write paths; keep legacy GUC/record_action/2only where migration cost is high. - Use
mix threadline.evidence.show(not the earlierverify.evidencealias) for CLI proof export. - Re-run host verification:
mix threadline.verify_coverage,mix verify.doc_contract(host), and operator-surface smoke tests if mounted. - See
guides/upgrade-path.mdfor lane matrix (capture-only,phoenix-surface,phx-gen-auth-reference,sigra-reference) and surface deprecation policy. - ExDoc sidebar adds Evidence group and Core API entries for Audit, Query, Investigation, ChangeDiff.
- Maintainer pre-flight before tag:
mix verify.releaseon a clean tree (seeCONTRIBUTING.md). - Apply evidence migrations before enabling
/audit/evidencein production — schema must exist before first proof query. - Deny
/audit/evidencewith the same host-owned auth UX as timeline/export; do not rely on blanket/auditsession checks. - Correlation filter semantics on timeline/export are unchanged from 0.5.x — no migration needed for existing query params.
- Re-run
mix threadline.gen.triggersafter evidence schema changes if audited tables gain new columns. - Confirm
evidence_authorize_fnreturns explicit deny reasons for operator logs — inherited/auditauth is not sufficient.
[0.5.0] - 2026-05-08
Threadline 0.5.0 is the integration-breadth release: the package now ships a narrower and more honest support matrix, a first-party Sigra/Phoenix reference path, canonical admin and support-read-only operator-surface mount recipes, an explicit threadline_web extraction-readiness scorecard with a documented stay-in-tree decision, and a repaired shared authorization/scope contract that keeps auth and scoping host-owned across timeline, actor, transaction, and export flows.
Added
- Upgrade-path guide at
guides/upgrade-path.md— canonical lifecycle policy for the optional Phoenix/LiveView/HTML/PubSub surface. It distinguishescapture-onlyfromsurface-mounted, documents the supported compatibility matrix from declared deps + current lock resolution + CI coverage, and locks the surface-only deprecation/removal overlap policy in one place. - Integration breadth guide at
guides/integration-contracts.md— canonical host-integration contract for actor extraction, additive audit context, optional dependency posture, operator-surface composition, and fallback CLI workflows. - Support-matrix closeout — the project now names only the three proven lanes
capture-only,phoenix-surface, andsigra-reference, and the compile-without-optional / example / doc-contract proof chain is locked to those claims. - Sigra/Phoenix reference refresh — the first-party Sigra integration path and example app were refreshed to the current supported lines while keeping Sigra a soft dependency.
- Canonical access-tier runbooks — docs, example code, and tests now prove one shared host-owned
authorize_fncontract, one host-ownedscope_query_fnseam, and a real support-read-onlyexports: false/scoped-query story across the operator surface. - Packaging Boundary Scorecard —
guides/upgrade-path.mdnow records the explicitthreadline_webextraction-readiness rubric and the current answer: stay in-tree for now. - Coverage dashboard at
/audit/coverage— polled three-bucket coverage view with a surface-header pill on every operator-surface LV.?schema=NAMEURL param for multi-schema adopters; manual Refresh affordance with cancel-and-reschedule timer semantics; on-poll-error UX that keeps the last-good snapshot and ALWAYS reschedules. mix threadline.health.coverageparity Mix task with--jsonand--schema=NAMEflags. Viewer-only — always exits 0; the CI gate remainsmix threadline.verify_coverage.- Policy redaction drift viewer at
/audit/policy/redaction— read-only configured-vs-deployed redaction reconciliation with the three operator-safe statesConfig matches deployed,Drift detected, andCould not introspect. The surface never shows sample values; it exposes only column names and placeholder metadata, and drift/introspection failures instruct operators to rerunmix threadline.gen.triggersand apply the migration. mix threadline.policy.showparity Mix task with--json. Default output prints one summary line plus an alignedTABLE / STATUS / CONFIG / DEPLOYED / HINTtable;--jsonemits the same stable state taxonomy asconfig_matches_deployed,drift_detected, andcould_not_introspect. Viewer-only — drift does not exit non-zero by itself.Threadline.Health.trigger_coverage/1:schemaopt (default"public"). Both inner SQL queries are now parameterized; thepg_trigger/pg_classquery gains apg_namespacejoin so cross-schema results no longer leak into the covered set. Programmatic callers are responsible for sanitizing:schema; surfaces that take untrusted input validate at the edge.Three-bucket return shape on
Threadline.Health.trigger_coverage/1—[{:covered | :uncovered | :expected_uncovered, name}]. The third bucket is hardcoded to["schema_migrations"]plusconfig :threadline, :health, expected_uncovered_tables: [...], with:audit_anywayremoving entries. Existing pattern-match callsites (Continuity.assert_capture_ready!/2,TimelineLivedatalist) remain unchanged — the third tuple variant is purely additive.Threadline.Health.Policy.validate!/1— pure-stdlib config validator mirroring capture-time redaction validation. Validate at boot to fail loud on bad config.[:threadline, :health, :checked]event metadata gainsexpected_uncoveredmeasurement key (additive). Old subscribers reading onlycovered/uncoveredkeep working unchanged.[:threadline, :health, :checked, :error]sibling event for polled coverage check failures.mix threadline.verify_coverage --schema=NAMEadditive flag with the same edge validation contract as the new Mix task. Default behavior unchanged.
Changed
- Release metadata — install snippets now target
{:threadline, "~> 0.5"}, ExDoc names the operator surfaceOptional In-Tree, and the release/audit artifacts record the integration-breadth release boundary. - Operator-surface auth/scoping contract — the example app no longer relies on a socket-only auth bypass, and timeline, actor, transaction, and export flows all consume the same host-owned scope seam.
Threadline.Verify.CoveragePolicy.violations/2treats{:expected_uncovered, _}as covered-equivalent for tables not in the adopter's:expected_tables. Existing semantics preserved for tables IN:expected_tables.
[0.4.0] - 2026-05-06
Threadline 0.4.0 is the operator-surface foundation release: an opt-in web UI ships behind optional Phoenix/LiveView/HTML/PubSub deps so capture-only adopters keep zero new transitive bloat, the timeline / export query and Mix-task surface gains a :correlation_id filter that walks audit_actions.correlation_id via the action linkage, and exports learn an opt-in action-metadata pair (JSON action object, CSV include_action_metadata: true) so incident-response tooling can correlate rows back to the action that produced them — all without changing the default column order or breaking pre-0.4 callers.
Added
- Operator Surface — introduces an opt-in web UI via
Threadline.OperatorSurface.Router.phoenix,phoenix_live_view,phoenix_html, andphoenix_pubsubare now declared asoptional: truedependencies, meaning zero bloat for capture-only adopters. Hosts that want the UI must add these dependencies to theirmix.exsand use thethreadline_operator_surfacemount macro in their router. examples/threadline_phoenix—audit_transaction_idonPOST /api/postsandGET /api/audit_transactions/:id/changesreturning ordered changes withchange_diffmaps per row (composition demo; add auth in production).guides/domain-reference.mddocuments the pattern under COMP-EXAMPLE-INCIDENT-JSON.:correlation_idtimeline / export filter — optional keyword onThreadline.Query.timeline/2,timeline_query/1,export_changes_query/1, and export entrypoints. Values are trimmed; empty after trim,nil, non-binary, or longer than 256 UTF-8 bytes raiseArgumentError. When set, onlyaudit_changeswhose transaction has a matchingaudit_actions.correlation_id(viaaction_id) are returned (inner join; omit the key for previous behavior). SeeThreadline.Querymoduledoc for full rules.- Export JSON
actionobject — each change may include"action": {"id", "correlation_id"}when the transaction is linked to anaudit_actionsrow. - Export CSV
include_action_metadata: true— opt-in trailing columnscorrelation_idandaction_id; default CSV column order is unchanged. guides/adoption-pilot-backlog.md— matrix aligned to the production checklist for host pilots, plus distribution preflight and prioritized issue rows.- Telemetry (operator reference) —
[:threadline, …]event table inguides/domain-reference.md, linked fromguides/production-checklist.mdobservability section.
Changed
- README — Documentation list includes the adoption pilot backlog; ExDoc extras include the new guide.
[0.3.0] - 2026-05-05
Threadline 0.3.0 is the drop-in production adoption release for Phoenix SaaS teams: the release packages the first-hour SaaS onboarding path, Sigra-ready actor capture, operator incident guidance, and published capture baselines into one taggable Hex surface.
Added
- SaaS onboarding route —
guides/getting-started-saas.mdships as the first-hour Phoenix SaaS path and is now promoted from the package front door. - Sigra integration route —
guides/integrations/sigra.mdships as the best-supported auth bridge for Sigra-backed Phoenix hosts and is surfaced separately in ExDoc navigation. - Published capture baselines — the cold-single-table benchmark now anchors the release story with
insertat4.87 KIPS /205.13 µs,updateat4.30 KIPS /232.49 µs, anddeleteat7.61 KIPS /131.39 µs. - Release-surface contract —
test/threadline/release_artifact_contract_test.exslocks package files, ExDoc extras/module grouping, guide presence on disk, and release-only README / maintainer literals.
Changed
- README install and routing — the install snippet now targets
{:threadline, "~> 0.3"}and sends new adopters first to the SaaS quickstart and Sigra guide, with performance and incident docs one step deeper. - ExDoc information architecture —
guides/integrations/sigra.mdnow matches anIntegrationsextras group before the broader reference bucket, andThreadline.Integrations.Sigranow appears under a new pluralIntegrationsmodule group while Plug / Job / Health / Continuity / Telemetry remain under the singularIntegrationgroup. - Release pre-flight —
mix verify.releasenow validates the exact taggable tree through release metadata checks, pure file-read release contracts,MIX_ENV=dev mix docs, andmix hex.build. - Maintainer publish runbook —
CONTRIBUTING.mdnow documents themix verify.releasepre-flight and themainCI wait before taggingv0.3.0.
Deprecated
- No runtime API is deprecated in 0.3.0. Older install snippets using
{:threadline, "~> 0.2"}should be treated as stale documentation, not a supported release target.
Breaking
- No breaking runtime, dependency, config, or schema changes are introduced in 0.3.0.
Upgrade from 0.2.x
- Dependencies: no runtime dependency changes are required to adopt 0.3.0.
- Config changes: none.
- Migration steps: none beyond bumping the dependency and re-running your normal dependency fetch/docs sync flow.
- Sigra adapter: use
Threadline.Integrations.Sigra.actor_ref_from_conn/1as theThreadline.Plugactor_fnwhen your host already authenticates requests with Sigra.
[0.2.0] - 2026-04-23
Added
- Production checklist —
guides/production-checklist.mdfor first-week production review (capture, redaction, retention, export, observability, brownfield). Threadline.Query.timeline_repo!/2— resolves:repofrom filters or opts with clearArgumentErrormessages for timeline and export callers.- ExDoc —
guides/production-checklist.mdin extras;Threadline.RetentionandThreadline.Retention.Policylisted under Core API module groups.
Changed
- Timeline filter errors —
validate_timeline_filters!/1messages now point at allowed keys andThreadline.Export. - Validation order —
timeline/2and export entrypoints validate filter keys before resolving:repo, so unknown keys surface before a missing-repo error.
Release notes (capabilities since 0.1.0)
This minor release documents and packages capabilities shipped after 0.1.0 that were not fully reflected in that changelog entry:
- Before-values — optional
changed_fromon UPDATE when triggers are generated with--store-changed-from;Threadline.history/3loads the column when present. - Verify coverage & doc contracts —
mix threadline.verify_coverage, CIverify.threadline/verify.doc_contract, README fixture contracts. - Brownfield continuity —
Threadline.Continuity,mix threadline.continuity,guides/brownfield-continuity.md. - Redaction at capture —
config :threadline, :trigger_capture, per-tableexclude/mask, codegen validation. - Retention —
Threadline.Retention.Policy,Threadline.Retention.purge/1,mix threadline.retention.purge. - Export —
Threadline.Export,Threadline.export_csv/2,Threadline.export_json/2,mix threadline.export, shared timeline filter validation.
[0.1.0] - 2026-04-23
Added
Threadlinecore API plusThreadline.Semantics.ActorRefandThreadline.Semantics.AuditContextfor attributing writes to actors in audit context.Threadline.Plugfor resolvingActorReffromPlug.Conn, plus integration modulesThreadline.Job,Threadline.Health, andThreadline.Telemetry.Threadline.Semantics.AuditActionandThreadline.Captureschemas (AuditTransaction,AuditChange) for PostgreSQL trigger-backed row-change capture.- Mix tasks
Mix.Tasks.Threadline.InstallandMix.Tasks.Threadline.Gen.Triggersto generate migrations and table-specific audit triggers.