Coherent.js v1.0 — Wave 2a: Package Drops Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Spec: docs/superpowers/specs/2026-05-17-coherent-v1-hardening-design.md — Wave 2 (Section 1, "Dropped from 1.0" + "client/src/hydration.js deletion deferred from Wave 1").

Goal: Delete the three packages/modules the spec marks for removal — @coherent.js/runtime, @coherent.js/web-components, and the legacy packages/client/src/hydration.js — along with their tests, docs, and references. Leaves trunk green and shrinks the workspace from 26 packages to 24.

Architecture: Pure deletion, ordered to keep CI green between commits. runtime goes first (it consumes both web-components AND the legacy hydration.js, so removing it eliminates the only blockers to the next two deletions). web-components goes second (now has zero consumers). client/src/hydration.js and its legacy test suite go third (now safe — runtime was the last consumer).

Tech Stack: pnpm workspaces, Vitest, ESM only, Node ≥ 20.

Wave 2a NOT in scope (handled in later sub-plans):

  • Package merges (performance + profilerdevtools, three LSP packages → tooling, build-toolscli) — Wave 2b
  • integrations/ consolidation (express/fastify/koa/nextjs/adapters → subpath exports) — Wave 2c
  • API surface lockdown, perf gates, HMR dev server, Playwright E2E — Waves 3, 4, 5

Pre-existing follow-ups already documented:

  • Wave 1 CHANGELOG noted that scripts/add-exports-sections.js references removed forms APIs. Task 1 and Task 2 here trim that script's runtime and web-components sections at the same time, partially addressing that follow-up but not auditing the full script.
  • Wave 1 CHANGELOG noted that packages/forms/README.md documents removed APIs — out of scope here; Wave 5 migration guide.

File Structure (changes by package)

Path Change Reason
packages/runtime/ (entire directory) Delete Spec demotes runtime out of 1.0
packages/web-components/ (entire directory) Delete Spec drops web-components from 1.0
packages/client/src/hydration.js Delete Wave-1-deferred legacy file, runtime was its last consumer
packages/client/test/event-system.test.js Delete Tests the legacy registerEventHandler only
packages/client/test/hydration-enhanced.test.js Delete Tests legacy hydrate/hydrateAll/hydrateBySelector/makeHydratable
packages/client/test/auto-hydration.test.js Delete Tests legacy autoHydrate
packages/client/test/integration-real.test.js Delete Tests legacy hydration API
packages/client/test/key-reconciliation.test.js Delete Imports legacy hydration namespace
packages/client/test/core-logic.test.js Modify Drop Hydration Core Logic describe (lines 8-102); keep HMR Core Logic describe
packages/client/types/hydration.d.ts Delete Subpath-export types for the deleted module
packages/client/package.json Modify Remove ./hydration subpath export entry
packages/client/build.mjs Modify (conditional) Remove hydration.js from build inputs if present
packages/client/tsconfig.typecheck.json Modify (conditional) Remove types/hydration.d.ts from includes if present
examples/runtime-features-demo.js Delete Sole runtime example
website/package.json Modify Drop @coherent.js/runtime dependency
docs/packages/runtime.md Delete Doc for the deleted package
docs/packages/web-components.md Delete Doc for the deleted package
docs/README.md Modify Remove runtime + web-components bullets
ARCHITECTURE.md Modify Remove runtime + web-components from package tree
DEVELOPMENT.md Modify Same as above
PUBLISHING_GUIDE.md Modify Remove runtime + web-components from publish list
.changeset/pre.json Modify Drop runtime + web-components from prerelease tracking
scripts/add-exports-sections.js Modify Trim runtime + web-components sections
pnpm-lock.yaml Modify Regenerated by pnpm install
CHANGELOG.md Modify Add Unreleased entries for Wave 2a

Pre-flight

  • Step 1: Confirm clean working tree relative to Wave 1

Run: git status Expected: only the pre-existing modifications carried from prior sessions (package.json, several tsconfig.tsbuildinfo files, packages/runtime/README.md). These are unrelated to Wave 1 or Wave 2a and should not be touched.

  • Step 2: Confirm baseline is green

Run: pnpm test Expected: green (~1792 tests). If something fails on a clean checkout of main, stop and investigate before proceeding — Wave 2a builds on a green baseline.


Task 1: Delete @coherent.js/runtime package

