---
title: "JavaScript SDK changelog"
type: reference
tags: [javascript, sdk, changelog, versions, npm]
created: 2026-09-17
updated: 2026-09-17
confidence: high
sources:
  - raw/docs/sdk__javascript__changelog.md
  - raw/github/typesafe-sdk-js/docs/changelog.md
  - raw/github/typesafe-sdk-js/package.json
  - raw/github/typesafe-sdk-js/jsr.json
  - raw/github/typesafe-sdk-js/src/version.ts
  - raw/github/typesafe-sdk-js/src/questions.ts
  - raw/github/typesafe-sdk-js/src/types.ts
  - raw/MANIFEST.json
jev_version: "jev-1.13.0"
sdk_js: "0.6.0"
summary: "@typesafe-ai/sdk releases: 0.5.7 initial public release, 0.6.0 (2026-09-15) makes Score.criteria an ordered sequence — the one breaking change."
---

# JavaScript SDK changelog

> **TL;DR** Two public releases. `0.5.7` was the initial public release; `0.6.0` (2026-09-15, the current version) has exactly one breaking change: `Score.criteria` is now an **ordered sequence** instead of a dictionary keyed by integers. If you are on 0.5.7, rewrite `score("...", {0: "low", 1: "high"})` as `score("...", ["low", "high"])`.

## Releases

| Version | Changelog date | npm publish date | Nature |
|---|---|---|---|
| `0.0.0-bootstrap.0` | not in any changelog | 2026-09-12 | registry placeholder; not a usable release |
| `0.5.7` | 2026-09-11 | 2026-09-12 | initial public release |
| `0.6.0` | 2026-09-15 | 2026-09-15 | breaking: score criteria become an ordered sequence |

The changelog dates come from the upstream changelog (identical in `raw/docs/sdk__javascript__changelog.md` and `raw/github/typesafe-sdk-js/docs/changelog.md`); the npm publish dates are from the registry listing recorded during ingestion. **The two disagree for 0.5.7**: the changelog says 2026-09-11, npm records the publish on 2026-09-12. Treat 2026-09-11 as the release-tag date and 2026-09-12 as the registry timestamp.

`0.0.0-bootstrap.0` appears only in the npm version list; it has no changelog entry, no git tag in the ingested repository, and is the conventional placeholder used to claim a package name before the first real publish (inferred).

## v0.6.0 (2026-09-15)

Upstream changelog, verbatim:

> ### Breaking changes
>
> * accept `Score.criteria` as an ordered sequence instead of a dictionary keyed by integers

That is the entire entry. Nothing else is listed as changed, added, or fixed.

### What it means in the JS SDK

`ScoreCriteria` in 0.6.0 is a tuple type with a two-entry minimum:

```ts
type ScoreCriteria = readonly [EntryType, EntryType, ...EntryType[]];
```

and `score()` rejects a map at runtime:

```ts
if (!Array.isArray(criteria)) {
  throw new TypeSafeError(
    "Score criteria must be a list of descriptions indexed by score from zero, not a map.",
  );
}
```

`validateQuestions`, which `systemOne()` runs before every request, repeats the check per question and also enforces the minimum length:

- `Score question "<name>" has criteria that are not a list; score criteria must be a list of descriptions indexed by score from zero.`
- `Score question "<name>" has N criteria; at least two scores are required.`

Migration:

```ts
// 0.5.7 — dictionary keyed by integers
const urgency = score("How urgent is this ticket?", {
  0: "can wait",
  1: "this week",
  2: "today",
  3: "right now",
});

// 0.6.0 — ordered sequence, index 0 first
const urgency = score("How urgent is this ticket?", [
  "can wait",
  "this week",
  "today",
  "right now",
]);
```

The score keys are unchanged — index 0 is still the lowest rubric level — so `ScoreResponse.score`, `.legend` and `.probabilities` keep the same meaning. What improves is inference: with a literal array and the `const` type parameter on `score()`, `ScoreOf<T>` narrows to `"0" | "1" | "2" | "3"` instead of `number`, so `legend["3"]` and `probabilities["0"]` are typed. See [[reference/javascript-sdk-types]].

