Changelog
All notable changes to @hosaka-fm/crate are documented here. The format follows
Keep a Changelog, and this project adheres to
Semantic Versioning.
[1.17.0] - 2026-08-04
Section titled “[1.17.0] - 2026-08-04”Changed
Section titled “Changed”- Re-vendored the live spec:
/api/v22.34.0 → 2.47.0 (thirteen contract versions). Regenerated types now cover: the structured track resolver (POST /tracks/resolve,GET /track),semantics/dictionary.json, themarket_vs_flow_divergence+artist_press_mentionsregistry surfaces (44 rows; the latter with a mixed-order keyset), and the artist dossier’s season of cluster-native facets —authorship,lineage, one-call profile (listen_flow/arrival/aura/dj_champion/radio_play),factsnames+portrait,visibilitycorrected badge cut,web_presenceDSP links, cluster-nativerights/creditsentries, andjournalism.signals.citedMentions[](cited articles). See the crate CHANGELOG 2.35.0–2.47.0 for contract details.
Stable from
1.0.0. The typed surface is regenerated fromspec/openapi.json, so type changes track the live crate API contract. Breaking API changes bump the major.
[1.16.0] - 2026-07-26
Section titled “[1.16.0] - 2026-07-26”Changed
Section titled “Changed”- Regenerated types against
/api/v22.34.0 — a catch-up across sixteen spec minors (2.18.0 → 2.34.0). New typed surface:GET /api/v2/tracks— title-first track discovery, with?fuzzy=true(substring),?source=mb|bandcamp|all(the new Bandcamp track corpus reaches underground/self-released titles the MB-linked catalogue can’t), and a per-resultsourcesprovenance array.GET /api/v2/resolvegains?isrc=<code>and?artist=&track=locator arms (recording → primary-artist cluster), plus the name-mint fallback so off-master artists resolve to a cluster instead ofnull(typed via the existing resolve response).GET /api/v2/semantics/dictionary— the fleet substrate dictionary.- Artist-dossier facets
authorship,lineage,facts+visibility,debut, andmarketplace. GET /api/v2/auragains theaboutlegibility block.- Surface registry 35 → 42 (tranches 7–10): the
GET /api/v2/surface/{name}enum + response union gain the new surfaces.
- Operation set grows accordingly (now 26 paths). Additive — no breaking changes to existing types.
[1.15.0] - 2026-07-14
Section titled “[1.15.0] - 2026-07-14”Changed
Section titled “Changed”- Regenerated types against
/api/v22.18.0 — registry tranche-6:sync.placement_claim_by_cluster_v1(claim-grain screen-placement drill-in; firstsyncsurface). Registry now 35 surfaces; theGET /api/v2/surface/{name}enum + response union gain the surface. Operation set unchanged.
[1.14.0] - 2026-07-14
Section titled “[1.14.0] - 2026-07-14”Changed
Section titled “Changed”- Regenerated types against
/api/v22.17.0 — the artistrightsfacet gains a cluster-anchoredledgerrights-registration dimension (registeredWorks/worksWithRegisteredIswc/distinctCowriters/cowritersWithMbid+ a SoundCloud leg; counts only). Additive onArtistDossierContract.rights; operation set unchanged.
[1.13.0] - 2026-07-13
Section titled “[1.13.0] - 2026-07-13”Changed
Section titled “Changed”- Regenerated types against
/api/v22.16.0 — registry tranche-5 addsmirror.cluster_authority_ids_v1(ISNI/VIAF/GND/LC/Discogs authority-ID crosswalk); 34 surfaces. Firsttext[]-typed response fields.
[1.12.0] - 2026-07-13
Section titled “[1.12.0] - 2026-07-13”Changed
Section titled “Changed”- Regenerated types against
/api/v22.15.0 — registry tranche-4 addspublic.spine_artist_name_published_view(ridden) andseen.artist_signal_known_since(the detection-time ledger); 33 surfaces total. Accessor API unchanged.
[1.11.0] - 2026-07-13
Section titled “[1.11.0] - 2026-07-13”Changed
Section titled “Changed”- Regenerated types against crate
/api/v22.14.0 — registry tranche-3 addsarchive_api_v1.artist_mention_daily(ridden per-source dated mention aggregate), bringing the generic surface registry to 31 surfaces. Accessor API unchanged (crate.surface(name, …)).
[1.10.0] - 2026-07-13
Section titled “[1.10.0] - 2026-07-13”Changed
Section titled “Changed”- Regenerated types against
/api/v22.13.0 — registry tranche-2 adds 24 seen surfaces (30 total), thepe-norm-v1-labelkeyspace, andnumeric/uuidfield types.SurfaceRows_*response unions now cover every accepted surface.
[1.9.0] - 2026-07-12
Section titled “[1.9.0] - 2026-07-12”crate.surfaces()→GET /api/v2/surface(the registry index) andcrate.surface(name, { cluster, after, limit })→GET /api/v2/surface/{name}— one generic accessor for the whole cluster-keyed read layer, keyset-paginated via the opaqueaftercursor.
Changed
Section titled “Changed”- Regenerated against
/api/v22.12.0 (registry go-live).
[1.8.0] - 2026-07-07
Section titled “[1.8.0] - 2026-07-07”Changed
Section titled “Changed”- Regenerated against
/api/v22.11.0 — MB Phase-3 scarcity + credits + placements facets.
- Corrected the
VERSIONconstant, which1.7.0had shipped as1.6.0(an unprotected red merge). Thecontract.test.tsVERSION === package.jsongate (ADX-7) now guards this.
[1.7.0] - 2026-07-07
Section titled “[1.7.0] - 2026-07-07”Changed
Section titled “Changed”- Regenerated against
/api/v22.9.0 — typedconnections.related[]withclusterId, plus the geography facet.
[1.6.0] - 2026-07-07
Section titled “[1.6.0] - 2026-07-07”crate.artistMaster()— the master grain, cluster-attached.
Changed
Section titled “Changed”- Regenerated against
/api/v22.8.0.
[1.5.0] - 2026-07-07
Section titled “[1.5.0] - 2026-07-07”crate.artists()— the genre-browse discovery grid.
Changed
Section titled “Changed”- Regenerated against
/api/v22.7.0.
[1.4.0] - 2026-07-07
Section titled “[1.4.0] - 2026-07-07”Changed
Section titled “Changed”- Regenerated against
/api/v22.6.0 — rights-readiness facet + keyless education-preview types.
[1.3.0] - 2026-07-06
Section titled “[1.3.0] - 2026-07-06”crate.aura()— per-artist convergence aura.
Changed
Section titled “Changed”- Regenerated against
/api/v22.4.1 (required-field tightening, artwork dimensions). Migration guide corrected.
[1.2.0] - 2026-07-06
Section titled “[1.2.0] - 2026-07-06”crate.artistBandcampRelease()— the cluster-attached Bandcamp release grain.
Changed
Section titled “Changed”- Regenerated against
/api/v22.3.0.
[1.1.0] - 2026-07-03
Section titled “[1.1.0] - 2026-07-03”Changed
Section titled “Changed”- Regenerated against
/api/v22.2.0 —searchgainsartist_cluster_id,resolvegainscandidates[], and_linksare declared across dossiers.
1.0.0 - 2026-06-30
Section titled “1.0.0 - 2026-06-30”First stable release. Targets crate’s cluster-first /api/v2 (OpenAPI 2.0.0). The catalogue
is now keyed on cluster_id — the artist is the root, and master/bandcamp are dimensions of
the artist dossier rather than top-level resources. This is a breaking change from the 0.x line
(which targeted /api/v1); see Migrating from v1 in the README.
crate.label(key, opts?)→LabelDossierContract. Labels are first-class in v2.?fields=sparse fieldsets onartist()anddossier.artist()via{ fields: [...] }— the response is default-rich (one round-trip); passfieldsonly to trim it. An unknown field name returns400 invalid_fields(added toCRATE_ERROR_CODES).- RFC 8594 deprecation surfacing:
Deprecation/Sunsetresponse headers emit a one-timeconsole.warn. The transport follows308redirects preserving method + body (the two POST beacon endpoints survive a redirect). - World-class documentation suite: README (cluster-first hero, recipes, migration table), a
docs/guide set, runnableexamples/, and agent-first entrypoints (AGENTS.md,llms.txt). The README “Client surface” table + the interactive explorer are generated from method TSDoc (npm run docs:build); the explorer’s “Key concepts” come from the spec’sx-concepts— all drift-guarded in CI. - npm package metadata:
keywords,homepage,bugs;CHANGELOG.mdships in the tarball.
Changed
Section titled “Changed”- Base path is now
/api/v2(was/api/v1).crate.index()(keyless) reportsversion: v2. - The artist dossier (
ArtistDossierContract) is the cluster-first hub: it carriesdiscography(a pointer index of masters:discogs_master_id+representative_name+_links.master),bandcamp_emergence, andbandcamp_tastemakerdimensions.LabelDossierContractis first-class. - Attribution is Hosaka FM; publishing target is the public npm registry under
@hosaka-fm.
Removed
Section titled “Removed”crate.master()/crate.masters()— masters have no standalone v2 resource. The artist dossier’sdiscographyis a pointer index, not per-master detail; per-master enrichment, tracklists, and batch master lookups are genuine removals (their_links.masterpoint back to the frozen v1 surface).crate.bandcamp.*(release,releases) and theBandcampRelease*types — Bandcamp is now thebandcamp_emergence/bandcamp_tastemakerdimensions of the artist dossier.crate.wayfind/crate.usage()— no v2 equivalent.- Pagination (
crate.search().pages(),bulkAll, thepaginationexport, async iterators) — removed with the bulk Bandcamp surface;crate.search()returns a single page.
0.3.0 - 2026-06-26
Section titled “0.3.0 - 2026-06-26”crate.bandcamp.release({ item | url })→BandcampRelease | null(the honest gap, HTTP 200present: false, returnsnull— not an error) andcrate.bandcamp.releases({ clusterId })→BandcampReleaseSummary[].- New exported types:
BandcampRelease,BandcampReleaseSummary,BandcampReleaseResponse,ArtworkItem, and aBandcampTrackalias.
Changed
Section titled “Changed”- Regenerated types against the live spec:
resolve()locatorsnow spans eight platform arrays; dossiers carry link-onlyartwork(ArtworkItem[]).bandcamp_item_id/cluster_idare opaque strings — pass through, never numericize.
0.2.0 - 2026-06-26
Section titled “0.2.0 - 2026-06-26”Changed
Section titled “Changed”- Key-first. Every data endpoint now requires an
apiKey(sent asX-API-Key); onlycrate.index()is keyless. Data methods throwCrateValidationError('api_key_required')before any network call. Regenerated against crate API spec1.1.0.
0.1.0 - 2026-06-26
Section titled “0.1.0 - 2026-06-26”- Initial release: typed client over crate’s public API with typed methods, automatic retries
(full-jitter backoff honouring
Retry-After), async-iterator pagination, teaching errors as typed exceptions (CrateError+ subclasses,.kind/.code/.hint/.next, JSON-safe), theCRATE_RESOURCESsurface map andCRATE_ERROR_REGISTRYerror dictionary, dual ESM + CJS, and zero runtime dependencies.