> ## Documentation Index
> Fetch the complete documentation index at: https://docs.timeback.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> New updates and improvements to Timeback SDK packages

<Update label="April 24, 2026" tags={["caliper", "case", "cli", "clr", "core", "edubridge", "masterytrack", "oneroster", "powerpath", "qti", "reporting", "sdk", "studio", "types", "webhooks"]}>
  ## @timeback/caliper (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/caliper (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/case (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/case (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/clr (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/clr (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/core (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/qti\@0.3.1
    * @timeback/caliper\@0.3.1
    * @timeback/case\@0.3.1
    * @timeback/clr\@0.3.1
    * @timeback/edubridge\@0.3.1
    * @timeback/oneroster\@0.3.1
    * @timeback/powerpath\@0.3.1
    * @timeback/reporting\@0.2.1
    * @timeback/webhooks\@0.3.1

  ## @timeback/core (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/edubridge\@0.3.0
    * @timeback/qti\@0.3.0
    * @timeback/caliper\@0.3.0
    * @timeback/case\@0.3.0
    * @timeback/clr\@0.3.0
    * @timeback/oneroster\@0.3.0
    * @timeback/powerpath\@0.3.0
    * @timeback/reporting\@0.2.0
    * @timeback/webhooks\@0.3.0

  ## @timeback/edubridge (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/edubridge (v0.3.0)

  * Return the full Edubridge analytics responses from `getActivity()` and `getEnrollmentFacts`
    * change `getActivity()` to return the full response object, including `facts` and required `factsByApp`
    * change `getEnrollmentFacts()` to return the full response object, including `facts` and required `factsByApp`

  * Expose all edubridge `User` fields returned by the server
    * Add `email`, `phone`, `sms`, `grades`, `identifier`, `pronouns`, `preferredFirstName`, `preferredMiddleName`, `preferredLastName`, and `password` to `User`
    * Add `User.demographics` plus a new `Demographics` type and `DemographicsSex` union

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/masterytrack (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/masterytrack (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/oneroster (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/oneroster (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/powerpath (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/powerpath (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/qti (v0.3.1)

  * Support structured JSON assessment item upserts
    * Allow `assessmentItems.upsert()` to send `interaction.questionStructure` bodies without caller-provided `rawXml` or `content`
    * Preserve XML-created item behavior while enabling server-derived XML for JSON-authored items

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/qti (v0.3.0)

  * Support documented QTI list filters and JSON assessment item payloads in the public client
    * Add `query` to the shared QTI pagination params and forward it from `stimuli.list()`, `assessmentItems.list()`, `assessmentTests.list()`, `testParts.list()`, and `sections.list()`
    * Accept documented JSON assessment item fields like `format: "json"` and `interaction.questionStructure` on create and `createFromMetadata`

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/reporting (v0.2.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/reporting (v0.2.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## @timeback/sdk (v0.2.5)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1
    * @timeback/core\@0.3.1

  ## @timeback/sdk (v0.2.4)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures
  * Updated dependencies \[85525a1]
  * Updated dependencies \[a6d403b]
  * Updated dependencies \[5421a54]
  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0
    * @timeback/core\@0.3.0

  ## @timeback/types (v0.3.1)

  * Support structured JSON assessment item upserts
    * Allow `assessmentItems.upsert()` to send `interaction.questionStructure` bodies without caller-provided `rawXml` or `content`
    * Preserve XML-created item behavior while enabling server-derived XML for JSON-authored items

  ## @timeback/types (v0.3.0)

  * Return the full Edubridge analytics responses from `getActivity()` and `getEnrollmentFacts`
    * change `getActivity()` to return the full response object, including `facts` and required `factsByApp`
    * change `getEnrollmentFacts()` to return the full response object, including `facts` and required `factsByApp`

  * Support documented QTI list filters and JSON assessment item payloads in the public client
    * Add `query` to the shared QTI pagination params and forward it from `stimuli.list()`, `assessmentItems.list()`, `assessmentTests.list()`, `testParts.list()`, and `sections.list()`
    * Accept documented JSON assessment item fields like `format: "json"` and `interaction.questionStructure` on create and `createFromMetadata`

  * Expose all edubridge `User` fields returned by the server
    * Add `email`, `phone`, `sms`, `grades`, `identifier`, `pronouns`, `preferredFirstName`, `preferredMiddleName`, `preferredLastName`, and `password` to `User`
    * Add `User.demographics` plus a new `Demographics` type and `DemographicsSex` union

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  ## @timeback/webhooks (v0.3.1)

  * Updated dependencies \[0586a3b]
    * @timeback/types\@0.3.1

  ## @timeback/webhooks (v0.3.0)

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[85525a1]

  * Updated dependencies \[a6d403b]

  * Updated dependencies \[5421a54]

  * Updated dependencies \[de5efd0]
    * @timeback/types\@0.3.0

  ## timeback (v0.2.2)

  * Fix interactive CLI prompts breaking when log output appears
    * Prompt-based commands (`init`, `credentials`, `resources`, `skills`, `upgrade`, `inspect`, `studio`, and interactive `api` flows) keep a clean prompt UI instead of interleaving log lines
    * Non-interactive commands still show normal log formatting, including when `DEBUG` or verbose logging is enabled

  * Fix email configuration not persisting when using environment variable credentials
    * Merge saved email with environment variable credentials so `resources push` no longer reports "Email not configured"
    * `credentials email` no longer writes environment-sourced client secrets to disk
    * `credentials list` now clearly distinguishes saved credentials from active environment overrides

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  ## timeback-studio (v0.2.5)

  * @timeback/core\@0.3.1

  ## timeback-studio (v0.2.4)

  * Fix interactive CLI prompts breaking when log output appears
    * Prompt-based commands (`init`, `credentials`, `resources`, `skills`, `upgrade`, `inspect`, `studio`, and interactive `api` flows) keep a clean prompt UI instead of interleaving log lines
    * Non-interactive commands still show normal log formatting, including when `DEBUG` or verbose logging is enabled

  * Fix email configuration not persisting when using environment variable credentials
    * Merge saved email with environment variable credentials so `resources push` no longer reports "Email not configured"
    * `credentials email` no longer writes environment-sourced client secrets to disk
    * `credentials list` now clearly distinguishes saved credentials from active environment overrides

  * Widen the TypeScript peer dependency range from `^5` to `^5 || ^6` across published packages so npm consumers using TypeScript 6 no longer hit peer resolution failures

  * Updated dependencies \[de5efd0]
    * @timeback/core\@0.3.0
</Update>

<Update label="April 1, 2026" tags={["caliper", "case", "clr", "core", "edubridge", "masterytrack", "oneroster", "powerpath", "qti", "reporting", "sdk", "studio", "types", "webhooks"]}>
  ## @timeback/caliper (v0.2.1)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/case (v0.2.1)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/clr (v0.2.1)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/core (v0.2.3)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]

  * Updated dependencies \[08d64a5]
    * @timeback/caliper\@0.2.1
    * @timeback/case\@0.2.1
    * @timeback/clr\@0.2.1
    * @timeback/edubridge\@0.2.2
    * @timeback/oneroster\@0.2.1
    * @timeback/powerpath\@0.2.2
    * @timeback/qti\@0.2.2
    * @timeback/reporting\@0.1.1
    * @timeback/webhooks\@0.2.1

  ## @timeback/edubridge (v0.2.2)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/masterytrack (v0.2.1)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/oneroster (v0.2.1)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Align OneRoster types and client validation with the Timeback API
    * Tighten Zod and protocol shapes for users, courses, resources, line items, and results (including strict `GuidRef` and learning objective ID vs score sets)
    * Accept common string labels for grade levels and normalize them to numeric `TimebackGrade` values
    * Validate `updateComponent` and `updateComponentResource` payloads with the same create-input schemas used for POST before sending requests

  ## @timeback/powerpath (v0.2.2)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/qti (v0.2.2)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/reporting (v0.1.1)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## @timeback/sdk (v0.2.3)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/core\@0.2.3
    * @timeback/types\@0.2.0

  ## @timeback/types (v0.2.0)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  ## @timeback/webhooks (v0.2.1)

  * Publish `@timeback/types` on npm
    * Add `@timeback/types` when you need shared config, payloads, and protocol types without installing `@timeback/core` or another client package first
    * `@timeback/core` and each API client depend on it so `tsc` resolves the same declarations whether you install one package or several

  * Updated dependencies \[de2cc7a]
    * @timeback/types\@0.2.0

  ## timeback-studio (v0.2.3)

  * Updated dependencies \[de2cc7a]
    * @timeback/core\@0.2.3
</Update>

<Update label="March 26, 2026" tags={["edubridge"]}>
  ## @timeback/edubridge (v0.2.1)

  * Fix bare `endDate` handling so same-day analytics ranges are not a zero-width window.
</Update>

<Update label="March 25, 2026" tags={["core", "sdk", "studio"]}>
  ## @timeback/core (v0.2.2)

  * Bundle declaration types into `@timeback/core` so the package is fully self-contained

  ## @timeback/sdk (v0.2.2)

  * Updated dependencies \[1ddecd5]
    * @timeback/core\@0.2.2

  ## timeback-studio (v0.2.2)

  * Updated dependencies \[1ddecd5]
    * @timeback/core\@0.2.2
</Update>

<Update label="March 17, 2026" tags={["cli", "core", "powerpath", "qti", "sdk", "studio"]}>
  ## @timeback/core (v0.2.1)

  * Add QTI XML parsing utilities
    * `@timeback/qti/parse`: Lightweight, dependency-free extractors for prompts, choices, correct responses, inline feedback, modal feedback, interaction attributes, and response declarations from QTI 3.0 XML
    * `@timeback/core/qti`: Re-exports parsing utilities from `@timeback/qti/parse`
    * `@timeback/sdk/qti`: Re-exports parsing utilities and adds SDK integration helpers (`toQuizQuestion`, `toReviewQuestions`) for Managed Lessons flows

  ## @timeback/powerpath (v0.2.1)

  * Add `RenderConfigResource` to the PowerPath client, exposing upsert, get, and delete operations for custom renderer configurations on courses via `client.renderConfig.*`.
  * Add `TestOutResource` to the PowerPath client with `getEligibility` and `createAssignment` methods for self-elected test-out flows. Add `testOutSupported` and `testOutEligible` booleans to EduBridge enrollment types.

  ## @timeback/qti (v0.2.1)

  * Add QTI XML parsing utilities
    * `@timeback/qti/parse`: Lightweight, dependency-free extractors for prompts, choices, correct responses, inline feedback, modal feedback, interaction attributes, and response declarations from QTI 3.0 XML
    * `@timeback/core/qti`: Re-exports parsing utilities from `@timeback/qti/parse`
    * `@timeback/sdk/qti`: Re-exports parsing utilities and adds SDK integration helpers (`toQuizQuestion`, `toReviewQuestions`) for Managed Lessons flows

  ## @timeback/sdk (v0.2.1)

  * Fix `lessons.next()` crashing with a 500 when `lessonType` is omitted. The optional field is now auto-detected from the PowerPath progress response, routing to the correct path for both quiz and adaptive lessons.

  * Add QTI XML parsing utilities
    * `@timeback/qti/parse`: Lightweight, dependency-free extractors for prompts, choices, correct responses, inline feedback, modal feedback, interaction attributes, and response declarations from QTI 3.0 XML
    * `@timeback/core/qti`: Re-exports parsing utilities from `@timeback/qti/parse`
    * `@timeback/sdk/qti`: Re-exports parsing utilities and adds SDK integration helpers (`toQuizQuestion`, `toReviewQuestions`) for Managed Lessons flows

  * Updated dependencies \[a719d64]
    * @timeback/core\@0.2.1

  ## timeback (v0.2.1)

  * Add `timeback skills` command for managing Timeback agent skills
    * `timeback skills` (detects installed skills; offers to add or remove)
    * `timeback skills add` (install 1+ skills)
    * `timeback skills remove`: (remove installed skills)
    * `timeback init`: (install skills at end of first-time setup)

  * Fix credential setup blocking when no Timeback account exists for the provided email
    * Offer to create a new account instead of failing with "contact a Timeback admin"
    * Reactivate soft-deleted accounts instead of failing with a 500 error

  ## timeback-studio (v0.2.1)

  * Updated dependencies \[a719d64]
    * @timeback/core\@0.2.1
</Update>

<Update label="March 13, 2026" tags={["caliper", "case", "cli", "clr", "core", "edubridge", "masterytrack", "oneroster", "powerpath", "qti", "sdk", "studio", "webhooks"]}>
  ## @timeback/caliper (v0.2.0)

  * Question event methods, LearnWith.AI platform support, and stricter input validation
    * Add `sendQuestionSeen()`, `sendQuestionAnswered()`, `sendQuestionGraded()` for question lifecycle events
    * Auto-fill event boilerplate and auto-inject session context for LearnWith.AI events
    * Handle empty response bodies from platforms that don't return a `jobId`
    * Fix spread order in event factories to prevent input overriding hardcoded fields
    * Default `limit` and `offset` on `events.list()`
    * Add `@timeback/caliper/errors` export
    * Event IDs require `urn:uuid:` prefix; actor and context IDs require URL format
    * `TimebackActivityContext.course` is now required
    * String fields trim whitespace before validation

  ## @timeback/case (v0.2.0)

  * LearnWith.AI platform support and stricter input validation
    * Enable CASE service for LearnWith.AI platform (was previously blocked)
    * `CFPackageWithGroups.structuredContent` is now optional (was incorrectly required)
    * `sourcedId` parameters and `identifier` input fields now require UUID format

  ## @timeback/clr (v0.2.0)

  * Stricter CLR credential input validation to match the API contract
    * `@context` requires W3C, CLR, and OB context entries
    * ID fields require URL format; datetime fields require ISO 8601
    * Type arrays enforce required values (`VerifiableCredential`, `ClrCredential`, `Profile`, etc.)
    * Profile `.email` validates email format; `.url` validates URL format

  ## @timeback/core (v0.2.0)

  * Smaller published package via bundle splitting and dep externalization.

  ## @timeback/edubridge (v0.2.0)

  * Stricter input validation
    * `subjectTrack.delete(id)` requires UUID format
    * `enrollOptions.beginDate` requires full ISO datetime (rejects date-only)
    * Date parameters are automatically normalized by validation schemas

  ## @timeback/masterytrack (v0.2.0)

  * Smaller published package via bundle splitting and dep externalization.

  ## @timeback/oneroster (v0.2.0)

  * Bug fixes and stricter input validation
    * Rename `createCredential()` to `registerCredential()` on `users(id)`
    * Fix body wrapping for `createLineItem()`, `createResult()`, `createResults()` on scoped classes
    * Fix `update()` on academic sessions, terms, and grading periods to accept partial data
    * Fix `createGradingPeriod()` return type to `CreateResponse`
    * Add `InputValidationError` to `./errors` export
    * `email` required on user creation; `type`, `class`, `scoreScaleValue` required on score scales
    * Enrollment dates accept `YYYY-MM-DD` only; assignment/score dates accept both formats
    * Validation returns cleaned/transformed data; string fields trim whitespace
    * Remove legacy `Filter`/`f` builder — use `where` clause instead

  ## @timeback/powerpath (v0.2.0)

  * Bug fixes and stricter input validation
    * Fix `createOperations()` sending an array instead of a single command object
    * Widen `QuestionResult.feedback` and `.outcomes` types to match API responses
    * Add `rendererOutcomes` and `playerState` to `updateStudentQuestionResponse` input
    * `scoreDate` on lesson plan results requires ISO datetime format

  ## @timeback/qti (v0.2.0)

  * Fix request bodies to match the QTI OpenAPI spec
    * `processResponse` no longer injects the item identifier; pass the response declaration identifier via `identifier` field
    * `update()` on assessment items, tests, and stimuli auto-injects `identifier` into the PUT body
    * String input fields (`identifier`, `title`, `href`, etc.) now trim whitespace before validation

  ## @timeback/sdk (v0.2.0)

  * Config comments, attempt numbering fix, and stricter handler validation
    * Support comments (`//` and `/* */`) in `timeback.config` files
    * Require `lessons.attemptDetails()` to use attempt numbers starting at `1` (lesson attempts are numbered from `1`, not `0`)
    * Handler schemas (`lessonId`, `questionId`, `response`, activity `id`/`name`, course `code`) now trim whitespace before validation

  * Updated dependencies \[fa6f72c]
    * @timeback/core\@0.2.0

  ## @timeback/webhooks (v0.2.0)

  * Error handling export and stricter input validation
    * Add `@timeback/webhooks/errors` export for typed error handling
    * Webhook input fields (`name`, `secret`, `webhookId`, `filterKey`, `filterValue`) now trim whitespace before validation

  ## timeback (v0.2.0)

  * Config comments, filter flags, and resource sync improvements
    * Support comments (`//` and `/* */`) in `timeback.config` files
    * Add filter flags to subresource and scoped commands
    * Improve `resources pull` diff display with grouped output and symbols
    * Fix `grade: 0` on gradeless courses causing phantom diffs on `resources pull`

  ## timeback-studio (v0.2.0)

  * Support comments (`//` and `/* */`) in `timeback.config` files

  * Updated dependencies \[fa6f72c]
    * @timeback/core\@0.2.0
</Update>

<Update label="February 26, 2026" tags={["case", "oneroster", "powerpath", "qti", "sdk"]}>
  ## @timeback/case (v0.1.3)

  * Add `upsert()` for create-or-update semantics
    * `upsert()` on assessment items, assessment tests, stimuli, and CASE packages
    * Updates existing resources or creates them if they don't exist

  ## @timeback/oneroster (v0.1.8)

  * Add `exists()`, strict `update()`, and create-or-update `upsert()` across all resources
    * `exists(id)` checks whether a resource exists (returns boolean, no entity body)
    * `update()` throws when the resource doesn't exist; `upsert()` creates it instead
    * Gradebook and assessment `update()`/`upsert()` now return the updated entity

  ## @timeback/powerpath (v0.1.6)

  * Fix incorrect return types on `createInternalTest()` and `makeExternalTestAssignment()`
    * Return dedicated response types instead of the shared `ExternalTestCreateResponse`
    * Export additional types: `ScoreStatus`, `ExternalTestCapableLessonType`, `QuizLikeLessonType`

  ## @timeback/qti (v0.1.6)

  * Add `upsert()` for create-or-update semantics
    * `upsert()` on assessment items, assessment tests, stimuli, and CASE packages
    * Updates existing resources or creates them if they don't exist

  * Export additional types for assessment items, tests, and validation
    * `AssessmentSection`, `TestPart`, `QuestionWithItem`, `ProcessResponseResult`, and \~25 more types now available as top-level exports

  ## @timeback/sdk (v0.1.14)

  * Add `lessons` namespace for managed lesson lifecycle
    * Discover and start quiz or adaptive lessons via `list()` and `start()`
    * Step through questions with `next()` and `submit()`, then finalize with `complete()`
    * Review past attempts with `attempts()` and `attemptDetails()`
    * Supports all server adapters: Express, Nuxt, SvelteKit, SolidStart, TanStack Start

  * Switch mastery completion to `upsert()` since `update()` now throws for missing resources

  * Allow negative `xpEarned` values for deduction-based activity reporting
    * @timeback/core\@0.1.6
</Update>

<Update label="February 19, 2026" tags={["case", "cli", "clr", "masterytrack", "webhooks"]}>
  ## @timeback/case (v0.1.2)

  * Add README with installation, usage, and configuration docs
  * Fix request body serialization in packages and credentials resources

  ## @timeback/clr (v0.1.2)

  * Add README with installation, usage, and configuration docs
  * Fix request body serialization in packages and credentials resources

  ## @timeback/masterytrack (v0.1.1)

  * Add MasteryTrack API client
    * Search test inventory, assign tests, and invalidate assignments
    * Support staging and production environments with API key + email authentication

  ## @timeback/webhooks (v0.1.1)

  * Add webhook management client
    * Create, list, update, delete, activate, and deactivate webhook registrations
    * Manage event filters per webhook

  ## timeback (v0.1.13)

  * Add CLR and CASE API subcommands
    * Add `timeback api clr` with credential upsert and discovery commands
    * Add `timeback api case` with framework, item, association, and package commands
  * Add MasteryTrack subcommands and consolidate credentials
    * Add `timeback api masterytrack` namespace
    * Consolidate all credentials into `~/.timeback/credentials.json` with provider namespacing
    * Unify credential management under `timeback credentials` with `--provider` flag
  * Add webhooks API subcommands
    * Add `timeback api webhooks` for managing webhook registrations
    * Add `timeback api webhooks filters` for managing event filters per webhook
</Update>

<Update label="February 13, 2026" tags={["case", "clr", "core", "sdk", "studio"]}>
  ## @timeback/case (v0.1.1)

  * Add CASE client for Competency and Academic Standards Exchange
    * Manage competency frameworks, items, and associations
    * Authenticate automatically when used through `@timeback/core`
    * Support env, explicit, provider, and transport configuration modes

  ## @timeback/clr (v0.1.1)

  * Add CLR client for Comprehensive Learner Record credentials
    * Manage verifiable credentials, packages, and assertions
    * Authenticate automatically when used through `@timeback/core`
    * Support env, explicit, provider, and transport configuration modes

  ## @timeback/core (v0.1.6)

  * Add CASE and CLR APIs
    * Access Competency and Academic Standards Exchange and Comprehensive Learner Record APIs through the unified core client
    * Support all standard configuration modes (env, explicit, provider, transport)

  ## @timeback/sdk (v0.1.13)

  * Fix TypeScript compilation errors when importing the SDK

  ## timeback-studio (v0.1.10)

  * Support CASE and CLR APIs

  ## timeback-studio (v0.1.9)

  * Include app identity in telemetry
</Update>

<Update label="February 12, 2026" tags={["cli"]}>
  ## timeback (v0.1.12)

  * Accept client IDs of any length
</Update>

<Update label="February 11, 2026" tags={["caliper", "cli", "edubridge", "oneroster", "powerpath", "qti", "sdk"]}>
  ## @timeback/caliper (v0.1.6)

  * Fix TypeScript type resolution for package imports

  ## @timeback/edubridge (v0.1.5)

  * Fix TypeScript type resolution for package imports

  ## @timeback/oneroster (v0.1.7)

  * Fix TypeScript type resolution for package imports

  ## @timeback/powerpath (v0.1.5)

  * Add strongly typed response types for assessment endpoints
    * Add `GetNextQuestionResponse`, `FinalizeAssessmentResponse`, `TestOutResponse`, and more
    * Distinguish PowerPath 100 from standard lesson progress via TypeScript types

  ## @timeback/powerpath (v0.1.4)

  * Fix TypeScript type resolution for package imports

  ## @timeback/qti (v0.1.5)

  * Add `createFromXml()` and improve input ergonomics
    * Create assessment items directly from XML content
    * Accept plain strings for enum/literal inputs (no `as const` needed)

  ## @timeback/qti (v0.1.4)

  * Fix TypeScript type resolution for package imports

  ## @timeback/sdk (v0.1.12)

  * Re-export error classes and `isApiError` type guard from `@timeback/sdk`

  ## timeback (v0.1.11)

  * Add `--user-id` flag to `api oneroster enrollments list`
</Update>

<Update label="February 10, 2026" tags={["caliper", "core", "edubridge", "oneroster", "powerpath", "qti", "sdk", "studio"]}>
  ## @timeback/caliper (v0.1.5)

  * Improve config types and IDE experience
    * Enforce `'production' | 'staging'` for `env` config
    * Fix JSDoc `@example` rendering in IDE tooltips

  ## @timeback/core (v0.1.5)

  * Improve config types and IDE experience
    * Enforce `'production' | 'staging'` for `env` config instead of open string
    * Fix JSDoc `@example` rendering in IDE tooltips

  ## @timeback/edubridge (v0.1.4)

  * Improve config types and IDE experience
    * Enforce `'production' | 'staging'` for `env` config
    * Fix JSDoc `@example` rendering in IDE tooltips

  ## @timeback/oneroster (v0.1.6)

  * Improve config types and IDE experience
    * Enforce `'production' | 'staging'` for `env` config
    * Fix JSDoc `@example` rendering in IDE tooltips
    * Add `user.sourcedId` to enrollment filter fields

  ## @timeback/powerpath (v0.1.3)

  * Improve config types and IDE experience
    * Enforce `'production' | 'staging'` for `env` config
    * Fix JSDoc `@example` rendering in IDE tooltips

  ## @timeback/qti (v0.1.3)

  * Improve config types and IDE experience
    * Enforce `'production' | 'staging'` for `env` config
    * Fix JSDoc `@example` rendering in IDE tooltips
    * Fix missing type exports for `./errors` and `./types` subpaths

  ## @timeback/sdk (v0.1.11)

  * Make SDK edge-runtime compatible
    * Works in Cloudflare Workers, Vercel Edge, Bun, Deno, and Node.js from main entry
    * Remove `./edge` subpath — main entry works everywhere
    * Access `toNativeHandler` and `ROUTES` directly from main entry

  ## timeback-studio (v0.1.8)

  * Improve live event streaming performance
</Update>

<Update label="February 9, 2026" tags={["caliper", "cli", "sdk", "studio"]}>
  ## @timeback/caliper (v0.1.4)

  * Support optional `session` and `edApp` fields in events

  ## @timeback/sdk (v0.1.10)

  * Improve activity and server lifecycle APIs
    * Add lifecycle callbacks (`onError`, `onPause`, `onResume`, `onFlush`) and `ActivityErrorContext` for diagnostics
    * Support `time: false` to disable client-side heartbeats and opt-in retry via `time.retryAttempts`
    * Enforce single-activity-at-a-time — `start()` throws if an activity is already running
    * Add server-side `user.verify()` and `user.getProfile()` methods
    * Add request lifecycle hooks (`onRequest`, `onSuccess`, `onError`) to server handlers
  * Support optional `session` and `edApp` fields in events
  * Add continuous time tracking via heartbeats
    * Report time spent periodically instead of once at activity end
    * Support resumable activities across sessions via `runId`
    * Add `beforeTimeSpentSend` hook to intercept events before sending
    * **BREAKING:** `xpEarned` is now required for activity completion
  * Fix Svelte, Solid, and Vue adapter builds

  ## timeback (v0.1.10)

  * Add account creation flow to CLI authentication
    * Prompt for account creation when email is not found
    * Support organization search and creation during signup
    * Save credentials automatically after successful signup

  ## timeback-studio (v0.1.7)

  * Add account creation flow to authentication
    * Prompt for account creation when email is not found
    * Support organization search and creation during signup
</Update>

<Update label="February 3, 2026" tags={["caliper", "cli", "core", "edubridge", "oneroster", "powerpath", "qti", "sdk", "studio"]}>
  ## @timeback/caliper (v0.1.3)

  * Support unified `TIMEBACK_API_*` environment variables
    * Configure credentials once instead of per-service
    * Priority: `TIMEBACK_API_*` > `TIMEBACK_*` > service-specific

  ## @timeback/core (v0.1.4)

  * Support unified `TIMEBACK_API_*` environment variables
    * Configure credentials once instead of per-service
    * Priority: `TIMEBACK_API_*` > `TIMEBACK_*` > service-specific

  ## @timeback/edubridge (v0.1.3)

  * Support unified `TIMEBACK_API_*` environment variables
    * Configure credentials once instead of per-service
    * Priority: `TIMEBACK_API_*` > `TIMEBACK_*` > service-specific

  ## @timeback/oneroster (v0.1.5)

  * Support unified `TIMEBACK_API_*` environment variables
    * Configure credentials once instead of per-service
    * Priority: `TIMEBACK_API_*` > `TIMEBACK_*` > service-specific

  ## @timeback/powerpath (v0.1.2)

  * Support unified `TIMEBACK_API_*` environment variables
    * Configure credentials once instead of per-service
    * Priority: `TIMEBACK_API_*` > `TIMEBACK_*` > service-specific

  ## @timeback/qti (v0.1.2)

  * Support unified `TIMEBACK_API_*` environment variables
    * Configure credentials once instead of per-service
    * Priority: `TIMEBACK_API_*` > `TIMEBACK_*` > service-specific

  ## @timeback/sdk (v0.1.9)

  * Support unified `TIMEBACK_API_*` environment variables
    * Configure credentials once instead of per-service
    * Priority: `TIMEBACK_API_*` > `TIMEBACK_*` > service-specific

  ## timeback (v0.1.9)

  * Improve `timeback upgrade` reliability
    * Fix upgrade reporting success but not updating standalone installs
    * Add `timeback upgrade <version>` for installing a specific version

  ## timeback-studio (v0.1.6)

  * Support unified `TIMEBACK_API_*` environment variables for credentials
</Update>

<Update label="January 30, 2026" tags={["cli", "edubridge", "oneroster", "sdk", "studio"]}>
  ## @timeback/edubridge (v0.1.2)

  * Fix `SubjectTrack` field names to match API
    * Rename `gradeLevel` to `grade` and `targetCourseId` to `courseId`

  ## @timeback/oneroster (v0.1.4)

  * Add type-safe search parameters
    * Enable `search` on users, students, and courses endpoints
    * Prevent accidental `search` on endpoints that don't support it

  ## @timeback/sdk (v0.1.8)

  * Add mastery completion tracking
    * Create completion entries automatically when students achieve 100% mastery
  * Detect target environment automatically from course IDs in config
  * Improve activity validation and XP calculation
    * Validate `totalQuestions`/`correctQuestions` are provided together
    * Calculate XP automatically from duration, accuracy, and attempt number
    * Derive sensor from `launchUrl` when not explicitly configured
  * Add profile hooks to all framework adapters
    * `useTimebackProfile` (React), `createTimebackProfile` (Solid), `timebackProfile` (Svelte), `useTimebackProfile` (Vue)
  * Rename `pctCompleteApp` to `pctComplete`
    * Remove `attemptNumber` parameter from activity end methods
    * Add optional time override for manual elapsed/paused specification

  ## timeback (v0.1.8)

  * Infer sensor URL from recent Caliper events during `timeback init`
  * Improve CLI polish and consistency
    * Add `docs` command with curated documentation (replaces `describe`)
    * Normalize date inputs (accept YYYY-MM-DD, auto-convert to ISO 8601)
    * Replace enum string inputs with boolean flags (`--student`, `--asc`, `--enabled`)
    * Standardize command descriptions and help text
  * Handle large OneRoster queries automatically
    * Split oversized requests into batches transparently
    * Report partial failures with warning logs

  ## timeback-studio (v0.1.5)

  * Support enrolling students by `courseId` (auto-creates classes)
  * Handle large OneRoster queries automatically
</Update>

<Update label="January 26, 2026" tags={["cli", "sdk"]}>
  ## @timeback/sdk (v0.1.7)

  * Add gradebook management to activity handler with attempt-based result tracking
  * Add user verification and bearer auth
    * Add `useTimebackVerification` React hook for checking user eligibility
    * Add `bearer()` auth plugin for attaching Bearer tokens
    * Add `/user/verify` endpoint for lightweight existence checks

  ## timeback (v0.1.7)

  * Make `launchUrl` optional in config
    * Infer launch URL from existing course resources during import
    * Warn during sync if launch URL is missing
  * Improve sync diff display with color-coded operations and environment context
  * Restructure CLI commands and simplify configuration
    * Reorganize commands under `resources` namespace (`push`, `pull`, `import`, `unlink`)
    * Make `timeback init` scaffold-only by default; use `--sync` to push immediately
    * Require `totalXp`/`totalLessons` metrics for `resources push`
    * Add `timeback upgrade` command for self-updates
</Update>

<Update label="January 21, 2026" tags={["caliper", "cli", "core", "oneroster", "powerpath", "sdk", "studio"]}>
  ## @timeback/caliper (v0.1.2)

  * Add `pctCompleteApp` extension for app-reported course progress

  ## @timeback/core (v0.1.3)

  * Add PowerPath APIs for adaptive learning

  ## @timeback/oneroster (v0.1.3)

  * Improve resource input type safety
    * Require `metadata.type` when providing typed resource metadata (e.g. `launchUrl`)
    * Validate create/update inputs more consistently

  ## @timeback/powerpath (v0.1.1)

  * Add PowerPath client for adaptive learning APIs
    * Manage assessments, placement, lesson plans, screening, syllabus, and test assignments

  ## @timeback/sdk (v0.1.6)

  * Switch config format from TypeScript to JSON
    * Use `timeback.config.json` instead of `timeback.config.ts`
    * Add JSON schema reference for editor autocompletion

  ## @timeback/sdk (v0.1.5)

  * Support grade-less courses and add activity hooks
    * Select courses via `{ code }` in addition to `{ subject, grade }`
    * Add `hooks.beforeActivitySend` for intercepting events before sending
    * Add `_buildPayload()` for inspecting payloads without sending
    * Add preview mode via `?preview=1` query param or `x-timeback-preview: 1` header
  * Simplify activity tracking API
    * Replace `client.activity.new().start()` with `client.activity.start(...)`
  * Replace `getUser()` with `getEmail()` in custom identity config
  * Add `pctComplete` support for app-reported course progress
    * Accept progress percentage (0-100 scale) in activity payloads

  ## timeback (v0.1.6)

  * Switch config format from TypeScript to JSON
    * Use `timeback.config.json` instead of `timeback.config.ts`
    * Add JSON schema reference for editor autocompletion

  ## timeback (v0.1.5)

  * Prompt for launch URL during `timeback init`
    * Derive sensor suggestion from launch URL origin
    * Ensure full course structure exists so dashboards can launch the app
  * Support per-course and per-environment config overrides
    * Override `level`, `sensor`, and `metadata` per environment in config
    * Apply environment-specific overrides during `timeback sync`
  * Add standalone CLI binary distribution
    * Build executables for macOS (arm64), Linux (x64/arm64), and Windows
    * Install via `curl -fsSL https://timeback.dev/cli | bash` (no Node.js required)
  * Add `timeback api powerpath` subcommands for adaptive learning APIs

  ## timeback-studio (v0.1.4)

  * Switch config format from TypeScript to JSON
    * Use `timeback.config.json` instead of `timeback.config.ts`
    * Add JSON schema reference for editor autocompletion

  ## timeback-studio (v0.1.3)

  * Filter events automatically by sensor from config
    * Support per-course and per-environment sensor overrides
</Update>

<Update label="January 19, 2026" tags={["caliper", "cli", "core", "edubridge", "oneroster", "qti", "sdk", "studio"]}>
  ## @timeback/caliper (v0.1.1)

  * Improve error messages for invalid inputs

  ## @timeback/core (v0.1.2)

  * Improve error messages for invalid inputs across all clients

  ## @timeback/edubridge (v0.1.1)

  * Improve error messages for invalid inputs

  ## @timeback/oneroster (v0.1.2)

  * Improve error messages for invalid inputs

  ## @timeback/qti (v0.1.1)

  * Improve error messages for invalid inputs

  ## @timeback/sdk (v0.1.4)

  * Improve activity tracking and user profiles
    * Use `course: { subject, grade }` instead of `courseCode` string
    * Return enriched user profile data (school, grade, courses, goals, XP)
    * Add `@timeback/sdk/config` subpath export for typed config files
  * Improve error messages for invalid inputs
  * **BREAKING:** Rename package from `timeback` to `@timeback/sdk`

    ```diff theme={null}
    - import { createTimeback } from 'timeback'
    + import { createTimeback } from '@timeback/sdk'
    ```

  ## timeback (v0.1.4)

  * Add post-init sync prompt and new flags
    * `timeback init` offers to sync after creating config
    * Add `--env`, `-y/--yes`, `--no-sync`, and `--no-format` flags

  ## timeback-studio (v0.1.2)

  * Improve error messages for invalid inputs
</Update>

<Update label="January 14, 2026" tags={["cli", "core", "oneroster", "qti", "studio"]}>
  ## @timeback/core (v0.1.1)

  * Add QTI APIs for assessment management

  ## @timeback/oneroster (v0.1.1)

  * Update list methods
    * `list()` returns a single page with metadata (`PageResult`)
    * `listAll()` fetches all pages and returns an array
    * Add `first()` for getting the first matching resource
  * Require `sourcedId` when creating users

  ## @timeback/qti (v0.1.0)

  * Add QTI API client
    * Assessment items, tests, and stimuli CRUD operations
    * XML validation with single and batch modes
    * Lesson and question feedback submission
    * Automatic pagination with streaming support

  ## timeback (v0.1.2)

  * Improve error messages for invalid inputs
  * **BREAKING:** Rename CLI package from `timeback-cli` to `timeback`

    ```diff theme={null}
    - npx timeback-cli init
    + npx timeback init
    ```

  ## timeback (v0.1.1)

  * Fix API error details not displaying for 422 responses
  * Add `inspect` command for analyzing course structure
  * Add QTI subcommands for assessment management, XML validation, and feedback

  ## timeback-studio (v0.1.1)

  * Fetch all results by default for list operations
</Update>

<Update label="January 10, 2026" tags={["caliper", "cli", "core", "edubridge", "oneroster", "studio"]}>
  ## @timeback/caliper (v0.1.0)

  * First release

  ## @timeback/core (v0.1.0)

  * First release

  ## @timeback/edubridge (v0.1.0)

  * First release

  ## @timeback/oneroster (v0.1.0)

  * First release

  ## timeback (v0.1.0)

  * First release

  ## timeback-studio (v0.1.0)

  * First release
</Update>

<Update label="@timeback/sdk 0.1.3" tags={["sdk"]}>
  ## @timeback/sdk (v0.1.3)

  * Simplify SDK setup and integration
    * Add canonical `TimebackAuthUser` identity type
    * Add `timeback.api` for direct API access
    * Add `createTimeback`/`createTimebackIdentity` factory functions
    * Add edge-safe entrypoints
</Update>

<Update label="@timeback/sdk 0.1.2" tags={["sdk"]}>
  ## @timeback/sdk (v0.1.2)

  * Add identity-only mode via `createIdentityServer()`
    * Enable SSO without activity tracking or API credentials
    * Support across all framework adapters
</Update>

<Update label="@timeback/sdk 0.1.1" tags={["sdk"]}>
  ## @timeback/sdk (v0.1.1)

  * Fetch all results by default for list operations
  * Add Vue 3 and Nuxt 3 adapters
    * Include composables, components, middleware, and route handlers
</Update>

<Update label="@timeback/sdk 0.1.0" tags={["sdk"]}>
  ## @timeback/sdk (v0.1.0)

  * First release
</Update>