Nothing else in the public surface is documented as changed. `VERSION` was bumped to `"0.6.0"` in `src/version.ts` (kept in sync with `package.json` and enforced by `npm run check:version`), and `jsr.json` carries the same `0.6.0`.

## v0.5.7 (2026-09-11)

Upstream changelog, verbatim:

> This is the initial public release of TypeSafe JavaScript and TypeScript SDK. Learn more in the [documentation](https://docs.typesafe.ai/sdk/javascript).

No feature list is published for 0.5.7. Everything documented on [[reference/javascript-sdk]] describes 0.6.0; the only 0.5.7 difference recorded anywhere in `raw/` is the score-criteria shape.

The jump straight to `0.5.7` for a first public release (rather than `0.1.0`) is not explained in any source.

## Repository state

| Fact | Value |
|---|---|
| Repo | `https://github.com/typesafe-ai/typesafe-sdk-js` |
| Ingested commit | `66880ccded6cb642dc1809620c2b108c33730214` |
| Commit date | 2026-09-15 |
| Commit subject | `Release v0.6.0` |
| `package.json` version | `0.6.0` |
| `jsr.json` version | `0.6.0` |
| `src/version.ts` | `export const VERSION = "0.6.0";` |
| License | MIT |
| Language | TypeScript |

The ingested checkout contains a single commit (`Release v0.6.0`), so per-commit history before 0.6.0 is not available locally; the repository is listed as last pushed 2026-09-15.

Changelogs are generated with `git-cliff` (pinned at `2.13.1` in `devDependencies`), which is why the docs site changelog and `docs/changelog.md` in the repo are byte-identical apart from bullet markers (`*` vs `-`).

## Version policy notes

- `VERSION` is exported as a **literal type** (`const VERSION: "0.6.0" = "0.6.0"`), so a dependency bump changes the type, not just the value.
- `npm run check:version` (`scripts/check-version.mjs`) is part of the `check` pipeline that runs on `prepublishOnly`, guarding against `src/version.ts` drifting from `package.json`.
- The package is pre-1.0, and 0.6.0 already shipped a breaking change in a minor bump. Pin exactly (`"@typesafe-ai/sdk": "0.6.0"`) rather than with a caret if you care about stability.
- The Python SDK ships the same version number `0.6.0` with the same `Score.criteria` breaking change — see [[reference/python-sdk-changelog]]. The two SDKs are versioned in lockstep across the releases recorded here (inferred from the matching version numbers and identical breaking change).

## Related

- [[reference/javascript-sdk]] — the 0.6.0 API surface
- [[reference/javascript-sdk-types]] — `ScoreCriteria`, `ScoreOf`, `ScoreLegend`
- [[reference/javascript-sdk-errors]] — errors thrown by the new validation
- [[reference/python-sdk-changelog]] — the parallel Python release history
- [[syntheses/version-timeline]] — models, SDKs, API and company dates in one place
- [[concepts/score]] — what an ordered rubric means to the model

## Sources

- raw/docs/sdk__javascript__changelog.md (https://docs.typesafe.ai/sdk/javascript/changelog)
- raw/github/typesafe-sdk-js/docs/changelog.md (https://github.com/typesafe-ai/typesafe-sdk-js)
- raw/github/typesafe-sdk-js/package.json, jsr.json, src/version.ts, src/questions.ts, src/types.ts (commit 66880ccded6cb642dc1809620c2b108c33730214, 2026-09-15)
- raw/MANIFEST.json (commit pin for raw/github/typesafe-sdk-js)
- npm registry listing for `@typesafe-ai/sdk` recorded 2026-09-17: 0.0.0-bootstrap.0 and 0.5.7 published 2026-09-12, 0.6.0 published 2026-09-15
