chore(release): 0.4.0 - #59
Open
Kilerd wants to merge 1 commit into
Open
Conversation
Kilerd
force-pushed
the
release/0.4.0
branch
2 times, most recently
from
August 1, 2026 12:51
58346ac to
658ae90
Compare
Bumps all three crates and the internal dependency ranges to 0.4.0, plus the README and the examples that pin a version. 0.4 completes Tiers 0-2 of the maturation roadmap (#41): the framework shell (config, errors, state, tasks, messager) is trustworthy, and the OpenAPI output covers components/$ref, error responses, spec customization, field metadata, validation-driven constraints and header/cookie parameters. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Version bump for the 0.4.0 release: all three crates, the internal dependency ranges, the README, and the examples that pin a version.
What 0.4 contains
Tiers 0, 1 and 2 of the maturation roadmap (#41) are complete.
Documentation, made real (#71)
http1), so#[api],Schematic,Operableand the entire OpenAPI layer were invisible on docs.rs — the framework's headline capability didn't appear in its published docs at all.#![deny(missing_docs)], and the 64 public items that needed documenting.Configuration, redesigned (#60)
[server]section.config.application.name→config.name,config.basic.port→config.server.port.#[config]makes the application's config extractable asState<Config>;State<ServerConfig>covers the bind settings.APP_SERVER__PORT=8080), and__is the path separator so snake_case fields likedatabase_urlare addressable ([config] Environment overrides only work for string fields #61, EnvironmentSource: typed fields can't be overridden, and snake_case keys are unaddressable mofa#2).Feature flags, trimmed (#70)
messageis gone — the message system is always available.cors/static_fileswere broken, not redundant:tower-httpwas declared with both sub-features, so wanting CORS also compiled the whole static-file stack. Each now enables only its own half.Correctness / trust (Tier 0)
DateTimeformat,Vecrequiredness, primitive names,serde_json::Value([schematic] Derive/schema correctness bugs #37, BUG: openapi of serde_json::Value should not be Record<String, never> #18)skip/default/skip_serializing_if([schematic] serde compatibility gaps: skip / default / skip_serializing_if #38)#[state]makesState<T>extraction actually compile ([state] State<S> handler extraction doesn't compile — no FromRef<GotchaContext> for S #26)Messagerwith application-state access ([cleanup] Remove or implement stub modules: empty state.rs, non-functional Messager #29)type: "void"([openapi] Handlers returning nothing don't compile, and()documents as an invalidtype: "void"#62)Framework identity (Tier 1)
GotchaApptrait and theGotchabuilder ([api] Unify the trait (GotchaApp) and builder (Gotcha) APIs #30)GotchaError+GotchaResultwithIntoResponse, replacing panics/unwraps ([error] Introduce a coherent framework error type (GotchaError + IntoResponse) #31)OpenAPI (Tier 2)
components/$refinstead of inlining — recursive types now produce a finite spec ([openapi] Emit components/$ref instead of inlining every schema #32)Result<T, E>is documented ([openapi] Document error / non-200 responses (Result<T, E>) #33).openapi(|spec| ..)to customize Info / servers / security ([openapi] Make top-level Info/servers/security customizable #34)#[schematic(...)]documentation metadata ([schematic] Make the #[schematic(...)] field attribute actually work #35)#[api(summary/deprecated/security)]plus header/cookie parameters —TypedHeader<T>,Header<T>/Cookie<T>,HeaderMap,Option<T>([api] No header / cookie parameter support in ParameterProvider #36)Validation (Tier 3, landed early)
Valid<Json<T>>backed by thevalidatorcrate; rejects with422and readable messages#[validate(..)]drives both the runtime check and the schema keywords — written once (builtin validator for json request #9)Breaking changes since 0.3.0
[application]to the top level, and[basic]becomes[server]. Nested env overrides use__(APP_SERVER__PORT).features = ["message"]should be dropped; the message system is always available.Responsible for Result<T, E>now requiresE: ErrorResponsible(blanket-implemented forE: Schematicand for(StatusCode, Json<E>))OperablegainedsummaryandsecurityfieldsGotchaRouterstores&'static Operableand buildsOperations at assembly timevalidator,axum-extra(typed-headeronly);mofa0.1 → 0.2Verification
Locally: every feature combination builds and tests,
gotcha_coreandgotcha_macrosuites, doctests (34),cargo clippy --all-features --workspace,cargo fmt --check, and a nightly--cfg docsrsdoc build with no warnings.Publishing (
gotcha_macro→gotcha_core→gotcha) and thev0.4.0tag happen after this merges.🤖 Generated with Claude Code