Files:

  • Delete: packages/runtime/ (entire directory)
  • Delete: examples/runtime-features-demo.js
  • Modify: website/package.json (remove @coherent.js/runtime dependency)
  • Delete: docs/packages/runtime.md
  • Modify: docs/README.md (remove runtime bullet at line ~101)
  • Modify: ARCHITECTURE.md (remove runtime entry at line ~100)
  • Modify: DEVELOPMENT.md (remove runtime entry at line ~35)
  • Modify: PUBLISHING_GUIDE.md (remove runtime entry at line ~38)
  • Modify: .changeset/pre.json (remove runtime entry at line ~21)
  • Modify: scripts/add-exports-sections.js (remove runtime entries at lines ~109-116 and ~244-256)
  • Modify: pnpm-lock.yaml (regenerated)

Why first: runtime consumes both web-components (packages/runtime/src/index.js:9,65, runtimes/browser.js:8, types/index.d.ts:8) AND the legacy client/src/hydration.js (via @coherent.js/client for autoHydrate, makeHydratable). Removing runtime eliminates the only blockers to Tasks 2 and 3.

  • Step 1: Confirm runtime consumers are exactly what's mapped

Run from /Users/thomasdrouvin/Perso/coherent:

grep -rn "@coherent.js/runtime\b" . \
  --include="*.js" --include="*.ts" --include="*.json" --include="*.md" --include="*.mjs" \
  2>/dev/null | grep -v "/node_modules/" | grep -v "/dist/" | grep -v "/coverage/" \
  | grep -v "pnpm-lock.yaml" | grep -v "packages/runtime/" | grep -v "CHANGELOG"

Expected output (or close — line numbers may shift): the list of files in the Files section above, plus docs/superpowers/ plan/spec files (which intentionally mention the package), plus ARCHITECTURE.md/DEVELOPMENT.md/PUBLISHING_GUIDE.md/docs/README.md/.changeset/pre.json. If anything else shows up, stop and add it to this task's scope.

  • Step 2: Delete the runtime package directory
git rm -r packages/runtime
  • Step 3: Delete the runtime example
git rm examples/runtime-features-demo.js
  • Step 4: Remove runtime from website/package.json dependencies

Open website/package.json. Find the dependencies section (around line 13):

"@coherent.js/runtime": "1.0.0-beta.8",

Delete that line. Verify trailing-comma syntax of the surrounding entries stays valid.

  • Step 5: Delete docs/packages/runtime.md
git rm docs/packages/runtime.md
  • Step 6: Remove runtime bullets from top-level docs

For each of these files, delete the line containing runtime/ or @coherent.js/runtime:

  • docs/README.md (around line 101: - \@coherent.js/runtime` - Universal runtime`)
  • ARCHITECTURE.md (around line 100: │ ├── runtime/ # @coherent.js/runtime - Runtime enhancements)
  • DEVELOPMENT.md (around line 35: same line as ARCHITECTURE.md)
  • PUBLISHING_GUIDE.md (around line 38: 7. \@coherent.js/runtime` - Enhanced runtimes`)

Each deletion is just one line. Read each file before editing to confirm the exact line number (they may have drifted).

  • Step 7: Remove runtime from .changeset/pre.json

Open .changeset/pre.json. Find the entry around line 21:

"@coherent.js/runtime": "1.0.0-beta.5",

Delete that line. Verify trailing-comma syntax stays valid.

  • Step 8: Trim scripts/add-exports-sections.js

Open scripts/add-exports-sections.js. Find:

  1. The runtime entry around lines 109-116:

          'Universal runtime: `@coherent.js/runtime`',
          'Browser runtime: `@coherent.js/runtime/browser`',
          'Edge runtime: `@coherent.js/runtime/edge`',
          'Static runtime: `@coherent.js/runtime/static`',
          'Desktop runtime: `@coherent.js/runtime/desktop`'
        ],
        example: `import { createCoherent } from '@coherent.js/runtime';
    import { createBrowserApp } from '@coherent.js/runtime/browser';`
  2. The example block around lines 244-256 with createCoherent/createBrowserApp/createEdgeApp imports.

For both: delete the entire surrounding object/section that targets @coherent.js/runtime. Read the file structure first to identify the object boundaries (they appear to be entries in an array of { section, content, example } objects). Remove the whole runtime entry and any trailing comma on the prior entry that would become a trailing comma at end-of-array.

If the script becomes too fragile to edit safely (e.g., heredoc strings break trivial sed), just remove the smallest necessary chunks to leave the file syntactically valid. Verify with node --check scripts/add-exports-sections.js.

  • Step 9: Regenerate the lockfile

