1.0.0 shipped the semver commitment: the exported names that survived to 1.0 are frozen, and the README now states the policy. These items carried over from the road-to-1.0 list — all internal or additive, so none of them need a major release:
isHipError — today the check is instanceof-based.
Within one module format that’s safe (the build keeps a single class
copy per format), but an app that mixes require('hipthrusts') and
import 'hipthrusts' gets two class identities (the classic dual-package
hazard). A brand/symbol check would make error translation immune.recommended-type-checked and reduce any in adapter internals.ModelWithFindById instance-member typing and
fromWrappedInstanceMethod in/out inference guarantees.Parking lot surfaced by production use. None is required for 1.x; each is recorded here so it isn’t lost. The first two are additive and could land in a 1.x minor if a concrete use case arrives; the rest are genuinely 2.0 (behavioral or vocabulary changes).
await req.text() + JSON.parse
before the lifecycle starts, so a malformed body yields a 422
ahead of everything — including the auth gate (see the README “auth
gate” section), which can reject an anonymous caller before their
inputs are validated but not before their body is read. Deferring the
read/parse until the first stage that actually consumes raw.body
(baseline extractInputs) would let the gate reject a caller before
any byte of their body is processed. A per-adapter change (lazy getter
/ thunk on raw.body). Complications: adapters that must read the body
regardless (e.g. HMAC-signed webhooks) and preserving
allowMalformedBody semantics.ctxRef primitives — done (additive; see CHANGELOG
Unreleased). The ctxRef marker family now has its own subpath,
hipthrusts/ctx-ref (exporting ctxRef, isCtxRef, CtxRef,
CtxRefReq, SpecReq), so alternative-backend loader flavors can reuse
the shared marker registry and derive the same deps-met requirement
without importing the mongoose entrypoint or restating private
machinery. hipthrusts/mongoose re-exports the previously-shipped names
for backward compatibility.gateAmbient stage / alias (2.0, cosmetic). The auth-gate
pattern bends the “extract” vocabulary (an extraction that throws).
A first-class gateAmbient alias would name the intent explicitly while
extractAmbient keeps its lift-only contract. Zero functional value —
naming only; the documented pattern already works. Alternative: never
bother.ambient.principal to a
top-level ctx.principal because that lift is the narrowing event
(Principal | null → Principal): contributions merge at the ctx top
level and cannot re-type an existing nested key. If a contribution could
declare “after this stage ambient.principal is non-null”, the lift
convention would become purely stylistic. Park until a concrete use case
justifies the type machinery.findById/findOne.{ resource, principals, operations }./byOwner/:id vs /byAnyone/:id).create- scaffold to show it off.hipthrusts/user stays as the ergonomic default).responseMeta extensions.Done items that used to live in TODO.md — pipeable composition (HTPipe),
framework-configurable adapters (Express/Fastify/Hono/Next/tRPC split), the
mongoose split (htMongooseFactory), and the test suite — are recorded in
CHANGELOG.md.