/changelog/ · Every release, newest first

The releases, in one place.

This page aggregates the releases of every harness crate on crates.io, newest first and grouped by month. It is generated from the same snapshot of each crate’s CHANGELOG.md that backs the History section of the module pages. crates.io remains the authoritative record of what shipped, and each crate’s full history — unreleased work included — lives on its module page; crates whose CHANGELOGs are not in the snapshot do not appear here.

61 crates, 260 releases, 6 Sep 2026 to 19 Oct 2026, at snapshot commit 0c5560b.

October 2026

  1. Dependency updates only.

  2. Dependency updates only.

  3. Dependency updates only.

  4. Dependency updates only.

  5. Dependency updates only.

  6. Dependency updates only.

  7. Dependency updates only.

  8. Dependency updates only.

  9. Dependency updates only.

  10. Dependency updates only.

  11. Dependency updates only.

  12. Dependency updates only.

  13. Dependency updates only.

  14. Dependency updates only.

  15. Dependency updates only.

  16. Dependency updates only.

  17. Dependency updates only.

  18. Dependency updates only.

  19. Dependency updates only.

  20. Dependency updates only.

  21. Dependency updates only.

  22. Dependency updates only.

  23. Dependency updates only.

  24. Dependency updates only.

  25. Dependency updates only.

  26. Dependency updates only.

  27. Other

    • update Cargo.lock dependencies
  28. Dependency updates only.

  29. Dependency updates only.

  30. Added

    • core chunk-and-reassemble completion for TextModel — split_text_chunks + complete_chunked (issue #847) (#894)
  31. Other

    • UrlSafety under Unreleased, and date the two undated 0.1.0 headings (#890)
    • UrlSafety port in core, with a Google Safe Browsing / Web Risk adapter (#857) (#880)
    • breaking supported module logging on Workers and native (#846) (#883)

    Added

    • A UrlSafety port (issue #857). check asks whether one URL is safe to fetch — malware, social engineering, unwanted software — and check_many batches the ask, verdicts in input order. Limits are checked locally before any network call by check_url / check_batch, which refuse with UrlSafetyError::LimitExceeded (2 048-byte URLs, batches of 500 — Safe Browsing v4's ceiling). The privacy contract is the port's first doc: the checked URL is a secret, so no implementation may log it or place it in an error string, and the one variant carrying provider text is scrubbed through scrub_text in Display. CachedUrlSafety decorates any implementation with a bounded, Clock-driven TTL cache that honours the provider's advised retention and never holds its lock across an await. The port only: no provider adapter ships yet, so the Google Safe Browsing / Web Risk adapter issue #857 asks for is still to come.
  32. Dependency updates only.

  33. Dependency updates only.

  34. Dependency updates only.

  35. Dependency updates only.

  36. Dependency updates only.

  37. Dependency updates only.

  38. Dependency updates only.

  39. Dependency updates only.

  40. Dependency updates only.

  41. Dependency updates only.

  42. Dependency updates only.

  43. Dependency updates only.

  44. Dependency updates only.

  45. Dependency updates only.

  46. Dependency updates only.

  47. Dependency updates only.

  48. Dependency updates only.

  49. Dependency updates only.

  50. Dependency updates only.

  51. Dependency updates only.

  52. Dependency updates only.

  53. Dependency updates only.

  54. Dependency updates only.

  55. Dependency updates only.

  56. Other

    • breaking supported module logging on Workers and native (#846) (#883)
  57. Other

    • UrlSafety port in core, with a Google Safe Browsing / Web Risk adapter (#857) (#880)
  58. Dependency updates only.

  59. Other

    • updated the following local packages: cratefield-secrets
    • Key-reference signing port (KeySigner), payloads (EvmTransaction, UserOperation, Eip712, SolanaMessage) with locally computed signing hashes, StaticGuardrails, the MemorySignAudit hash chain, the GuardedSigner composition, the SecretsSigner session-key provider, and the fakes / conformance kit (issue #761).
  60. Dependency updates only.

  61. Dependency updates only.

  62. Other

    • UrlSafety port in core, with a Google Safe Browsing / Web Risk adapter (#857) (#880)
  63. Dependency updates only.

  64. Added

    • module-owlpost verified Owlpost event receiver with typed inbound mail and delivery events (#673) (#853)
    • text-guard protect links, hashtags and caller-supplied spans (#836) (#851)
    • text-guard keep names, numbers, quotes and code across a model rewrite, and a word diff that keeps them whole (#836) (#837)
    • telegram a telegram feature that re-exports cratefield-adapter-telegram as cratefield::telegram, and a telegram-events feature that re-exports cratefield-module-telegram as cratefield::telegram_events: the Telegram Bot API adapter and the webhook, account-linking and consent-button module (#764)
    • sealed a sealed feature that re-exports cratefield-module-sealed as cratefield::sealed: the server half of client-side sealed blobs, with opaque ciphertext at rest, crypto-shred erasure and no server-side recovery (#757)
    • guardrails a guardrails feature that re-exports cratefield-module-guardrails as cratefield::guardrails: the policy engine every automated value-moving action must pass (#763)
    • signer a signer feature that re-exports cratefield-signer as cratefield::signer: signing by key reference behind guardrails and an audit chain, with session keys held in the Secrets store (#761)
    • turnkey a turnkey feature that re-exports cratefield-adapter-turnkey as cratefield::turnkey: the signer port's Turnkey provider, delegated access under policy (#761)

    Other

    • module-sealed + @cratefield/sealed: zero-knowledge sealed blobs (passkey PRF + recovery-code wraps, server outer wrap, no server recovery) (#757) (#867)
    • Signer port: sign by key reference via Turnkey delegated access or Secrets-held session keys, guarded and audit-chained (#761) (#865)
    • adapter-telegram + module-telegram: verified bot webhook, account linking, rate-limited messages, signed action buttons and a notifications channel (#764) (#864)
    • allowlists, caps, required simulation, hard denies and a kill switch for value-moving actions (#763) (#862)
    • Linear adapter (cratefield-adapter-linear) with comment and inbound status webhook (#559, part 2) (#850)
    • link EVM and Solana wallets to a signed-in account via SIWE/SIWS (plus a push-protection fix) (#838)
  65. Other

    • streaming completions (text, reasoning, tool-call and usage deltas) with idle/total timeouts and cancel-on-drop (#869)
  66. Dependency updates only.

  67. Dependency updates only.

  68. Dependency updates only.

  69. Dependency updates only.

  70. Dependency updates only.

  71. Dependency updates only.

  72. Dependency updates only.

  73. Dependency updates only.

  74. Dependency updates only.

  75. Other

    • the Tracker port over the Linear GraphQL API — file, status, comment and the Linear-Signature inbound status webhook (#559, part 2)
  76. Added

    • core Speech port — transcription and streamed synthesis, with Workers AI and OpenAI-compatible adapters (#861) (#868)
    • Speech over the OpenAI audio wire (issue #861): OpenAiCompatibleSpeech transcribes through audio/transcriptions and synthesizes through audio/speech at any base URL, under the same key and NotConfigured rules as the chat adapter, with the port's limits enforced before any request.
    • TextModel image inputs (issue #628): a Prompt's image Parts serialise into the request's content array ({"type":"image_url","image_url":{"url":"data:<media-type>;base64,…"}}), text-only messages keep their plain-string content, image input is opted into with OpenAiCompatible::with_images() (Capability::Images, off by default), an image prompt without it is refused with Unsupported before any request, and Prompt::check_images bounds are enforced locally first.

    Other

    • streaming completions (text, reasoning, tool-call and usage deltas) with idle/total timeouts and cancel-on-drop (#869)
  77. Added

    • core report per-provider mailer status in /__health (#793) (#845)
    • providers() reports the one provider behind the adapter — owlpost, configured or not, with health left unknown when the adapter carries no probe (issue #793).
  78. Dependency updates only.

  79. Dependency updates only.

  80. Added

    • core report per-provider mailer status in /__health (#793) (#845)
    • providers() reports the one provider behind the adapter — resend, configured or not, with health left unknown because whether the key works is only learned by sending (issue #793).
  81. Dependency updates only.

  82. Dependency updates only.

  83. Other

    • updated the following local packages: cratefield-core

    Added

    • First release, 0.1.0: the TelegramBot port over the Telegram Bot API, through the HttpClient and Clock ports. It sends, edits and deletes messages and answers callback queries under global and per-chat rate budgets, parses typed inbound updates, and verifies the secret-token webhook. The bot token never rides a log line (#764).
  84. Dependency updates only.

  85. Other

    • the Turnkey provider for the KeySigner port (#761): passkey-rooted sub-organizations with a delegated-access user, policy-scoped signing by key reference, and DENY-policy kill switches
  86. Dependency updates only.

  87. Dependency updates only.

  88. Dependency updates only.

  89. Dependency updates only.

  90. Added

    • core Speech port — transcription and streamed synthesis, with Workers AI and OpenAI-compatible adapters (#861) (#868)
    • Speech over the Workers AI binding (issue #861): WorkersAiSpeech transcribes with Deepgram Nova-3 (the default) or Whisper and synthesizes with Deepgram Aura, behind a SpeechRunner seam (SpeechBinding in production). Its default audio ceiling is lowered to WORKERS_AI_MAX_AUDIO_BYTES, because the binding takes the clip as a JSON number array.
  91. Dependency updates only.

  92. Other

    • fz doctor: fail on module SQL a venture's dependencies ship but no module declares (migration-not-declared) (#872)
  93. Dependency updates only.

  94. Added

    • core SSE response helper and AI SDK UI message stream encoder (#860) (#871)
    • core Speech port — transcription and streamed synthesis, with Workers AI and OpenAI-compatible adapters (#861) (#868)
    • core HttpClient outbound budgets — per-upstream token buckets, Retry-After backoff, daily quota alerts (#765) (#858)
    • core report per-provider mailer status in /__health (#793) (#845)
    • Chunk-and-reassemble completion (issue #847). split_text_chunks splits a long document into chunks of at most max_chars chars on paragraph boundaries, never inside a fenced code block (an oversized fence is the one atomic, oversized chunk), and the round trip is byte-exact; reassemble_text_chunks stitches the pieces back in order; TextModelChunkedExt::complete_chunked runs the split → per-chunk TextModel::complete → reassemble loop over any TextModel, so a long rewrite no longer has to fit inside one HttpPolicy response timeout. For generation-shaped jobs prefer TextModel::stream (issue #859) — chunking buys its bound with one round trip per chunk.
    • A Speech port (issue #861, ADR 0029). transcribe (audio in, a Transcript with optional word timings out) and synthesize (text in, a streamed Synthesis out), plus voices, capabilities and limits. Limits are checked locally before any network call by check_transcribe / check_synthesize, which refuse with SpeechError::LimitExceeded; wav_duration reads a WAV header's length without a codec. NotConfiguredSpeech is the standing placeholder for an unwired port.
    • The facade gains a sealed feature (issue #757). It re-exports the new cratefield-module-sealed as cratefield::sealed: the server half of client-side sealed blobs. It stores opaque ciphertext under a server outer wrap, erases by crypto-shredding, and has no server-side recovery path; @cratefield/sealed is the browser client. Nothing in cratefield-core changes.
    • The facade gains telegram and telegram-events features (issue #764). They re-export the new cratefield-adapter-telegram as cratefield::telegram and cratefield-module-telegram as cratefield::telegram_events: the Telegram Bot API adapter, and the verified webhook, account linking and consent buttons that never move value without a passkey. Nothing in cratefield-core changes.
    • The facade gains a guardrails feature (issue #763). It re-exports the new cratefield-module-guardrails as cratefield::guardrails: the policy engine every automated value-moving action must pass, with hard denies, allowlists, required simulation, micro-USD caps, a kill switch and audit. It denies by default and fails closed. Nothing in cratefield-core changes.
    • Mailer::providers() names the providers behind the port (issue #793). The new MailProvider { name, configured, healthy } reports a name and two verdicts and never a credential — a health report that leaked an API key would be a secret published on an unauthenticated endpoint. /__health gains a "mailers" array beside the unchanged "mailer" key; the two answer different questions (is the port wired, does the adapter hold its key), so a Resend with no API key reads configured and configured: false. healthy is None — and the JSON key is then omitted — for an adapter with no probe, because "unknown" is not "unhealthy". The method has a default, so every existing adapter compiles unchanged and still lists itself.

    Fixed

    • auth a webview can press the magic-link confirm button; themeable hosted pages and mail; friendly validation (#840) (#841)
    • A handler's Referrer-Policy: same-origin survives the no-store stamp (issue #840). /v1/* and token-carrying responses still get no-referrer, except when the handler itself answered with same-origin, which also sends nothing cross-site. Under no-referrer a browser sends Origin: null on a page's own form POST, which a login-CSRF guard must refuse from clients that send no Sec-Fetch-Site (webviews, older Safari). Any other policy a handler sets is still overwritten.

    Other

    • streaming completions (text, reasoning, tool-call and usage deltas) with idle/total timeouts and cancel-on-drop (#869)
    • module-sealed + @cratefield/sealed: zero-knowledge sealed blobs (passkey PRF + recovery-code wraps, server outer wrap, no server recovery) (#757) (#867)
    • adapter-telegram + module-telegram: verified bot webhook, account linking, rate-limited messages, signed action buttons and a notifications channel (#764) (#864)
    • allowlists, caps, required simulation, hard denies and a kill switch for value-moving actions (#763) (#862)
  95. Other

    • end-to-end Supabase import job on a real supabase start with an EarthOS-shaped fixture (issue #733) (#839)
  96. Dependency updates only.

  97. Fixed

    • auth a webview can press the magic-link confirm button; themeable hosted pages and mail; friendly validation (#840) (#841)

    Added

    • MailTheme::header_bg / header_text and display_font (issue #840), all opt-in: a solid header band behind the logo row, joined to the card (inline, so Gmail keeps it), and a heading font stack. Both are sanitised like the other colours and fonts; unset, every mail renders as before.
  98. Dependency updates only.

  99. Dependency updates only.

  100. Dependency updates only.

  101. Dependency updates only.

  102. Dependency updates only.

  103. Other

    • ADR 0030: the mail-theme record takes the number it was sharing (#875)
  104. Other

    • updated the following local packages: cratefield-core

    Added

    • First release, 0.1.0: the policy engine every automated value-moving action must pass. It checks hard denies, recipient and contract allowlists, required simulation and micro-USD caps, and it has a kill switch and an audit trail. It denies by default and fails closed (#763).
  105. Other

    • adapter-telegram + module-telegram: verified bot webhook, account linking, rate-limited messages, signed action buttons and a notifications channel (#764) (#864)

    Added

    • a Channel trait for extra delivery channels a venture registers with .channel(..), such as Telegram: one outbox row per registered channel on the notifications.channel topic, with the push adapters' error shapes (#764)
  106. Added

    • module-orgs service accounts, access grants and an audit log (#878) (#879)
  107. Dependency updates only.

  108. Dependency updates only.

  109. Other

    • updated the following local packages: cratefield-core

    Added

    • First release, 0.1.0: the server half of client-side sealed blobs. It stores the ciphertext the @cratefield/sealed client produces under a server outer wrap, serves it back byte-identical, erases it by crypto-shredding, and has no server-side recovery path (#757).
  110. Other

    • updated the following local packages: cratefield-core

    Added

    • First release, 0.1.0: Telegram in a venture, mounted at /v1/telegram. It verifies the secret-token webhook, links Telegram accounts with one-time codes, and sends consent buttons that can deny anything and approve anything harmless, but only arm a value-moving action until the owner confirms it with a passkey. With the notifications feature it is also a module-notifications channel (#764).
  111. Dependency updates only.

  112. Other

    • ADR 0030: the mail-theme record takes the number it was sharing (#875)
  113. Dependency updates only.

  114. Dependency updates only.

  115. Dependency updates only.

  116. Dependency updates only.

  117. Dependency updates only.

  118. Other

    • streaming completions (text, reasoning, tool-call and usage deltas) with idle/total timeouts and cancel-on-drop (#869)
  119. Other

    • streaming completions (text, reasoning, tool-call and usage deltas) with idle/total timeouts and cancel-on-drop (#869)
  120. Dependency updates only.

  121. Dependency updates only.

  122. Dependency updates only.

  123. Added

    • core Speech port — transcription and streamed synthesis, with Workers AI and OpenAI-compatible adapters (#861) (#868)
    • core HttpClient outbound budgets — per-upstream token buckets, Retry-After backoff, daily quota alerts (#765) (#858)
    • Speech port conformance (issue #861): speech_conformance and speech_conformance_not_configured, with the shared fixture constants, behind the port-conformance feature.
  124. Dependency updates only.

  125. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  126. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  127. Fixed

    • thirteen error-handling defects, plus make the guard-script tests survive a non-executable checkout (#828)
  128. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  129. Fixed

    • thirteen error-handling defects, plus make the guard-script tests survive a non-executable checkout (#828)
  130. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  131. Other

    • update Cargo.lock dependencies
  132. Other

    • update Cargo.lock dependencies
  133. Other

    • charge amounts, currency exponents and ledger entry types (#832)
  134. Fixed

    • thirteen error-handling defects, plus make the guard-script tests survive a non-executable checkout (#828)
  135. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)

    Added

    • A provider-neutral billing lifecycle, in billing (issue #593, ADR 0025). New pure types and functions — LifecycleEvent and its LifecycleKind, Status, SubscriptionState, LifecyclePolicy, transition and gives_access — that map a Stripe or RevenueCat webhook onto a state and answer whether it grants access, with no I/O and no vendor payload parsing (that stays in the adapters, issues #600 and #601). Additive: no existing API changed and HARNESS_API is untouched.
    • TextModel image inputs (issue #628): Part (Text/Image), Turn::user_parts, Prompt::user_parts, Prompt::has_images, Prompt::check_images, Capability::Images, TextModelError::ImageLimit, the encode_image/encoded_image_len helpers, and the MAX_PROMPT_IMAGES/MAX_IMAGE_ENCODED_BYTES/MAX_PROMPT_IMAGE_ENCODED_BYTES bounds. The router and run_tool_loop gate Capability::Images like Capability::Tools.
    • StatusOnly, a request marker asking for the status line alone. An implementation that honours it returns no body and no body-describing headers, because there is no body to describe — cheaper than HEAD where the endpoint is already known and only liveness is wanted. It rides as a request extension exactly as HttpPolicy does and waives the body, not the ceilings; an implementation that does not read the extension answers the request like any other (#714).
  136. Fixed

    • thirteen error-handling defects, plus make the guard-script tests survive a non-executable checkout (#828)
  137. Fixed

    • thirteen error-handling defects, plus make the guard-script tests survive a non-executable checkout (#828)
  138. Fixed

    • close five input-validation gaps — an unescaped HTML sink, a javascript: URL, an unvalidated slug, an OAuth token sent to any host, and an unclamped page size (#826)
    • GET /v1/notifications?limit=0 no longer returns an empty inbox. The page size is clamped to 1..=INBOX_PAGE_MAX (the idiom module-orgs and module-crm already use) instead of only capped from above, so a zero limit is the default page rather than a page that looks full and hands back a next cursor for a page that cannot exist. A limit above the ceiling still clamps to INBOX_PAGE_MAX.
  139. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  140. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  141. Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  142. Other

    • image inputs (Part::Image) for the Anthropic and OpenAI-compatible adapters (#745)

    Added

    • Image input (issue #628): a Turn::user_parts message is sent as the Messages API content-block array, text and inline base64 images in order. Anthropic::supports now reports Capability::Images, and an image prompt over the port's bounds is refused (TextModelError::ImageLimit) before any network call.
  143. Added

    • adapter-colonizer mothership HTTP client (#675) (#799)
  144. Added

    • adapter-owlpost sending domains — create, list, get, verify, delete (#681) (#797)
    • adapter-owlpost suppressions and topic naming (#669) (#795)
    • adapter-owlpost typed webhook events and a verify-then-parse entry point (#668) (#796)
    • adapter-owlpost inbound messages — list/search, held, get, raw, reply, release (#682) (#798)
  145. Other

    • accept a set of expected hostnames (apex + www) (#802)
  146. Other

    • drop the stale release-plz hold comment (cratefield-tables promotion already done) (#722)
  147. Other

    • manifest registry entry, catalog detail, docs and example venture wiring (#791)
    • contacts, organisations and tags, with personal data declared (#738)
  148. Other

    • document the deferred confirmation mail, and correct every doc that still promises the join-time 503 (#806)
  149. Other

    • serve the CF08 provider protocol from a harness deployment, and apply the account provider last (#792)

    Added

    • (provider server) Privacy::serve_provider, so a deployment can answer the same signed protocol it calls out on: POST /v1/privacy/provider/{export,erase/plan,erase/apply} over this composition's own declarations, with the HMAC as the authorisation rather than ADMIN_TOKEN, and no routes at all where it was not opted in (#656).
    • HttpProvider::account(), marking the provider that holds the identity so it is applied last — unmarked providers in registration order, then the marked ones — in all three loops (#656).
  150. Other

    • seed the missing position-counter rows in migration 0007 (#801)
    • document the deferred confirmation mail, and correct every doc that still promises the join-time 503 (#806)
  151. Other

    • runtime-cloudflare HttpClient: cap the response body while streaming, and don't follow redirects (#809)
    • Actor port: per-key serialized state with transactional storage and alarms, on Durable Objects (#583) (#743)
    • Blob port: streamed reads and writes, multipart uploads and listing for objects above MAX_BLOB_BYTES (#586) (#741)

    Security

    • The response body is read as a stream under the HttpPolicy cap, so an upstream that never declares a content-length is refused at the chunk that crosses the cap rather than buffered first. Reading stops there and drops the platform's handle on the fetch, so an endless body costs one chunk past the cap instead of the isolate's memory. The platform offers no stream at all for a null-body status (204/205/304, or the reply to a HEAD), which is read as an empty body rather than a failed send, so the cap does not cost those replies the buffered read used to answer (#714).
    • Redirects are answered, not taken: the transport request asks for redirect: "manual", so no upstream can move the exchange to another host or down to http after the destination was vetted (#714).

    Added

    • StatusOnly request marker honoured: a request carrying it is answered from the status line alone, its body never read, and its body-describing headers (Content-Length, Content-Encoding, Transfer-Encoding) dropped, so a liveness probe of a large resource does not fail on a length it never asked for (#714).
  152. Other

    • Actor port: per-key serialized state with transactional storage and alarms, on Durable Objects (#583) (#743)
    • Blob port: streamed reads and writes, multipart uploads and listing for objects above MAX_BLOB_BYTES (#586) (#741)
  153. Other

    • Actor port: per-key serialized state with transactional storage and alarms, on Durable Objects (#583) (#743)
    • image inputs (Part::Image) for the Anthropic and OpenAI-compatible adapters (#745)
    • Blob port: streamed reads and writes, multipart uploads and listing for objects above MAX_BLOB_BYTES (#586) (#741)

    Added

    • TextModel image inputs (issue #628): the text_model_image_bounds_conformance port suite, and a FakeTextModel that answers image prompts and refuses an over-limit one before recording it.
  154. Other

    • schema-validated structured output (complete_json / complete_as) (#739)
  155. Other

    • Inbound mail: a verify-then-parse source in core, a Resend inbound adapter, and ADR 0028 for channels (#563) (#734)
  156. Other

    • Stripe customer portal sessions and subscription lookup (#589) (#740)
  157. Other

    • one branded instance per app; cratefield-auth-* crates; Owlpost mail (#778)
  158. Other

    • Supabase import: plan.json, bare fz import supabase dry run, --apply --plan drift check and target extension preflight (#754)
    • Supabase import: record per-item dispositions (covered/waived) in a file and merge them into the report (#752)
  159. Other

    • Stripe customer portal sessions and subscription lookup (#589) (#740)
    • schema-validated structured output (complete_json / complete_as) (#739)
    • Venture CORS: accept browser-extension origins (chrome-extension, moz-extension, safari-web-extension) (#737)
    • Inbound mail: a verify-then-parse source in core, a Resend inbound adapter, and ADR 0028 for channels (#563) (#734)
  160. Other

    • Supabase import: plan.json, bare fz import supabase dry run, --apply --plan drift check and target extension preflight (#754)
    • Supabase import: record per-item dispositions (covered/waived) in a file and merge them into the report (#752)
    • import-supabase keep the crate version out of the fixture-report snapshot (#786)
    • Supabase inspect: drop managed-schema policies, route storage policies to their buckets, flag RLS-on/no-policy tables (#751)
  161. Other

    • one branded instance per app; cratefield-auth-* crates; Owlpost mail (#778)
  162. Other

    • Venture CORS: accept browser-extension origins (chrome-extension, moz-extension, safari-web-extension) (#737)
  163. Other

    • deliver within the per-module ScheduledBudget via Outbox::drain_within (#554) (#736)
  164. Added

    • tables-api a composite key gets its single-row routes at /{table}/__by (#153) (#475)
    • tables-api ?sort= on the page route and in a batch read (#383)
    • tables-api several declared reads in one request (#381)
    • tables order a page by a declared column (#380)
    • tables filter a page, and fix the nullable column it uncovered (#378)
    • tables-api serve the writes the surface already publishes (#374)
    • a venture publishes the tables it declares (#372)
    • tables-api writing a declared table, with ownership enforced (#369)

    Fixed

    • tables-api publish cratefield-tables-api so the facade can package (#787)
    • core ERRORS.md covers every crate's problem slugs, and a duplicate slug fails CI (#419) (#552)
    • tables-api tenant-members fails closed where membership cannot be checked (#385) (#424)
    • the manifest's vocabularies are checked against the types they mirror (#404)
    • tables-api a conflict is the engine's phrase, not the word "unique" (#393)
    • a subject column must be able to hold a caller's id (#391)
    • tables a json column is not filterable, in either path (#390)
    • tables a filter for a null asks IS NULL, not = NULL (#389)
    • tables-api a composite-key table publishes only the routes it has (#387) (#388)
    • tables-api the cursor the server hands back is one it accepts (#379)

    Other

    • Scheduled work runs on a cooperative per-module budget, with a budget-aware Outbox drain (#537) (#543)
    • /__surface publishes an output schema for table reads, so public-read rows can be typed (#517)
    • Close four existence oracles: signup timing, owner-table conflicts, passkey issuance, Stripe signature compare (#487)
    • adr a composite key is addressed by query, not by path (#387) (#422)
    • two names that point at nothing (#410)
    • tables-api a declared table's redaction and anonymisation are real (#397)
    • tenant-members admits any verified caller, and say so (#385) (#386)
    • a writable declared table does not make a venture demand a captcha (#377)
    • a declared table's privacy block reaches export and erasure (#375)
    • The generated module serves the tables it declares (#370)
    • The routes, so a declared table is actually reachable (#368)
    • Reading a declared table, with the access level applied (#366)
    • The decision about who reaches whose rows (#364)
  165. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • tool calling (ToolSpec, tool_calls, run_tool_loop) across the Anthropic and OpenAI-compatible adapters (#665) (#705)
  166. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  167. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • tool calling (ToolSpec, tool_calls, run_tool_loop) across the Anthropic and OpenAI-compatible adapters (#665) (#705)
  168. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  169. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  170. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  171. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  172. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  173. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • tool calling (ToolSpec, tool_calls, run_tool_loop) across the Anthropic and OpenAI-compatible adapters (#665) (#705)
  174. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  175. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  176. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  177. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  178. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  179. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  180. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  181. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  182. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  183. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  184. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  185. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  186. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Added

    • import-supabase inspect a Supabase project read-only and write the migration report (#658) (#697)

    Other

    • Import users from another provider: bcrypt verified and upgraded on login, import identities, fz auth import (#650) (#700)
  187. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  188. Added

    • TextModel tool calling (ToolSpec, tool_calls, run_tool_loop) across the Anthropic and OpenAI-compatible adapters (#665) (#705)

    Changed

    • Breaking (found by cargo-semver-checks): ports::text_model::Turn is now #[non_exhaustive] and no longer derives Eq, so it is built with Turn::user, Turn::assistant, Turn::assistant_tool_calls or Turn::tool_results rather than a struct literal; TextModelError is now #[non_exhaustive], so a match on it outside core needs a wildcard arm (#705).
  189. Added

    • import-supabase inspect a Supabase project read-only and write the migration report (#658) (#697)
  190. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  191. Added

    • mail-templates branded mail in each venture's own style for every module that sends mail (#715) (#716)
    • MailTheme (brand name, wordmark, hosted logo and alt text, light and dark Palettes, font stacks, radii, footer lines, contact), resolved from the venture's composition, its MAIL_THEME config, or its core Brand; and MailTheme::cratefield(), Cratefield's own theme.
    • Message, a builder for one mail (heading, paragraphs, facts, primary button, fallback link, code, notes, recipient and reason, footer links, lang and dir) rendering an email-client-safe HTML part with a dark variant and a plain-text twin, every value escaped (#715).
  192. Changed

    • Breaking: requires cratefield-tables 0.4 (was 0.3), which moved to core 0.8, and so a minor rather than a patch bump (#712).

    Other

    • organizations, memberships, roles and invitations, with a membership check for modules, ventures and external apps (#698)
  193. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  194. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  195. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  196. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  197. Added

    • mail-templates branded mail in each venture's own style for every module that sends mail (#715) (#716)

    Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).
    • The confirmation and welcome mails render through cratefield-mail-templates in the venture's theme (layout, dark variant, preheader, text twin), replacing the askama templates; subjects are unchanged and the unsubscribe link moves to the footer. themed_templates(&theme) composes the venture's own MailTheme; default_templates() uses the theme resolved from the venture's Brand and MAIL_THEME (#715).
  198. Added

    • mail-templates branded mail in each venture's own style for every module that sends mail (#715) (#716)

    Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).
    • The notification email renders through the template registry as notifications/email, in the venture's theme via cratefield-mail-templates, so a venture can restyle or reword it. default_templates() and themed_templates(&theme) are new; subject selection, lang/dir, Content-Language and the one-click unsubscribe headers are unchanged (#715).
  199. Added

    • mail-templates branded mail in each venture's own style for every module that sends mail (#715) (#716)

    Other

    • organizations, memberships, roles and invitations, with a membership check for modules, ventures and external apps (#698)
  200. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Added

    • import-supabase inspect a Supabase project read-only and write the migration report (#658) (#697)
  201. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  202. Added

    • mail-templates branded mail in each venture's own style for every module that sends mail (#715) (#716)

    Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).
    • The confirmation and "you're in" mails render through cratefield-mail-templates in the venture's theme: a 600px email-client-safe layout with a dark variant, a preheader and a plain-text twin, replacing the askama templates. Subjects are unchanged; the confirmation gains an "ignore this if you didn't join" note. themed_templates(&theme) composes the venture's own MailTheme; default_templates() renders in the theme resolved from the venture's core Brand and its MAIL_THEME config, which also reaches override templates as theme in their data (#715).
  203. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  204. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  205. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  206. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  207. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  208. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  209. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  210. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  211. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • tool calling (ToolSpec, tool_calls, run_tool_loop) across the Anthropic and OpenAI-compatible adapters (#665) (#705)
  212. Changed

    • Breaking: requires cratefield-core 0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712).

    Other

    • updated the following local packages: cratefield-core
  213. Added

    • webhooks outbound webhook delivery module with per-endpoint secrets, retries, dead letters and replay (#536) (#544)
    • oauth-client reusable OAuth 2.0 client crate, with module-linkedin ported onto it (#531) (#547)
    • adapter-anthropic the first TextModel adapter, over the HttpClient port (#430) (#481)
    • changelog a module that mirrors a repository's releases and serves them (#418)
    • manifest a declared table becomes a module the venture composes (#153) (#358)

    Other

    • App JWTs, cached installation tokens, and a named GitHub webhook scheme (#623) (#637)
    • per-account third-party OAuth connections with sealed tokens, refresh and revoke (#624) (#638)
    • OAuth 2.0 device authorization grant (RFC 8628) issuing a venture-defined credential (#587) (#633)
    • CustomHostnames port in core, with a Cloudflare for SaaS adapter (#590) (#630)
    • a Mailer over the Owlpost API (#591) (#629)
    • comment op, inbound status webhooks, Freshdesk destination and the Jira Cloud adapter (#559, part 1) (#582)
    • OpenAI-compatible adapter, cached-token usage on every completion, shared TextModel conformance suite (#560) (#567)
    • cratefield-core 0.6.0 and every publishable dependent (#558) (#565)
    • Drop the Cargo.toml comments that still say published crates are publish = false (#495) (#548)
    • Remove the space runs from the Signer readiness message, and make the facade crate doc match NOT_LIBRARIES (#527)
    • Stop holding back cratefield-tables in release-plz.toml now that it is on crates.io (#513)
    • Docs accuracy: free-tier module copy, facade feature table, privacy erasure docs, cooldown declaration, removal consent flag (#509)
    • Classifier port, with your own TypeSafe key, Workers AI, or the LLM you already have (#501)
    • adapter-github-issues and adapter-webhook-tracker: the first two Tracker adapters (#482)
    • Release round: bump the 23 core dependents so their next publish requires core ^0.5 (#496)
    • anonymous usage telemetry any venture can compose, opt-out (#471)
    • The generated module serves the tables it declares (#370)
  214. Other

    • OpenAI-compatible adapter, cached-token usage on every completion, shared TextModel conformance suite (#560) (#567)
  215. Dependency updates only.

  216. Dependency updates only.

  217. Other

    • CustomHostnames port in core, with a Cloudflare for SaaS adapter (#590) (#630)
  218. Dependency updates only.

  219. Other

    • App JWTs, cached installation tokens, and a named GitHub webhook scheme (#623) (#637)
  220. Dependency updates only.

  221. Other

    • comment op, inbound status webhooks, Freshdesk destination and the Jira Cloud adapter (#559, part 1) (#582)
  222. Other

    • OpenAI-compatible adapter, cached-token usage on every completion, shared TextModel conformance suite (#560) (#567)
  223. Added

    • adapter-owlpost shared client, send options, batch and read (#667) (#685)

    Other

    • a Mailer over the Owlpost API (#591) (#629)
  224. Dependency updates only.

  225. Dependency updates only.

  226. Dependency updates only.

  227. Other

    • report metered usage to Stripe Billing Meters, idempotently (#662)
  228. Dependency updates only.

  229. Dependency updates only.

  230. Dependency updates only.

  231. Dependency updates only.

  232. Dependency updates only.

  233. Dependency updates only.

  234. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)

    Other

    • Route policy: let one module declare a signature verifier per webhook route (#595) (#632)
    • Production readiness fails when a module declares RateLimiter and none is mounted; a missing Workers limiter binding fails closed (#562) (#569)
    • Verify the cratefield-core 0.6.0 release round (#558) and fix a stale client-ts comment in the CLI manifest (#566)
  235. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)
  236. Added

    • core breaking add Destination::Colonizer { repo } and RoutingTracker::colonizer (#676) (#687)
    • core breaking name problem type URIs under the venture's own base (#557) (#581)
    • Payments carries a Merchant of Record (ADR 0027). New optional methods, each with a default, so every existing adapter compiles unchanged and HARNESS_API stays 1: verify_webhook_request(&HeaderMap, body) for providers that sign over several headers (Standard Webhooks; the default reads Stripe-Signature); create_portal_session with PortalSessionRequest/PortalSession in issue #589's shape; and get_dispute, list_disputes and close_dispute with Dispute, DisputeStatus, DisputePhase, DisputeListRequest and DisputePage in issue #602's shape. DisputeStatus::phase() folds a provider status into Open/Won/Lost/Closed; Dispute::event_key() is the Inbox key for one transition. The defaults answer PaymentsError::Unsupported. (#690)
    • Tracker::comment and TicketComment: add a note (optionally linking a URL) to an existing ticket, so a duplicate report links into the ticket it duplicates. The default impl refuses with TrackerError::Rejected naming the tracker, so existing adapters compile unchanged; RoutingTracker forwards it by destination. (#559)
    • Inbound status webhooks: the StatusWebhook trait, StatusUpdate, InboundStatusError and receive_status, which verifies a delivery with core's WebhookVerifier before the adapter ever parses it. (#559)
    • Destination::Freshdesk { domain } and RoutingTracker::freshdesk; no adapter ships for it yet. (#559)
    • Destination::Colonizer { repo } and RoutingTracker::colonizer; no adapter ships for it yet. (#676)
    • TicketState is now Serialize/Deserialize (snake case), so a state can cross the inbound webhook wire. (#559)

    Other

    • Blob port: presigned GET and PUT URLs for R2 through the S3 API (SigV4) (#622) (#663)
    • report metered usage to Stripe Billing Meters, idempotently (#662)
    • App JWTs, cached installation tokens, and a named GitHub webhook scheme (#623) (#637)
    • Webhook verification: Vercel (HMAC-SHA1) and GitLab (shared-token) schemes (#636)
    • Stream request and response bodies for routes a module declares (#585) (#635)
    • Usage metering: per-subject, per-period counters with an atomic check-and-increment (#588) (#634)
    • CustomHostnames port in core, with a Cloudflare for SaaS adapter (#590) (#630)
    • ADR 0025: provider-neutral billing lifecycle, entitlements and revenue ledger, fed by Stripe and RevenueCat (#592) (#631)
    • Route policy: let one module declare a signature verifier per webhook route (#595) (#632)
    • comment op, inbound status webhooks, Freshdesk destination and the Jira Cloud adapter (#559, part 1) (#582)
    • VectorIndex and Embedder ports, with Cloudflare Vectorize and exact in-process adapters (#561) (#568)
    • OpenAI-compatible adapter, cached-token usage on every completion, shared TextModel conformance suite (#560) (#567)
    • Production readiness fails when a module declares RateLimiter and none is mounted; a missing Workers limiter binding fails closed (#562) (#569)

    Changed

    • Breaking — problem type URIs are named under the serving venture's own base. Problem::type_uri now takes the venture's base as its argument, so the next release is 0.7.0 (a breaking change is a minor bump under 0.x): type is <public_url>/problems/<slug> — derived from the venture's public_url, overridable with the new Venture::problem_base(..) — and about:blank (RFC 9457 §4.2.1) for a venture with no public URL, instead of one hard-coded https://factory0.ventures/problems/ base for every venture. Problem::into_response renders the context-free about:blank and stores the problem in the response extensions; the harness's outermost layer re-renders the body under the venture's base, so every path that serves a problem — module handlers, the tenant and readiness gates, rejections, 429s — names the venture it served for; the runtimes' pre-router refusals (native 421, Worker 413 and unresolved-limiter 503) name it through the new Problem::into_response_with_base. Clients must match on the slug — the part after /problems/, auth/… namespaces included — never on the full URI. The slug list is unchanged (docs/ERRORS.md). (#557)

    A breaking change is pending here: Destination is an exhaustive enum and gained Freshdesk and Colonizer, so a match over it no longer compiles unchanged; the next release of core is therefore 0.7.0, not 0.6.1.

    • Destination::Jira { site } is documented as the bare hostname (acme.atlassian.net), not the hostname prefix: the new cratefield-adapter-jira refuses anything else, so the Basic credential cannot be sent to another host. (#559)
  237. Dependency updates only.

  238. Other

    • OAuth 2.0 device authorization grant (RFC 8628) issuing a venture-defined credential (#587) (#633)
  239. Dependency updates only.

  240. Dependency updates only.

  241. Other

    • per-account third-party OAuth connections with sealed tokens, refresh and revoke (#624) (#638)
  242. Other

    • OAuth 2.0 device authorization grant (RFC 8628) issuing a venture-defined credential (#587) (#633)
  243. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)
  244. Dependency updates only.

  245. Dependency updates only.

  246. Dependency updates only.

  247. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)

    Changed

    • breaking The confirmation mail is deferred: the entry lands on the request path and POST /v1/waitlist now always answers 202 {"ok":true}. Upgrading from 0.2.0 removes the 503 mail-not-configured a join used to return when no mailer was configured — with no mailer the entry is recorded as pending and no mail is sent, and the NotConfigured is only logged. The answer is deliberately identical for every row state so it leaks nothing about the address (#713).
  248. Dependency updates only.

  249. Other

    • OAuth 2.0 device authorization grant (RFC 8628) issuing a venture-defined credential (#587) (#633)
  250. Dependency updates only.

  251. Dependency updates only.

  252. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)

    Other

    • Blob port: presigned GET and PUT URLs for R2 through the S3 API (SigV4) (#622) (#663)
    • Stream request and response bodies for routes a module declares (#585) (#635)
    • CustomHostnames port in core, with a Cloudflare for SaaS adapter (#590) (#630)
    • VectorIndex and Embedder ports, with Cloudflare Vectorize and exact in-process adapters (#561) (#568)
    • Production readiness fails when a module declares RateLimiter and none is mounted; a missing Workers limiter binding fails closed (#562) (#569)
  253. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)

    Other

    • Blob port: presigned GET and PUT URLs for R2 through the S3 API (SigV4) (#622) (#663)
    • CustomHostnames port in core, with a Cloudflare for SaaS adapter (#590) (#630)
    • VectorIndex and Embedder ports, with Cloudflare Vectorize and exact in-process adapters (#561) (#568)
  254. Dependency updates only.

  255. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)
  256. Added

    • testing signed-delivery helpers and Owlpost/Colonizer HTTP fakes (#666) (#686)
    • core breaking name problem type URIs under the venture's own base (#557) (#581)

    Other

    • Blob port: presigned GET and PUT URLs for R2 through the S3 API (SigV4) (#622) (#663)
    • Stream request and response bodies for routes a module declares (#585) (#635)
    • Usage metering: per-subject, per-period counters with an atomic check-and-increment (#588) (#634)
    • CustomHostnames port in core, with a Cloudflare for SaaS adapter (#590) (#630)
    • comment op, inbound status webhooks, Freshdesk destination and the Jira Cloud adapter (#559, part 1) (#582)
    • VectorIndex and Embedder ports, with Cloudflare Vectorize and exact in-process adapters (#561) (#568)
    • OpenAI-compatible adapter, cached-token usage on every completion, shared TextModel conformance suite (#560) (#567)
  257. Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)

September 2026

  1. cratefield-core 0.6.0

    crates.io

    A breaking release: Port is an exhaustive enum and gained TextModel, Tracker, Classifier and Auth since 0.5.0, so a match over it no longer compiles unchanged. Every published dependent is re-released against ^0.6 in the same round, so the crates.io set resolves on one core again (#462, #464, #558).

    Added

    • webhook_signature: a generic HMAC-SHA256 webhook verifier (WebhookVerifier) with pluggable schemes (Svix, StripeStyle, ProviderScheme), plus SignatureVerification and a defaulted Module::signature_verification(), so a RoutePolicy::Signature route can be proved by a webhook_signature scheme instead of the Payments port; the boot gate then checks the module's secret key (webhook_secret_readiness) in place of the Payments leg. (#533)
  2. cratefield-core 0.4.0

    crates.io

    A major bump because it has to be: cargo semver-checks against the published 0.3.1 reports 11 major and 0 minor failures. Under 0.x that is 0.4.0. Every item under Changed below is one the tool found, not one read off the commit log.

    Note also that 0.3.0 and 0.3.1 were published without entries here; this one covers the surface as it stands against 0.3.1.

    Changed

    • Database::batch is gone. batch_atomic replaces it and has no default implementation, so every Database must provide it — the point being that a batch is all-or-nothing by contract rather than by hope. (#126)
    • Structs that could be built from a literal no longer can, having gained public fields: ModuleContext (unprotected_writes_accepted, personal_data), Ports (realtime, tenants), HarnessConfig (harness_secret_revoked, harness_venture), Action (policy) and Notification (icon, url, ttl, badge, silent, loc).
    • Message and SqlMigration are #[non_exhaustive], as are the Kid and SignerError enums — so literals and exhaustive matches on them need a rest pattern. (#255)
    • Port gained Realtime, which shifted the discriminants of HttpClient (9 → 10), Clock (10 → 11), IdGen (11 → 12) and Defer (12 → 13). Code casting a Port with as isize gets a different number.
    • PushError::Transient changed shape, and SignerError/Kid no longer have well-defined discriminants because they now carry data.
    • New variants on exhaustive enums: BlobError::TooLarge, HttpError::{ResponseTooLarge, DeadlineExceeded, BlockedDestination}, SignatureError::{WrongScope, RevokedKey}.
    • Kid no longer derives Copy, and HmacSigner is no longer UnwindSafe or RefUnwindSafe.

    Added

    The public surface went from 227 items to 362. The larger pieces:

    • Outbox — persist-before-defer delivery, so queued work survives the request that created it, with a subject column that keeps a queued row inside export and erasure. (#128, #266)
    • The personal-data catalogue — PersonalDataSet, PersonalDataCatalog, Disposition, CatalogEntry: every module declares what it holds about a person, and a table erasure cannot reach is published as its own fact rather than as "not personal data". (#244, #272, #274, #291)
    • Tenancy — Tenant, TenantId, TenantConn and tenant resolution. (#32)
    • Sidecar boundaries — events cross inbound only, identity and contract per response rather than at cold start, and a sidecar's tables are visible to the collision check. (#61, #62, #66)
    • Boot-time reconciliation, per module and per tenant. (#30)
    • Realtime and Blob ports, and Module::well_known routing.

    Fixed

    • A transport failure never reports the request URL. (#229)
    • One origin_of, used by the CSP builder. (#215)
    • One Retry-After parser, and APNs reads the date form. (#213, #214)
    • A table omitted from tables() no longer escapes every personal-data check. (#272)
  3. cratefield-core 0.2.0

    Added

    • Module::well_known(): a module can serve routes at /.well-known at the root (OIDC openid-configuration, jwks.json), where discovery agents look for them. Harness::build fails naming every module when two both provide one; nothing but /.well-known is ever mounted at the root. (#46)
    • cratefield_core::http::Form: an application/x-www-form-urlencoded extractor re-exported beside Json, with the same 64 KiB body limit and the same problem+json rejections (400 validation-failed, 413 request-too-large) — for cross-site form_post callbacks such as Sign in with Apple. axum's form feature is now enabled in the workspace dependency. (#46)
    • Conformance kit (cratefield-testing): a module with a well-known router is checked to mount at the root under /.well-known and never under /v1. (#46)