Run: pnpm install Expected: lockfile updates to drop runtime references. Verify with grep "@coherent.js/runtime" pnpm-lock.yaml — should return nothing (or only historical references in dependency hash trees, which is fine).

  • Step 10: Full test + typecheck + build

Run:

pnpm test
pnpm typecheck:packages
pnpm build

Expected: all green. The runtime package's own tests (~50 cases) are gone, so total test count drops accordingly. No other package should break — runtime was only consumed by web-components-internal code (which is also doomed) and the website (which only used it as a dependency declaration, not in source).

If anything fails: most likely the scripts/add-exports-sections.js edits introduced a syntax error, or the website's package.json change broke pnpm install because of a peer-dep cycle. Fix and re-run.

  • Step 11: Commit
git add -A packages website docs ARCHITECTURE.md DEVELOPMENT.md PUBLISHING_GUIDE.md .changeset scripts examples pnpm-lock.yaml
git commit -m "$(cat <<'EOF'
refactor(runtime): drop @coherent.js/runtime package from 1.0

The universal-runtime story (edge workers, Deno, Bun, etc.) is post-1.0.
Removes the runtime package, its example, its docs, and its dependency
declaration in the website. The package may re-emerge in a sibling
extras repo at 0.x but is no longer maintained in the main monorepo.

Part of Wave 2a (drops) for v1.0 stable hardening.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Pre-commit hook runs full lint + typecheck + test + build (~3-5 min). If it fails, fix and commit again (new commit, do NOT amend).


Task 2: Delete @coherent.js/web-components package

Files:

  • Delete: packages/web-components/ (entire directory)
  • Delete: docs/packages/web-components.md
  • Modify: docs/README.md (remove web-components bullet at line ~118 — note line may have shifted after Task 1)
  • Modify: ARCHITECTURE.md (remove web-components entry at line ~102 — note line may have shifted)
  • Modify: DEVELOPMENT.md (remove web-components entry at line ~37 — note line may have shifted)
  • Modify: PUBLISHING_GUIDE.md (remove web-components entry at line ~50 — note line may have shifted)
  • Modify: .changeset/pre.json (remove web-components entry at line ~25 — note line may have shifted)
  • Modify: scripts/add-exports-sections.js (remove web-components section at lines ~197-199 — note line may have shifted)
  • Modify: pnpm-lock.yaml (regenerated)

Why second: After Task 1 deletes runtime, web-components has zero consumers in the repo (verified — every match in the original grep was either inside packages/runtime/ or in docs/changelog files). Hard delete is safe.

  • Step 1: Re-verify zero consumers
grep -rn "@coherent.js/web-components" . \
  --include="*.js" --include="*.ts" --include="*.json" --include="*.md" --include="*.mjs" \
  2>/dev/null | grep -v "/node_modules/" | grep -v "/dist/" | grep -v "/coverage/" \
  | grep -v "pnpm-lock.yaml" | grep -v "packages/web-components/" | grep -v "CHANGELOG"

Expected output: only docs files listed in the Files section above, plus docs/superpowers/ plan/spec files. No *.js / *.ts consumers in packages/ or examples/ or website/. If a .js/.ts consumer turns up, stop and report — Task 1 left a thread loose.

  • Step 2: Delete the web-components package directory
git rm -r packages/web-components
  • Step 3: Delete docs/packages/web-components.md
git rm docs/packages/web-components.md
  • Step 4: Remove web-components bullets from top-level docs

For each of these files, delete the line referencing web-components:

  • docs/README.md (look for \@coherent.js/web-components` - [Custom Elements]`)
  • ARCHITECTURE.md (look for │ └── web-components/)
  • DEVELOPMENT.md (look for │ └── web-components/)
  • PUBLISHING_GUIDE.md (look for \@coherent.js/web-components``)

Read each file first to confirm the exact current line number (Task 1 already shifted line counts).

  • Step 5: Remove web-components from .changeset/pre.json

Open .changeset/pre.json. Find the entry:

"@coherent.js/web-components": "1.0.0-beta.5"

Delete that line. Fix trailing-comma syntax of the prior entry.

  • Step 6: Trim scripts/add-exports-sections.js

Open scripts/add-exports-sections.js. Find the web-components section (around line 197 in pre-Task-1 numbering):

'Web Components: `@coherent.js/web-components`'
...
example: `import { defineComponent } from '@coherent.js/web-components';`

