diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index e3adda3..30ca941 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -9,7 +9,7 @@ body: id: version attributes: label: Package version and source commit - description: Include tabellio-version output fields, not private machine paths. + description: Include writset-version output fields, not private machine paths. placeholder: "0.7.0; source commit if known" validations: required: true diff --git a/AGENTS.md b/AGENTS.md index aa91653..63aa596 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,8 @@ WritSet helps teams understand and track context across coding-agent work. Serve teams trying and connecting WritSet before adding operator detail. -The published package, CLI commands, and stored formats retain their Tabellio names. +The package is `@intelip/writset`; `writset-*` commands have compatible `tabellio-*` aliases. +Existing configuration names and stored formats remain compatible. ## Find the right guide diff --git a/CHANGELOG.md b/CHANGELOG.md index 128013d..779f168 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,18 @@ # Changelog -All notable changes to Tabellio are recorded here. +All notable changes to WritSet, previously Tabellio, are recorded here. ## Unreleased +### 0.7.1 — WritSet package migration + +- Rename the npm package to `@intelip/writset` and add `writset-*` commands. +- Keep every existing `tabellio-*` command as a compatibility alias. +- Accept both package identities in validation records while retaining the + existing schema identifiers, configuration files, Git refs, and stored data. +- Update installation, version checks, and migration instructions. Publication + remains a separate release action; the existing package is unchanged. + ## 0.7.0 - 2026-09-13 This release combines the published v0.6.0 runner-identity contract with the diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 641fbc0..104e1f4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,8 @@ CI uses Node.js 22.23.1. PostgreSQL client/server binaries are required for the provenance integration suite; git-spice 0.18 or later is needed for stack work. The package has no runtime npm dependencies. Named npm scripts below belong to this checkout; installed users start at [Try WritSet](docs/try-tabellio.md). -The published package and CLI commands still use the earlier Tabellio name. +The package is `@intelip/writset`. Use `writset-*` commands; existing `tabellio-*` +commands remain supported aliases. ```bash git clone https://github.com/IntelIP/WritSet.git diff --git a/README.md b/README.md index 4ba090f..25fe9e5 100644 --- a/README.md +++ b/README.md @@ -33,20 +33,21 @@ that the next session can use. **Requirements:** macOS or Linux, Node.js 20+, Git 2.38+, and PostgreSQL client/server tools on `PATH`. See the [setup guide](docs/try-tabellio.md#requirements). -In a new directory: +After v0.7.1 is published, run in a new directory: ```bash -npm install --save-dev @intelip/tabellio@0.7.0 -npx tabellio-version --expect-version 0.7.0 -npx tabellio-provenance-demo +npm install --save-dev @intelip/writset@0.7.1 +npx writset-version --expect-version 0.7.1 +npx writset-provenance-demo ``` The demo records source observations, restarts its temporary database, and rebuilds the stored context. A successful receipt ends with `status: "passed"` and `cleanup: "passed"`. -**Naming transition:** WritSet was previously Tabellio. The published package and -commands still use the earlier name; the commands above are the supported install. +**Naming transition:** The new package is `@intelip/writset`. Existing `tabellio-*` +commands remain supported aliases. Until publication, use the +[v0.7.0 installation](docs/releases/v0.7.0.md). See the [migration guide](docs/releases/v0.7.1.md). ## Current scope diff --git a/docs/README.md b/docs/README.md index 7d54c10..ab0956a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,8 +3,9 @@ Understand and track the context behind coding-agent work: tasks, source versions, checkpoints, results, and handoffs. Choose the outcome you need below. -WritSet was previously Tabellio. The published package, CLI commands, configuration -files, and stored formats keep their existing names during this transition. +WritSet was previously Tabellio. The package is `@intelip/writset`, with `writset-*` +commands and compatible `tabellio-*` aliases. Configuration names and stored formats +remain compatible. See the [package migration](releases/v0.7.1.md). | Route | Start here | Result | | --- | --- | --- | diff --git a/docs/brand.md b/docs/brand.md index 3ee8e2b..5a24079 100644 --- a/docs/brand.md +++ b/docs/brand.md @@ -39,6 +39,7 @@ The [Space Grotesk license](assets/fonts/space-grotesk-LICENSE.txt) and original | Muted | `#96A4BF` | Secondary text on dark surfaces | The product name is **WritSet**. Use **WritSet** for the GitHub repository and -public-facing prose. The existing `@intelip/tabellio` package, CLI names, schemas, -Git refs, and stored records remain compatible during the transition. Historical +public-facing prose. Use lowercase `@intelip/writset` for the npm package and +`writset-*` for commands. Legacy `tabellio-*` commands, schemas, Git refs, and stored +records remain compatible during the transition. Historical Tabellio assets and release records are retained as history, not current branding. diff --git a/docs/getting-started.md b/docs/getting-started.md index 57b49a6..98c0f80 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -16,13 +16,17 @@ results, and unresolved work behind an agent session. Try the ## Installed-package setup -In the target repository, install the published package on a trusted worker: +After v0.7.1 is published, install the package in the target repository on a trusted worker: ```bash -npm install --save-dev @intelip/tabellio@0.7.0 -npx tabellio-version --expect-version 0.7.0 +npm install --save-dev @intelip/writset@0.7.1 +npx writset-version --expect-version 0.7.1 ``` +Existing users should remove the old package first; follow the +[migration guide](releases/v0.7.1.md). Until publication, use the +[v0.7.0 installation](releases/v0.7.0.md). + Use installed CLIs with `npx`. Commands beginning `node scripts/` or `npm run` in operator guides refer to a WritSet source checkout. Source contributors use [CONTRIBUTING.md](../CONTRIBUTING.md); do not copy WritSet's development scripts @@ -38,7 +42,7 @@ Enable genuine checkpoints before making agent commits: ```bash entire enable --agent codex --project --skip-push-sessions -npx tabellio-preflight --profile agent +npx writset-preflight --profile agent ``` Keep `strategy_options.push_sessions: false`. Never push @@ -60,7 +64,7 @@ acceptance criteria, and data boundaries. WritSet ships Run the committed manifest against one exact candidate: ```bash -npx tabellio-validate run --repo . --repo-id github.com/example/repository --commit HEAD --manifest tabellio.validation.json +npx writset-validate run --repo . --repo-id github.com/example/repository --commit HEAD --manifest tabellio.validation.json ``` The trusted worker creates an isolated worktree and executes only committed argv @@ -68,7 +72,7 @@ arrays. Results go to `refs/tabellio/validations`. Use `gate` in CI when anythin other than a `passed` decision must fail the job: ```bash -npx tabellio-validate gate --repo . --repo-id github.com/example/repository --base main --commit HEAD --manifest tabellio.validation.json +npx writset-validate gate --repo . --repo-id github.com/example/repository --base main --commit HEAD --manifest tabellio.validation.json ``` ## Optional stacked branches @@ -77,7 +81,7 @@ Initialize git-spice in the working repository, then capture the local graph: ```bash git-spice repo init -npx tabellio-stack --repo . --repo-id example/repository --out tabellio-stack.json +npx writset-stack --repo . --repo-id example/repository --out tabellio-stack.json ``` Capture reads the documented local JSON output without querying GitHub status or diff --git a/docs/operate-and-release.md b/docs/operate-and-release.md index 389fe27..5be6424 100644 --- a/docs/operate-and-release.md +++ b/docs/operate-and-release.md @@ -2,7 +2,7 @@ Use a trusted **source checkout** for the `node scripts/...` and `npm run ...` commands below. Installed-package users can invoke the named public CLIs with -`npx tabellio-...` and the same arguments; repository npm scripts belong to this +`npx writset-...` and the same arguments; repository npm scripts belong to this source checkout. Start with [Connect a repository](getting-started.md). Passing evidence is tied to its code version. Sharing private evidence, publishing @@ -30,7 +30,7 @@ Inspect the local runner identity before trusting a version claim: ```bash npm run tabellio:version -- \ - --expect-version 0.7.0 \ + --expect-version 0.7.1 \ --expect-ref HEAD ``` @@ -67,8 +67,8 @@ node scripts/tabellio-release.mjs plan \ --owner example \ --remote-repo repository \ --number 42 \ - --version 0.7.0 \ - --notes docs/releases/v0.7.0.md \ + --version 0.7.1 \ + --notes docs/releases/v0.7.1.md \ --out /tmp/tabellio-release-intent.json ``` diff --git a/docs/provenance.md b/docs/provenance.md index 9fdcd71..53e40c6 100644 --- a/docs/provenance.md +++ b/docs/provenance.md @@ -2,7 +2,7 @@ For the installed-package demo, use [Try Tabellio](try-tabellio.md). Commands with `node scripts/...` and `npm run ...` below are for a trusted source checkout. -Installed operators use `npx tabellio-provenance` and `npx tabellio-local-store` +Installed operators use `npx writset-provenance` and `npx writset-local-store` with the corresponding CLI arguments. Follow [Operate and release](operate-and-release.md) before publishing statuses or sharing private evidence. diff --git a/docs/releases/v0.7.1.md b/docs/releases/v0.7.1.md new file mode 100644 index 0000000..7aa6f45 --- /dev/null +++ b/docs/releases/v0.7.1.md @@ -0,0 +1,42 @@ +# WritSet v0.7.1 package migration + +This release target lets users install WritSet under its own name: +`@intelip/writset@0.7.1`. npm package names are lowercase. The product name remains +**WritSet**. + +These instructions apply after publication. The existing +[`@intelip/tabellio@0.7.0` release](v0.7.0.md) remains available meanwhile. +Renaming source metadata does not rename or remove that published package. + +## Migrate an existing installation + +In the consumer repository, replace the dependency: + +```bash +npm uninstall @intelip/tabellio +npm install --save-dev @intelip/writset@0.7.1 +npx writset-version --expect-version 0.7.1 +npx writset-provenance-demo +``` + +The version receipt must report `packageName: "@intelip/writset"` and +`packageVersion: "0.7.1"`. Install one package at a time: both packages expose the +legacy command names, so keeping both can make those commands resolve ambiguously. + +## Compatibility + +- Every `writset-*` command uses the same implementation as its `tabellio-*` alias. +- Existing `.tabellio/` data, `tabellio.*.json` configuration, environment variables, + Git refs, and schema identifiers keep their names. No data migration is required. +- New validators accept both WritSet and historical Tabellio package identities. + Upgrade older validators before asking them to read WritSet-labeled results. +- Existing releases, tags, checkpoints, and stored receipts are not rewritten. + +## Verification and publication + +Verify package identity, both command names, a clean consumer installation, the +documented demo and cleanup, and rejection of unrelated runner identities. Run +the required repository checks and committed product-validation gate. + +Merge, release-tag creation, and npm publication require their own approval. +No old-package deprecation or removal is included in this change. diff --git a/docs/try-tabellio.md b/docs/try-tabellio.md index 5706db8..8d4018b 100644 --- a/docs/try-tabellio.md +++ b/docs/try-tabellio.md @@ -1,11 +1,13 @@ # Try WritSet -Run the published package in a new directory to see how source context is recorded, +Run the package in a new directory to see how source context is recorded, rebuilt, and checked for stale or missing evidence. This sample needs no provider account or credentials. -WritSet was previously Tabellio. Version 0.7.0 remains published as -`@intelip/tabellio`; use the existing commands below during the naming transition. +WritSet was previously Tabellio. Version 0.7.1 uses `@intelip/writset` and +`writset-*` commands, with compatible `tabellio-*` aliases. The instructions below +apply after publication; until then, use the [v0.7.0 installation](releases/v0.7.0.md). +Existing users can follow the [migration guide](releases/v0.7.1.md). ## Requirements @@ -30,12 +32,12 @@ Entire and git-spice are integration tools, not prerequisites for this sample. In a new directory, run: ```bash -npm install --save-dev @intelip/tabellio@0.7.0 -npx tabellio-version --expect-version 0.7.0 -npx tabellio-provenance-demo +npm install --save-dev @intelip/writset@0.7.1 +npx writset-version --expect-version 0.7.1 +npx writset-provenance-demo ``` -The version receipt identifies `@intelip/tabellio` and `packageVersion: "0.7.0"`. +The version receipt identifies `@intelip/writset` and `packageVersion: "0.7.1"`. The demo receipt ends with `status: "passed"` and `cleanup: "passed"`. Its failure matrix lists expected and actual decisions. A moved base, missing independent security evidence, and changed replay inputs must remain blocked. @@ -43,7 +45,7 @@ security evidence, and changed replay inputs must remain blocked. To retain the full receipt in this consumer directory: ```bash -npx tabellio-provenance-demo --out demo-receipt.json +npx writset-provenance-demo --out demo-receipt.json ``` Git operations and the temporary local database are real. Plane, Entire, GitHub, diff --git a/package.json b/package.json index 336219e..cddbc00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "@intelip/tabellio", - "version": "0.7.0", + "name": "@intelip/writset", + "version": "0.7.1", "description": "WritSet helps teams understand and track context across coding-agent work.", "type": "module", "license": "Apache-2.0", @@ -11,6 +11,34 @@ "url": "git+https://github.com/IntelIP/WritSet.git" }, "bin": { + "writset-run": "scripts/tabellio-run.mjs", + "writset-stack": "scripts/tabellio-stack.mjs", + "writset-stack-operation": "scripts/tabellio-stack-operation.mjs", + "writset-review": "scripts/tabellio-review.mjs", + "writset-validate": "scripts/tabellio-validate.mjs", + "writset-version": "scripts/tabellio-version.mjs", + "writset-merge-ready": "scripts/tabellio-merge-ready.mjs", + "writset-validator": "scripts/tabellio-validator.mjs", + "writset-design-memory": "scripts/check-tabellio-design-memory.mjs", + "writset-design-captures": "scripts/finalize-tabellio-visual-captures.mjs", + "writset-control-ref": "scripts/tabellio-control-ref.mjs", + "writset-ledger": "scripts/tabellio-ledger.mjs", + "writset-preflight": "scripts/tabellio-preflight.mjs", + "writset-release": "scripts/tabellio-release.mjs", + "writset-analytics": "scripts/tabellio-analytics.mjs", + "writset-analytics-validator": "scripts/tabellio-analytics-validator.mjs", + "writset-buildkite-builds": "scripts/tabellio-buildkite-builds.mjs", + "writset-github-releases": "scripts/tabellio-github-releases.mjs", + "writset-analytics-releases": "scripts/tabellio-analytics-releases.mjs", + "writset-plane-work-items": "scripts/tabellio-plane-work-items.mjs", + "writset-wave-admit": "scripts/tabellio-wave-admit.mjs", + "writset-deployment-check": "scripts/check-tabellio-deployment-receipt.mjs", + "writset-cloud-run-deployment": "scripts/tabellio-cloud-run-deployment.mjs", + "writset-vercel-deployment": "scripts/tabellio-vercel-deployment.mjs", + "writset-local-store": "scripts/tabellio-local-store.mjs", + "writset-provenance": "scripts/tabellio-provenance.mjs", + "writset-provenance-demo": "scripts/demo-provenance.mjs", + "writset-checkpoint-proof": "scripts/tabellio-checkpoint-proof.mjs", "tabellio-run": "scripts/tabellio-run.mjs", "tabellio-stack": "scripts/tabellio-stack.mjs", "tabellio-stack-operation": "scripts/tabellio-stack-operation.mjs", diff --git a/schemas/validation-result.v0.4.schema.json b/schemas/validation-result.v0.4.schema.json index 0f4170d..01a4574 100644 --- a/schemas/validation-result.v0.4.schema.json +++ b/schemas/validation-result.v0.4.schema.json @@ -66,7 +66,7 @@ "properties": { "id": { "type": "string", "minLength": 1 }, "runtime": { "type": "string", "minLength": 1 }, - "packageName": { "const": "@intelip/tabellio" }, + "packageName": { "enum": ["@intelip/writset", "@intelip/tabellio"] }, "packageVersion": { "type": "string", "pattern": "^(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$" diff --git a/schemas/validation-result.v0.5.schema.json b/schemas/validation-result.v0.5.schema.json index ed0c8e0..ac4119d 100644 --- a/schemas/validation-result.v0.5.schema.json +++ b/schemas/validation-result.v0.5.schema.json @@ -128,7 +128,10 @@ "minLength": 1 }, "packageName": { - "const": "@intelip/tabellio" + "enum": [ + "@intelip/writset", + "@intelip/tabellio" + ] }, "packageVersion": { "type": "string", @@ -348,7 +351,10 @@ "minLength": 1 }, "packageName": { - "const": "@intelip/tabellio" + "enum": [ + "@intelip/writset", + "@intelip/tabellio" + ] }, "packageVersion": { "type": "string", diff --git a/scripts/check-docs.mjs b/scripts/check-docs.mjs index 5c4cf17..fbb9e29 100644 --- a/scripts/check-docs.mjs +++ b/scripts/check-docs.mjs @@ -75,7 +75,7 @@ async function markdownFiles(root) { function checkVersions(text, name, version, errors) { for (const line of text.split(/\r?\n/)) { - const installation = /\bnpm\s+(?:install|i|add)\b/.test(line) ? line.match(/@intelip\/tabellio(?:@([^\s`"']+))?/) : null; + const installation = /\bnpm\s+(?:install|i|add)\b/.test(line) ? line.match(/@intelip\/(?:writset|tabellio)(?:@([^\s`"']+))?/) : null; if (installation && installation[1] !== version) errors.push(`${name}: installation version must be ${version}, found ${installation[1] ?? "unpinned"}`); for (const match of line.matchAll(/--expect-version\s+["']?([^\s`"']+)/g)) { if (match[1] !== version) errors.push(`${name}: expected installation version must be ${version}, found ${match[1]}`); diff --git a/scripts/lib/validation-runner.mjs b/scripts/lib/validation-runner.mjs index b5662ac..5d3dbf0 100644 --- a/scripts/lib/validation-runner.mjs +++ b/scripts/lib/validation-runner.mjs @@ -527,7 +527,9 @@ function validateResultRunner(value, schemaVersion) { } function validateRunnerIdentity(value) { - equals(value.packageName, "@intelip/tabellio", "validation result.runner.packageName"); + if (!["@intelip/writset", "@intelip/tabellio"].includes(value.packageName)) { + throw new Error("validation result.runner.packageName must be @intelip/writset or @intelip/tabellio."); + } if (typeof value.packageVersion !== "string" || !SEMANTIC_VERSION.test(value.packageVersion)) { throw new Error("validation result.runner.packageVersion must be a semantic version."); } diff --git a/tests/docs-check.test.mjs b/tests/docs-check.test.mjs index fd37207..44a80dd 100644 --- a/tests/docs-check.test.mjs +++ b/tests/docs-check.test.mjs @@ -39,6 +39,8 @@ const failures = [ ["missing heading", "README.md", "[broken](docs/README.md#missing)\n", /missing local heading/], ["incorrect installation version", "docs/try-tabellio.md", "npm install --save-dev @intelip/tabellio@0.6.0\n", /installation version/], ["unpinned installation", "README.md", "npm install @intelip/tabellio\n", /found unpinned/], + ["incorrect WritSet installation version", "README.md", "npm install @intelip/writset@0.6.0\n", /installation version/], + ["unpinned WritSet installation", "README.md", "npm install @intelip/writset\n", /found unpinned/], ["incorrect runner version", "docs/getting-started.md", "npx tabellio-version --expect-version 0.6.0\n", /expected installation version/], ["mismatched templates", ".github/pull_request_template.md", "Different template\n", /differs from/], ["oversized README", "README.md", "line\n".repeat(151), /exceeds limit 150/], @@ -64,7 +66,7 @@ test("docs check keeps historical release versions valid", async (t) => { const root = await fixture(t); await mkdir(join(root, "docs/releases")); await writeFile(join(root, "docs/releases/v0.1.0.md"), "npm install @intelip/tabellio@0.1.0\n"); - await writeFile(join(root, "README.md"), "npm install --save-dev @intelip/tabellio@0.7.0\nnpx tabellio-version --expect-version 0.7.0\n"); + await writeFile(join(root, "README.md"), "npm install --save-dev @intelip/writset@0.7.0\nnpx writset-version --expect-version 0.7.0\n"); assert.deepEqual((await checkDocs(root)).errors, []); }); diff --git a/tests/package-distribution.test.mjs b/tests/package-distribution.test.mjs index cb530d4..8404d38 100644 --- a/tests/package-distribution.test.mjs +++ b/tests/package-distribution.test.mjs @@ -28,6 +28,8 @@ test("package includes public validators and demo but excludes private local sta ".tabellio/validators.json", ]); const manifest = JSON.parse(await readFile(join(root, "package.json"), "utf8")); + assert.equal(manifest.name, "@intelip/writset"); + assert.equal(manifest.bin["writset-provenance-demo"], "scripts/demo-provenance.mjs"); assert.equal(manifest.bin["tabellio-provenance-demo"], "scripts/demo-provenance.mjs"); assert.ok(files.includes(manifest.bin["tabellio-provenance-demo"])); }); diff --git a/tests/runner-identity.test.mjs b/tests/runner-identity.test.mjs index 4a872e5..f6665c3 100644 --- a/tests/runner-identity.test.mjs +++ b/tests/runner-identity.test.mjs @@ -72,16 +72,16 @@ test("runner identity does not attribute a parent consumer repository to an inst await writeFile(join(consumer, "package.json"), JSON.stringify({ name: "consumer", version: "1.0.0" })); await runGit({ args: ["add", "package.json"], cwd: consumer }); await runGit({ args: ["commit", "-m", "Add consumer"], cwd: consumer, env: identityEnv() }); - const installed = join(consumer, "node_modules", "@intelip", "tabellio"); + const installed = join(consumer, "node_modules", "@intelip", "writset"); await mkdir(installed, { recursive: true }); await writeFile(join(installed, "package.json"), JSON.stringify({ - name: "@intelip/tabellio", - version: "0.6.0", + name: "@intelip/writset", + version: "0.7.1", })); assert.deepEqual(await tabellioRunnerIdentity({ root: installed }), { - packageName: "@intelip/tabellio", - packageVersion: "0.6.0", + packageName: "@intelip/writset", + packageVersion: "0.7.1", sourceCommit: null, sourceDirty: null, releaseTag: null, @@ -91,12 +91,13 @@ test("runner identity does not attribute a parent consumer repository to an inst test("runner identity CLI workflow reports current checkout and enforces expectations", async (t) => { const result = await execFileAsync(process.execPath, [ "scripts/tabellio-version.mjs", - "--expect-version", "0.7.0", + "--expect-version", "0.7.1", "--expect-ref", "HEAD", ], { cwd: new URL("..", import.meta.url), encoding: "utf8" }); const value = JSON.parse(result.stdout); assert.equal(value.ok, true); - assert.equal(value.runner.packageVersion, "0.7.0"); + assert.equal(value.runner.packageName, "@intelip/writset"); + assert.equal(value.runner.packageVersion, "0.7.1"); assert.match(value.runner.sourceCommit, /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/); assert.deepEqual(Object.keys(value.runner).sort(), [ "packageName", diff --git a/tests/validation-runner.test.mjs b/tests/validation-runner.test.mjs index 72e497b..b4b10b2 100644 --- a/tests/validation-runner.test.mjs +++ b/tests/validation-runner.test.mjs @@ -446,6 +446,11 @@ test("typed validators enforce semantic metrics and cost budgets with durable ev assert.equal(result.result.decision.costTelemetryComplete, true); assert.equal(validateValidationResult(result.result), result.result); + const migrated = structuredClone(result.result); + migrated.runner.packageName = "@intelip/writset"; + const { integrity: _legacyIntegrity, ...migratedBody } = migrated; + migrated.integrity.digest = digestObject(migratedBody); + assert.equal(validateValidationResult(migrated), migrated); for (const [field, invalid, message] of [ ["packageName", "@example/not-tabellio", /packageName must be/], ["packageVersion", "1.0.0-alpha..1", /packageVersion must be a semantic version/],