Application Recipes¶
Compact routes for tasks that recur across Kinetis applications. Each recipe names the pages that hold the actual contract and routes to them rather than restating it — read those before writing code. Start at Agent Workflow if a task does not match one of these.
JSON HTTP endpoint with request DTO validation¶
Guides: Routing & Validation, Appendix: Routing & Validation.
Lifecycle/I-O: the request DTO and its controller resolve fresh from the request scope on every request; nothing about one request’s input persists past it.
Security/integrity: validation attributes run before the controller does, so a malformed request never reaches application code — put every constraint on the DTO, not in checks scattered through the controller.
Verification: a Testing
TestClientrequest for a valid payload and for each violation, asserting the422and its violation list.Non-goal: hand-written validation duplicating what a constraint attribute already expresses.
Browser form with session, CSRF, and validation errors¶
Guides: Sessions & CSRF, Routing & Validation, Middleware, Views.
Lifecycle/I-O: the session is request-scoped through
SessionMiddleware; see Appendix: Container Lifecycle when a value needs to outlive one request some other way.Security/integrity:
CsrfMiddlewareruns afterSessionMiddlewarein the pipeline; every state-changing form carriescsrfToken(), and a missing or mismatched token is refused before the controller runs. A valid submission with an invalid field gets the default422application/problem+jsonresponse; an application that wants an HTML redirect or a re-rendered form instead must implement and bind its ownValidationExceptionRendererInterface, per Middleware’s “Rendering validation failures”.Verification: a
TestClientsubmission with a missing or wrong token asserting the refusal, one with a valid token and an invalid field asserting the default422problem document, and — only when the application installs a custom renderer — a test of that renderer’s own response instead of assuming automatic form rendering.Non-goal: a CSRF token as the only protection on a state change that also needs its own authorization check.
Database-backed bounded list with pagination¶
Guides: Query Builder, Database.
Lifecycle/I-O: the link resolves from the shared connection
kinetis/database-bridgeregisters onAppScope— under a persistent worker, its connection pool — not a request-scoped object; a query still suspends the calling Fiber rather than blocking the worker.Security/integrity: page size and any filter come through the same validated DTO as the rest of the request, and every value binds as a parameter rather than being interpolated into SQL.
Verification: an integration test against a real database asserting the page boundary — the right rows, in order, with a stable cursor across an intervening write.
Non-goal: an unbounded
SELECT, or anOFFSETwalk over a table the application does not control the size of.
Transactional mutation with explicit failure behavior¶
Guides: Database — “Transactions”, “When a write’s outcome is unknown”, “Unique violations”.
Lifecycle/I-O: one
TransactionGuardper unit of work; every statement runs on the transaction it hands the callback, never the outer link.Security/integrity: a unique key settles a race instead of a read-then-write check, and a
COMMITthat throws leaves the outcome unknown — never retried as though it were a rollback.Verification: a test that fails a statement mid-transaction and asserts nothing committed, plus one that exercises the unique-violation path.
Non-goal: several related writes left as separate, individually committed statements outside one
transaction()call.
Queue job with retry/idempotency considerations¶
Guides: Queue, the installed backend’s own page (Queue (Redis), Queue (SQL), Queue (SQS), Queue (RabbitMQ)), Appendix: Queue Contracts.
Lifecycle/I-O: a job’s constructor arguments are its whole state — nothing request-scoped from the code that pushed it survives to the worker that runs it.
Security/integrity: delivery is at least once, so a handler that is not safe to run twice needs a unique key recorded in the same transaction as its effect, per Queue’s “A job can run more than once”.
Verification: run the handler twice with the same identifier and assert one effect, and exercise the permanent-failure path at
maxAttempts.Non-goal: treating delivery as exactly-once. Leaving
maxAttemptsunset defers to the worker’sQUEUE_MAX_ATTEMPTS, which defaults to0and gives up after the first failed attempt — no setting retries a job forever, and a released job is retried immediately with no backoff.
Outbound HTTP integration with deadline/cancellation/uncertain-write semantics¶
Guides: HTTP Client, Appendix: HTTP client contracts.
Lifecycle/I-O:
withTimeout()bounds the whole call, below whatever deadline is waiting on it, andwithMaxResponseBytes()bounds the reply.Security/integrity: a
TransportorTimeoutfailure on a non-idempotent write means the request may already have taken effect — look up the result, or use the API’s own idempotency key, rather than resending it blind.Verification: a test against a mock HTTP client for the timeout and transport-failure branches, asserting the lookup path runs instead of a blind repeat.
Non-goal:
withRetries()on an endpoint whosePUT/DELETEis not actually idempotent.
Broadcast update with truthful delivery semantics¶
Guides: Broadcasting.
Lifecycle/I-O: triggering an event suspends the calling Fiber while the request to the broker is in flight; nothing about the broadcast is request-scoped state.
Security/integrity: authorize every
private-/presence-channel with#[BroadcastChannel]; an unauthorized subscription is refused before it reaches the broker.Verification: a test of the authorizer method’s own logic — accept and reject cases — rather than a live broker.
Non-goal: reading the trigger request’s success as proof a subscribed client received the event. This package reports whether the broker accepted the event, not whether, or when, any client saw it.
Application-owned MCP resource or tool¶
Guides: Model Context Protocol (MCP), Appendix: MCP Reference.
Lifecycle/I-O: each message resolves and disposes its own request scope, the same way an HTTP request does, per Model Context Protocol (MCP)’s “Each message is its own request”.
Security/integrity: a tool’s arguments validate exactly like a request DTO’s fields, and nothing about the caller’s identity persists past its own message.
Verification: a unit test of the tool or resource method’s own domain logic, plus a separate test that drives the registered definition through
McpServer::handle()(see Appendix: MCP Reference’s “Malformed requests”) to exerciseMcpDispatcherargument hydration, validation, and the MCP result envelope — a direct method call bypasses both.Non-goal: this documentation.
mcp-docsserves only its own fixed page catalogue, whether reached directly or through Orbitron; an application’s own tools and resources arekinetis/mcp’s job.
See also¶
Agent Workflow — establishing installed versions and routing a task here in the first place.
Agent Correctness Review — the review checklist once a change is made.