Delete the surrounding object/section. Run node --check scripts/add-exports-sections.js to confirm syntax.

  • Step 7: Regenerate the lockfile
pnpm install

Verify: grep "@coherent.js/web-components" pnpm-lock.yaml returns nothing meaningful.

  • Step 8: Full test + typecheck + build
pnpm test
pnpm typecheck:packages
pnpm build

Expected: all green. Web-components had its own test suite (verify what it contained — should be just a small set of tests on defineComponent and Shadow DOM helpers). Those go away with the package. Total test count drops slightly.

  • Step 9: Commit
git add -A packages docs ARCHITECTURE.md DEVELOPMENT.md PUBLISHING_GUIDE.md .changeset scripts pnpm-lock.yaml
git commit -m "$(cat <<'EOF'
refactor(web-components): drop @coherent.js/web-components package from 1.0

The single-file Web Components / Custom Elements integration is not a
1.0 priority and had only one in-repo consumer (the now-deleted runtime
package). Removes the package, its 151 lines of source, its docs, and
its changeset tracking entry.

Part of Wave 2a (drops) for v1.0 stable hardening.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 3: Delete legacy client/src/hydration.js + its test ecosystem

Files:

  • Delete: packages/client/src/hydration.js (1,857 lines)
  • Delete: packages/client/types/hydration.d.ts
  • Delete: packages/client/test/event-system.test.js
  • Delete: packages/client/test/hydration-enhanced.test.js
  • Delete: packages/client/test/auto-hydration.test.js
  • Delete: packages/client/test/integration-real.test.js
  • Delete: packages/client/test/key-reconciliation.test.js
  • Modify: packages/client/test/core-logic.test.js (drop Hydration Core Logic describe block — lines 8-102 — keep HMR Core Logic describe block at lines 104+)
  • Modify: packages/client/package.json (remove ./hydration subpath export)
  • Modify (conditional): packages/client/build.mjs (drop hydration.js from build inputs if listed)
  • Modify (conditional): packages/client/tsconfig.typecheck.json (drop types/hydration.d.ts from includes if listed)

Why third: Wave 1 deferred this deletion because runtime consumed hydration.js's legacy exports (autoHydrate, makeHydratable, etc.). Task 1 of this wave deleted runtime, so the file now has only test consumers — all of which test the deleted API and should be deleted along with it. The modern hydration system in client/src/hydration/ (modular subdirectory) is unaffected and has its own test coverage independent of this file.

Step 1: Pre-check — confirm no surprise consumers

Run:

grep -rn "from.*['\"]\.\./hydration\.js['\"]\|from.*['\"]\.\./\.\./hydration\.js['\"]\|@coherent.js/client/hydration\b\|client/src/hydration\.js" . \
  --include="*.js" --include="*.ts" --include="*.json" --include="*.mjs" \
  2>/dev/null | grep -v "/node_modules/" | grep -v "/dist/" | grep -v "/coverage/" \
  | grep -v "pnpm-lock.yaml" | grep -v "packages/client/package.json" \
  | grep -v "packages/client/types/hydration.d.ts" \
  | grep -v "packages/client/src/hydration.js"

Expected: only the 7 test files listed in the Files section (event-system, hydration-enhanced, auto-hydration, integration-real, key-reconciliation, core-logic). If anything else turns up, stop and report — Task 1 should have cleared everything else.

Step 2: Delete the legacy hydration source and types

git rm packages/client/src/hydration.js
git rm packages/client/types/hydration.d.ts

Step 3: Delete the legacy hydration test files

git rm packages/client/test/event-system.test.js \
       packages/client/test/hydration-enhanced.test.js \
       packages/client/test/auto-hydration.test.js \
       packages/client/test/integration-real.test.js \
       packages/client/test/key-reconciliation.test.js

Step 4: Trim core-logic.test.js

Open packages/client/test/core-logic.test.js. The file currently has two describe blocks:

  • describe('Hydration Core Logic', ...) — lines 8 through ~102, all tests exercise the deleted ../src/hydration.js
  • describe('HMR Core Logic', ...) — line ~104 onward, exercises the Wave 1 throw-shim and pure-logic message processing

Delete the entire Hydration Core Logic describe block. The resulting file should start with the imports + comment block (lines 1-6), then go directly to describe('HMR Core Logic', ...).

After the edit, the file should look like:

/**
 * Core logic tests that verify the actual implementation
 * These tests focus on the algorithms and business logic
 */

import { describe, it, expect, vi } from 'vitest';

describe('HMR Core Logic', () => {
  it('throws an informative migration error when legacy hmr.js is imported directly', async () => {
    await expect(import('../src/hmr.js')).rejects.toThrow(/Coherent\.js 1\.0/);
    await expect(import('../src/hmr.js')).rejects.toThrow(/coherentjs\.dev\/docs\/migration\/1\.0/);
  });

  it('should test HMR message processing logic', () => {
    // ... existing body unchanged ...
  });

  it('should test URL construction logic', () => {
    // ... existing body unchanged ...
  });
});

(Don't edit the bodies of the surviving it blocks — just delete the Hydration Core Logic describe and leave HMR Core Logic untouched.)

Step 5: Remove ./hydration subpath export from packages/client/package.json

Open packages/client/package.json. In the exports field (around lines 8-29), delete:

"./hydration": {
  "types": "./types/hydration.d.ts",
  "default": "./src/hydration.js"
},

The surrounding entries (., ./events, ./router, ./hmr) stay. Verify trailing-comma JSON syntax.

Step 6: Check (and update if needed) build / typecheck configs

Read packages/client/build.mjs. If it contains a list of input files that includes 'src/hydration.js' or similar, remove that entry. If it uses a glob pattern that auto-discovers src/*.js, no edit needed — the file is just gone from the glob result.

Read packages/client/tsconfig.typecheck.json. If types/hydration.d.ts is listed in include or files, remove it. If the config uses a glob like types/*.d.ts, no edit needed.

Step 7: Full test + typecheck + build

pnpm --filter @coherent.js/client run test
pnpm --filter @coherent.js/client run typecheck
pnpm --filter @coherent.js/client run build
pnpm test
pnpm typecheck:packages
pnpm build

Expected: all green.

  • The client package's test count will drop substantially (~6 test files plus a describe block deleted).
  • The remaining client tests should still cover the modern hydration system (src/hydration/ subdirectory) via its own test files — verify by listing packages/client/test/ and confirming you still see tests like hydration-modern.test.js or whatever names exist for the modular system. If suspiciously little remains, flag it as a coverage concern in the commit message.

Step 8: Commit

git add -A packages/client
git commit -m "$(cat <<'EOF'
refactor(client): delete legacy hydration.js and its test ecosystem

Removes the 1,857-line legacy hydration module that was kept for one
wave to support @coherent.js/runtime. Runtime was deleted in Task 1
of this wave, so the file now has no consumers. Drops the 5 legacy
hydration test files plus the Hydration Core Logic describe block
from core-logic.test.js (HMR Core Logic block kept). Removes the
./hydration subpath export from package.json and deletes the
corresponding types/hydration.d.ts.

The modern hydration system in src/hydration/ (modular subdirectory)
is unaffected and remains the only hydration API.

Part of Wave 2a (drops) for v1.0 stable hardening.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 4: Wave 2a verification + CHANGELOG entry

Files:

  • Modify: CHANGELOG.md (extend Unreleased section)

Step 1: Full pre-flight quality gate

Run:

pnpm test
pnpm lint
pnpm typecheck && pnpm typecheck:packages
pnpm clean && pnpm build

The pnpm clean && pnpm build is important — it catches stale dist/ artifacts from before the deletions that could mask issues (this is exactly how Task C of Wave 1 ended up with a follow-up fix). Expected: all four commands green.

If anything fails, report BLOCKED — do NOT make code edits in this task to fix regressions. The brief is: Wave 2a's three prior tasks each ran a pre-commit hook that exercised the full pipeline, so failures here would mean either a stale-build issue or a cross-task interaction.

Step 2: Confirm the workspace shrank to 24 packages

Run:

ls packages/ | wc -l

Expected: 24 (was 26 before Wave 2a). Verify:

test -d packages/runtime && echo "FAIL: runtime still exists" || echo "OK: runtime gone"
test -d packages/web-components && echo "FAIL: web-components still exists" || echo "OK: web-components gone"
test -f packages/client/src/hydration.js && echo "FAIL: legacy hydration.js still exists" || echo "OK: legacy hydration.js gone"

All three should print OK.

Step 3: Extend the ## [Unreleased] section of CHANGELOG.md

Open CHANGELOG.md. Find the existing ## [Unreleased] section (added in Wave 1 Task F, located around line 55). UNDER the existing Wave 1 entries, append a new subsection so the Unreleased section now reads (Wave 1 entries are shown for context — do NOT duplicate them):

## [Unreleased]

### Removed (Wave 1)

- ... existing Wave 1 entries unchanged ...

### Changed (Wave 1)

- ... existing Wave 1 entries unchanged ...

### Known follow-ups (Wave 1)

- ... existing Wave 1 entries unchanged ...

### Removed (Wave 2a)

- **BREAKING:** Removed `@coherent.js/runtime` package. The universal-runtime story (edge workers, Deno, Bun, Electron, Tauri) is post-1.0. Migration: there is no drop-in replacement in 1.0 — consumers should pin their existing `1.0.0-beta.8` version or use the underlying `@coherent.js/core` + framework-specific integration packages directly.
- **BREAKING:** Removed `@coherent.js/web-components` package. The single-file Custom Elements integration had no consumers outside the also-removed runtime package. Consumers should pin `1.0.0-beta.8` if they need the integration, or fold the small amount of code into their own project.
- **BREAKING (client):** Deleted `packages/client/src/hydration.js` and removed the `./hydration` subpath export from `@coherent.js/client/package.json`. Wave 1 already removed the legacy named exports from the main entry; this completes the removal by deleting the underlying file and types. Modern hydration via `import { hydrate } from '@coherent.js/client'` is unchanged.
- Deleted 5 test files (`event-system.test.js`, `hydration-enhanced.test.js`, `auto-hydration.test.js`, `integration-real.test.js`, `key-reconciliation.test.js`) and the `Hydration Core Logic` describe block of `core-logic.test.js` — all exercised the legacy hydration API only.

### Changed (Wave 2a)

- `scripts/add-exports-sections.js` no longer generates README sections for `runtime` or `web-components` packages (they don't exist).
- `website/package.json` no longer declares a dependency on `@coherent.js/runtime`.

### Notes (Wave 2a)

- Workspace shrank from 26 to 24 packages (`web-components`, `runtime` removed).
- Pre-existing Wave 1 follow-up about `scripts/add-exports-sections.js` referencing removed APIs is partially addressed (runtime + web-components sections trimmed); the forms references it carried will be addressed in Wave 5 doc cleanup.

Notes:

  • Place the Wave 2a subsections AFTER the existing Wave 1 ones, not interleaved.
  • Use the exact heading text ### Removed (Wave 2a), ### Changed (Wave 2a), ### Notes (Wave 2a) so the Wave-1-vs-Wave-2a distinction is visible in the file.
  • Do NOT modify or duplicate the Wave 1 entries.

Step 4: Commit

git add CHANGELOG.md
git commit -m "$(cat <<'EOF'
docs(changelog): record Wave 2a drops

Documents the removal of @coherent.js/runtime, @coherent.js/web-components,
and the legacy packages/client/src/hydration.js along with its 5 test
files and the Hydration Core Logic describe block.

Closes Wave 2a of v1.0 stable hardening. Trunk is green; workspace is
now 24 packages (was 26). Ready for Wave 2b (package merges:
performance+profiler → devtools, three LSP packages → tooling,
build-tools → cli).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Step 5: Final confirmation

git log --oneline f86a8a2..HEAD

Expected output (most recent first): your new CHANGELOG commit, then the Task 3 commit (hydration.js deletion), then the Task 2 commit (web-components), then the Task 1 commit (runtime). Four commits total.

git status --short

Expected: only pre-existing unrelated unstaged drift carried from prior sessions. Nothing from Wave 2a tasks left uncommitted.


Post-Wave-2a handoff

Wave 2a is done. Workspace is now 24 packages.

Next plans (each gets its own document):

  • Wave 2b — Internal merges: performance + profilerdevtools; build-toolscli; new tooling package absorbing language-server + language-service + vscode-extension + testing. Plans for this should be drafted after Wave 2a merges so the workspace topology is current.
  • Wave 2c — integrations consolidation: New integrations package with subpath exports for express, fastify, koa, nextjs, and the three adapters (astro/remix/sveltekit). The biggest restructure — many downstream consumers, lots of import-path renames.
  • Wave 3 — Lockdown (per spec).
  • Wave 4 — Browser parity (per spec).
  • Wave 5 — Release (per spec).

Reasoning for sub-plans per wave: each sub-plan produces shippable trunk and the post-deletion state materially changes the import topology for the next chunk. Writing all of Wave 2's sub-plans at once would generate stale instructions by Wave 2c.