Skip to content

feat(v0.8.2): Audit + parity sweep β€” 53-issue release#290

Merged
subinium merged 31 commits into
mainfrom
release/v0.8.2
May 2, 2026
Merged

feat(v0.8.2): Audit + parity sweep β€” 53-issue release#290
subinium merged 31 commits into
mainfrom
release/v0.8.2

Conversation

@subinium

@subinium subinium commented May 2, 2026

Copy link
Copy Markdown
Owner

Summary

Closes the v0.8.2 release-critical sweep that opened immediately after v0.8.1
plus the v0.6 / v0.7 audit-debt items whose implementation contracts had
been carried open across earlier releases. 31 commits across 8 parallel
sub-agents with strict file ownership; ~203 files changed, +20.4k / -8.1k
lines.

This PR supersedes #289 (the earlier 4-commit Docker / OpenAI Responses /
vision-SSRF slice). All four of those changes are included verbatim along
with the 25-commit audit-debt cleanup that landed on top, plus a release-prep
commit consolidating the CHANGELOG.

Issue scope (53 closes, 1 refs)

Critical

Provider / runtime correctness

v0.6 audit-debt cleanup

Memory / skills / embedded protocol surfaces

Tools (provider, fetch, voice, image, retry)

Security and access

Deployment (Docker, Cloudflare, self-host)

Dashboard polish (v0.8.1 verifier-gap follow-ups)

Localisation

Refs only

Verification

  • `npm run typecheck` β€” clean
  • `npm test` β€” 2,982 / 2,982 (238 files, no skips)
  • `npm run build -- --pretty false` β€” clean
  • `npm audit --audit-level=moderate` β€” 0 vulnerabilities
  • Focused unresolved-gap tests β€” 132 passed
  • Dashboard a11y/polish tests β€” 41 passed
  • `node scripts/audit-routes.mjs --check` β€” clean
  • `git diff --check` β€” clean

Caveats

Test plan

  • Reviewer confirms CI Docker build + `/healthz` smoke passes
  • After merge: `git tag v0.8.2 && git push --tags`
  • After tag: `gh release create v0.8.2 --notes-file -` using the `[0.8.2]` section of `CHANGELOG.md`
  • After release: close fix(release): harden v0.8.2 runtime surfacesΒ #289 (superseded by this PR)
  • After release: prune `backup/release-v0.8.1-local-2026-05-03` once the v0.8.2 tag is cut

Closes #73
Closes #74
Closes #82
Closes #90
Closes #96
Closes #155
Closes #160
Closes #163
Closes #184
Closes #187
Closes #188
Closes #202
Closes #203
Closes #204
Closes #243
Closes #245
Closes #249
Closes #250
Closes #253
Closes #254
Closes #256
Closes #257
Closes #258
Closes #259
Closes #260
Closes #261
Closes #262
Closes #263
Closes #264
Closes #265
Closes #266
Closes #267
Closes #268
Closes #269
Closes #270
Closes #271
Closes #272
Closes #273
Closes #274
Closes #275
Closes #276
Closes #277
Closes #278
Closes #279
Closes #280
Closes #281
Closes #282
Closes #283
Closes #284
Closes #285
Closes #286
Closes #287
Closes #288
Refs #255

πŸ€– Generated with Claude Code

subinium and others added 30 commits May 2, 2026 13:24
This release-critical sweep addresses the Docker boot path, Cloudflare deployment drift, OpenAI-compatible request-shape regressions, vision URL SSRF validation, persistent security audit provenance, optional telemetry spans, and workspace-wide version synchronization.

Cloudflare route parity is intentionally kept bounded: this commit adds a generated parity inventory and explicit Worker 501s for Node-only bridge routes, but does not claim complete Cloudflare parity.

Constraint: Docker daemon was unavailable locally, so the image smoke is covered by CI wiring rather than a local container run.
Rejected: Close issue #255 in this sweep | full Cloudflare route parity remains broader than a safe patch-release batch.
Rejected: Hard import @opentelemetry/api | telemetry must remain optional for hosts without OTel installed.
Confidence: medium
Scope-risk: broad
Directive: Do not change OpenAI Responses request fields without checking the current OpenAI API docs.
Tested: npm run build; npm run typecheck; npm test (2,864 passed, 1 skipped); npm audit --audit-level=moderate (0 vulnerabilities); targeted provider/security/vision/Cloudflare route tests
Not-tested: Local Docker image smoke because the Docker daemon was not running
Docker smoke needs the runtime HTTP server reachable through Docker port
publishing, so the image now starts a Docker-specific server entrypoint
that binds to 0.0.0.0 and preserves the same runtime.fetch request path.

Constraint: Local Docker daemon is unavailable in this workspace; GitHub Actions is the Docker validation lane.
Rejected: Keep the CI container as --rm | it deletes crash logs before failure diagnostics can be read.
Rejected: Treat host curl failure as a CI-only workaround | the container entrypoint should bind explicitly.
Confidence: medium
Scope-risk: narrow
Directive: Keep Docker smoke logging non-rm so failed entrypoints preserve container logs.
Tested: npm run typecheck; npm test -- tests/capability-badges.test.ts; npm test (2,864 passed, 1 skipped); npm audit --audit-level=moderate
Not-tested: Local Docker image smoke because the Docker daemon was not running
Docker builds were copying stale TypeScript incremental metadata without the
matching dist directories, which let tsc skip package output and produced a
runtime image missing workspace entrypoints. The image build now forces the
project build and excludes tsbuildinfo cache files from the Docker context.

Constraint: Docker context intentionally excludes package dist directories so the image proves it can build from source.
Rejected: Copy local dist into the image | that would hide source-build regressions and weaken the smoke test.
Confidence: high
Scope-risk: narrow
Directive: Keep Docker builds independent of local TypeScript incremental cache state.
Tested: npm run typecheck; npm test -- tests/capability-badges.test.ts
Not-tested: Local Docker image smoke because the Docker daemon was not running
The Docker smoke loop compared the full container id returned by docker run
with the short ids printed by docker ps, so it treated a live container as
failed before probing /healthz. The workflow now asks Docker for the exact
container state before deciding whether to dump logs.

Constraint: Docker daemon is unavailable locally, so GitHub Actions remains the container smoke validation lane.
Rejected: Match short id prefixes manually | docker inspect directly answers the state for the known container id.
Confidence: high
Scope-risk: narrow
Directive: Keep the smoke loop keyed by the exact container id returned from docker run.
Tested: Reviewed workflow diff and previous Actions log showing the id-length mismatch.
Not-tested: Local Docker smoke because the Docker daemon was not running
Add VPS Docker Compose plus Caddy artifacts and a Mac Mini launchd runbook so self-host deployments have concrete, repeatable entrypoints without changing runtime behavior.

Constraint: Keep deployment support local and documented without pushing to a remote release branch.

Rejected: Fold Tailscale SSRF policy into the deploy docs | that security behavior belongs to a separate opt-in network change.

Confidence: high

Scope-risk: narrow

Directive: Keep deployment secrets in environment files or host secret stores, not checked-in Compose values.

Tested: node package.json parse; bash -n deploy/launchd/install.sh

Not-tested: docker compose up and launchctl bootstrap because those affect the host runtime.
Strengthen local security boundaries without changing happy-path runtime behavior: SSRF validation now blocks additional special-use transition ranges, Codex auth loading validates shape and warns on loose file permissions, and delegation depth is carried as a typed execution-context field through child agents and sandbox RPC.

Constraint: Keep security hardening additive and non-breaking for existing valid auth files.

Rejected: Fail closed on group-readable auth.json | warning first avoids breaking existing Codex CLI installs while still surfacing the risk.

Rejected: Keep delegateDepth on an unsafe cast | typed context propagation lets nested tool paths preserve the guard.

Confidence: high

Scope-risk: moderate

Directive: Do not weaken SSRF transition-range blocks without adding explicit opt-in policy and tests.

Tested: npm run build; npm test -- tests/security.test.ts tests/delegate-tool.test.ts tests/codex-auth.test.ts

Not-tested: Real Codex CLI auth refresh against OpenAI auth servers.
Implement the provider/tool batch without adding dependencies: OpenAI requests now retry transient 429/5xx responses, emit prompt-cache routing fields only for OpenAI-hosted endpoints, sort tool schemas for stable prefixes, expose cached token usage, use model-family token estimates, add reader-mode web.fetch byte caps, and expose voice.stt as a transcription alias.

Constraint: AGENTS.md disallows new dependencies without explicit request, so token counting uses a local model-family estimator instead of adding a tokenizer package.

Constraint: OpenAI prompt caching is automatic for matching prefixes; CrowClaw only adds stable routing fields and deterministic tool ordering.

Rejected: Add a tokenizer dependency | dependency policy requires explicit approval.

Rejected: Send prompt_cache_key to OpenAI-compatible backends | non-OpenAI providers may reject OpenAI-only parameters.

Confidence: medium

Scope-risk: moderate

Directive: Keep provider-specific request fields gated by base URL or explicit config support.

Tested: npm run build; npm test -- tests/openai-provider.test.ts tests/token-counting.test.ts tests/tools-breadth.test.ts tests/voice-tools.test.ts

Not-tested: Live OpenAI prompt-cache hit rate or live rate-limit retry behavior.
CrowClaw needs durable cross-session recall, portable migration, and soft supply-chain checks before the 0.8.1 issue branch can absorb the next compatibility batch. This keeps the default paths backward-compatible while adding opt-in LLM summaries, scoped memory routing, tokenized memory search, skill content hashing, and Hermes/OpenClaw import plumbing.

Constraint: Existing SKILL.md parsing remains synchronous, so hash verification runs in the async directory loader and explicit verifier helper.\nConstraint: Runtime LLM memory summaries are opt-in via CROWCLAW_MEMORY_SUMMARIZE to avoid surprise cost and latency.\nRejected: Make content_hash mismatches hard failures by default | existing community skills would become brittle without a migration window.\nRejected: Introduce a new migration package | the CLI already owns local CrowClaw layout discovery and command UX.\nConfidence: high\nScope-risk: moderate\nDirective: Do not make memory llmSummarize default-on without a cost and latency review.\nTested: npm run typecheck; npm test -- tests/skill-manifest.test.ts tests/memory-provider.test.ts tests/memory-manager.test.ts tests/storage-memory.test.ts tests/cli-commands.test.ts\nNot-tested: Real Hermes/OpenClaw user home imports; live provider-backed memory summarization.
Issue proposals ask for concrete production adapters without broadening runtime scope, so this batch adds the missing adapter surfaces behind explicit configuration and keeps local fallbacks deterministic in tests.

The learning runner now scores expected outputs and exposes an Atropos-compatible environment facade. Tooling gains provider fallback chains for web search, vision, and image generation; gateway normalization recognizes WhatsApp and Signal; terminal execution can plan Singularity alongside hardened Docker commands.

Constraint: External providers and container runtimes must remain opt-in and testable without live credentials.

Rejected: Add new SDK dependencies | HTTP adapters and command planners cover the requested surfaces with less release risk.

Rejected: Replace local test doubles with live provider calls | release verification must run without external accounts.

Confidence: high

Scope-risk: moderate

Directive: Keep provider fallback ordering explicit and do not silently call paid or external services without configured credentials.

Tested: npm run typecheck

Tested: npm test -- tests/batch-trajectory.test.ts tests/atropos-env.test.ts tests/gateway-normalization.test.ts tests/tools-breadth.test.ts tests/local-executor.test.ts tests/runtime-terminal.test.ts tests/vision-real.test.ts tests/runtime-vision-image-routes.test.ts

Not-tested: Live Atropos, Brave, Tavily, Exa, Gemini, Replicate, Singularity, Docker, and SSH runtimes
Make the 0.8.1 self-host path safer without broadening the runtime model: tailnet access stays explicit, provider secrets resolve through a fail-closed chain, and chat/webhook ingress now has rate and budget circuit breakers.

This also keeps release verification green by preserving credential-pool cooldown semantics and accepting the legacy delegate-depth context key used by existing callers.

Constraint: Tailnet private ranges stay blocked unless CROWCLAW_TAILNET_ALLOWLIST explicitly allows them
Constraint: Secret references must fail closed instead of silently falling back to EchoProvider
Rejected: Treating CGNAT or ULA ranges as public by default | weakens SSRF protections for self-hosted nodes
Rejected: Retrying pooled 429s against the same key | bypasses credential cooldown and fallback behavior
Confidence: high
Scope-risk: moderate
Directive: Keep tailnet fetch allowlists explicit and do not downgrade unresolved secret references to echo mode
Tested: npm run typecheck
Tested: npm test -- tests/security-critical.test.ts tests/provider-factory.test.ts tests/cli-commands.test.ts tests/tools-breadth.test.ts tests/runtime-telegram.test.ts tests/credential-pool.test.ts tests/delegate-tool.test.ts tests/delegate-enhanced.test.ts
Tested: npm test
Not-tested: live Tailscale daemon, live 1Password CLI, live systemd credential rotation, live SOPS backend
Related: #265
Related: #266
Related: #267
Enable noUncheckedIndexedAccess and tighten unsafe indexed reads across shared packages so future route, tool, memory, and compression changes are checked by the compiler instead of relying on implicit array/map presence.

Constraint: Type hardening must preserve current runtime behavior while turning on the stricter base tsconfig flag
Rejected: Leave noUncheckedIndexedAccess disabled | this keeps the issue open and hides missing guards in shared code
Confidence: high
Scope-risk: moderate
Directive: Prefer explicit guards/defaults for indexed reads; avoid reverting to non-null assertions unless the invariant is locally proven
Tested: npm run typecheck
Tested: npm test
Related: #163
Add plugin manifests, catalog validation, memory-backend contracts, reference hook plugins, skill previews, scoped background process stores, and MCP/ACP real-data wiring so extension authors and runtime integrations have concrete contracts instead of stubs.

Constraint: Do not add new dependencies or shell out to install community code in local tests
Rejected: Implement arbitrary plugin clone/install execution | too broad for the issue and unsafe without a trust model
Confidence: high
Scope-risk: moderate
Directive: Keep plugin manifests declarative; raw command execution must remain rejected by validation
Tested: npm run typecheck
Tested: npm test
Related: #90
Related: #160
Related: #188
Related: #191
Related: #202
Related: #203
Add endpoint policy decisions, token-scope containment, runtime telemetry metrics, checkpoint auto-resume hooks, plugin/MCP catalog install APIs, gateway activity logging, and smaller runtime helper modules so operational surfaces are enforceable and observable locally.

Constraint: Catalog installs must stay manifest-driven and authenticated; local work must not push or reach production
Rejected: Keep MCP install as raw command text only | it preserves the RCE-prone UX called out in the audit
Rejected: Split runtime-node by sweeping rewrite | too large for this issue batch, so only embedded protocol and gateway helpers were extracted
Confidence: high
Scope-risk: broad
Directive: Keep install endpoints on dangerous-route auth; do not make raw command install the default path again
Tested: npm run typecheck
Tested: npm test
Related: #73
Related: #74
Related: #82
Related: #96
Related: #155
Related: #189
Related: #190
Related: #199
Related: #200
Related: #201
Expand the dashboard with skill match explanations, usage breakdowns, security search, memory edit/pin/size controls, learning metrics, session browsing, provider slots, persona/config previews, gateway operations, locale/theme preferences, and Connect catalog flows so the next release has usable operator surfaces instead of hidden APIs.

Constraint: Keep UI changes tied to existing runtime APIs and generated single-file dashboard output
Rejected: Build a full translation catalog in this batch | would overgrow the audit fix; locale preference and shell-level switching are added first
Confidence: high
Scope-risk: broad
Directive: Rebuild packages/web/src/generated.ts after any dashboard UI change
Tested: npm run build:ui --workspace @crowclaw/web
Tested: npm run build:html --workspace @crowclaw/web
Tested: npm run typecheck
Tested: npm test
Related: #181
Related: #182
Related: #183
Related: #184
Related: #185
Related: #186
Related: #187
Related: #192
Related: #196
Related: #197
Related: #198
Related: #204
Related: #205
Related: #206
Related: #207
Related: #208
Related: #212
Related: #213
Related: #214
Related: #215
Related: #216
Related: #217
Related: #218
Related: #219
Related: #220
Related: #221
Related: #222
Related: #223
Related: #224
Related: #225
Related: #226
Related: #227
Related: #228
The 0.8.1 issue sweep needs the Node runtime entrypoint to stop owning every route, provider, gateway, and agent bootstrap concern in one file. The route dispatch ladder now lives in route-handlers, agent construction lives in agent-bootstrap, and gateway policy/delivery helpers live in gateway-wiring while index.ts remains the runtime assembler.

Constraint: Issue #155 asks for a pure refactor with behavior preserved and tests remaining green

Rejected: Keep only utility extraction | it left the REST and WS route ladder in index.ts and did not satisfy the issue

Confidence: high

Scope-risk: moderate

Directive: Keep new route branches in route-handlers instead of growing index.ts again

Tested: npm run typecheck

Tested: npm test

Tested: npm run build:ui --workspace @crowclaw/web

Tested: npm run build:html --workspace @crowclaw/web

Related: #155
Korean UI selection should affect both dashboard chrome and the LLM-facing runtime context, otherwise the language toggle is cosmetic. This adds lightweight EN/KO resources, sends the locale with API/SSE calls, and resolves localized persona and skill metadata when prompts are built.

Constraint: Keep the dashboard layout stable while wiring locale through existing APIs

Rejected: Translate every view string in one sweep | too broad for #204 and likely to create unrelated UI churn

Confidence: high

Scope-risk: moderate

Directive: New prompt-facing metadata should pass through normalizeLocale/localizeSkillFile rather than hand-parsing locale keys

Tested: npm run typecheck

Tested: npm test

Tested: npm run build:ui --workspace @crowclaw/web

Tested: npm run build:html --workspace @crowclaw/web

Related: #204
The release branch still had deployment and Cloudflare parity gaps after the earlier sweep. This fills the top-level Worker route coverage that operators expect from the dashboard, hardens Compose defaults, and makes the Mac Mini launchd path survive sleep and restart loops more predictably.

Constraint: Keep self-host changes local and declarative; do not push or touch production infrastructure

Rejected: Mark the parity table complete without Worker handlers | dashboard routes would still 404 on Cloudflare

Confidence: high

Scope-risk: moderate

Directive: Regenerate docs/cloudflare-route-parity.md with scripts/audit-routes.mjs when route surfaces change

Tested: npm run typecheck

Tested: npm test

Tested: node scripts/audit-routes.mjs

Tested: docker compose config with required env values

Tested: bash -n deploy/launchd/install.sh

Related: #253

Related: #254

Related: #255

Related: #256

Related: #257

Related: #258

Related: #261

Related: #262

Related: #263

Related: #264
The final tools/provider sweep had small but release-relevant gaps: voice STT needed issue-named aliases, web fetch needed clearer format/cap behavior, Docker execution plans needed hardened defaults, and provider fallback metadata needed to recognize current GPT-5 model families and prompt-cache support.

Constraint: Keep external providers opt-in and testable without live credentials

Rejected: Add provider SDK dependencies | existing HTTP adapters and local planners cover the required behavior with less release risk

Confidence: high

Scope-risk: moderate

Directive: Do not return simulated image or vision success when no configured provider key exists

Tested: npm run typecheck

Tested: npm test

Tested: npm test -- tests/provider-mode.test.ts tests/tools-breadth.test.ts tests/vision-real.test.ts tests/local-executor.test.ts tests/v06-tools-security.test.ts tests/runtime-terminal.test.ts tests/cli.test.ts

Related: #268

Related: #269

Related: #270

Related: #271

Related: #272

Related: #273

Related: #274

Related: #275

Related: #276

Related: #277

Related: #278

Related: #279

Related: #280

Related: #281

Related: #282

Related: #283

Related: #284

Related: #285

Related: #286

Related: #287

Related: #288
Keep the 0.8.1 release branch locally reviewable by finishing the runtime-node split and closing the exact verifier gaps for gateway token scope containment and memory backend plugins.

Constraint: Work stays local on release/v0.8.1 with no push or PR.

Rejected: Treat canMutateToken and MemoryBackendPlugin as sufficient by existence alone | the runtime routes and memory provider selection needed real integration.

Confidence: high

Scope-risk: moderate

Reversibility: clean

Directive: Keep index.ts as runtime orchestration; add new route or lifecycle logic to focused modules instead of growing the entrypoint.

Tested: npm run typecheck; npm test; npm run build:ui --workspace @crowclaw/web; npm run build:html --workspace @crowclaw/web

Related: #74 #90 #155
Finish the remaining local 0.8.1 issue sweep by wiring endpoint policy configuration, GenAI observability surfaces, restart checkpoint resume, and per-runtime terminal process ownership.

Constraint: Work stays local on release/v0.8.1 with no push or PR.

Rejected: Leave partial implementations behind the earlier helper APIs | verifier agents found missing config, event, route, and factory surfaces that needed first-class integration.

Confidence: high

Scope-risk: moderate

Reversibility: clean

Directive: Keep gateway policy, telemetry span names, checkpoint resume, and terminal session ownership covered by their focused tests before changing these surfaces.

Tested: npm run typecheck; npm test -- --run tests/gateway-policy.test.ts tests/config-schema.test.ts tests/config-api.test.ts tests/runtime-node-gateway-outbound.test.ts tests/observability-otel.test.ts tests/event-bus.test.ts tests/checkpoint.test.ts tests/cli-commands.test.ts tests/tools-breadth.test.ts; npm test; npm run build:ui --workspace @crowclaw/web; npm run build:html --workspace @crowclaw/web; git diff --check

Related: #73 #82 #96 #160
Preserve the local release branch work outside the commit trailers so the pending 0.8.1 PR can be reviewed with an explicit changelog entry and verification summary.

Constraint: Work remains local on release/v0.8.1 with no push or PR.

Rejected: Rely only on git trailers | release reviewers need a top-level changelog summary before publication.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Directive: Convert this Unreleased section into the final release section when publishing the branch.

Tested: git diff --check

Related: #73 #74 #82 #90 #96 #155 #160 #163 #204 #253 #254 #255 #256 #257 #258 #261 #262 #263 #264 #268 #269 #270 #271 #272 #273 #274 #275 #276 #277 #278 #279 #280 #281 #282 #283 #284 #285 #286 #287 #288
Make the local release sweep resumable from the repository itself instead of relying on chat context or final changelog summaries.

Constraint: Work remains local on release/v0.8.1 with no push or PR.

Rejected: Use only CHANGELOG.md | changelogs summarize releases after the fact and are too coarse for interruption recovery.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Directive: Update docs/release-v0.8.1-worklog.md before and after each future issue batch, including subagent ownership and verification evidence.

Tested: git diff --check
Keep the release lane recoverable by recording the branch, commit, regression-test, and conflict-management rules in the live worklog before the next issue batch starts.

Constraint: Work remains local on release/v0.8.1 with no push or PR.

Rejected: Treat the process as chat-only guidance | interruption recovery requires repository-local instructions.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Directive: Follow this worklog before delegating, testing, staging, or committing future 0.8.1 issue batches.

Tested: git diff --check
Record the 2026-05-03 remote-open issue audit before verifier agents inspect the remaining GitHub issues, so interruption recovery knows this batch was in progress.

Constraint: Work remains local on release/v0.8.1 with no push or PR.

Rejected: Wait until audit completion to update the ledger | the user requested live recording that survives interruptions.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Directive: Append verifier outcomes and any follow-up patches to docs/release-v0.8.1-worklog.md before the next implementation commit.

Tested: git diff --check
Persist the first verifier outcomes from the open-issue audit before implementation starts, including the confirmed low-number pass set and the dashboard issues that still need patching.

Constraint: Work remains local on release/v0.8.1 with no push or PR.

Rejected: Keep verifier findings only in chat | live release recovery needs the unresolved issue list in the repository.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Directive: Patch #243 #245 #249 #250 only after the remaining verifier ranges finish or their file ownership is confirmed.

Tested: git diff --check
The local 0.8.1 sweep now has verifier-confirmed unresolved issues across dashboard, memory, protocol embedding, delegate metadata, and provider defaults. Recording the ownership split before implementation keeps the branch resumable if the parallel batch is interrupted.

Constraint: Work must remain local on release/v0.8.1 without push or PR.\nConstraint: User requested live tracking so interruption does not lose state.\nRejected: Keep unresolved issue state only in chat | compaction or interruption would make the release lane ambiguous.\nConfidence: high\nScope-risk: narrow\nDirective: Update this ledger before and after each remaining issue batch.\nTested: git diff -- docs/release-v0.8.1-worklog.md\nNot-tested: Full test suite not needed for documentation-only checkpoint
The verifier pass found release-blocking gaps in memory management, embedded protocol servers, Cloudflare route parity, secret loading, semantic memory recall, delegate depth propagation, and Codex provider defaults. This batch closes those contracts together because they share runtime API surfaces and regression coverage for the 0.8.1 release branch.

Constraint: Work remains local on release/v0.8.1; no push, PR, or remote issue closure.\nConstraint: Preserve existing public APIs where possible and avoid new dependencies.\nRejected: Treat SOPS references as documentation-only | the issue title explicitly includes sops and a CLI-backed source is small and fail-closed.\nRejected: Leave route parity inventory as advisory | CI needed a drift gate so future Node routes cannot silently miss Worker handling.\nConfidence: high\nScope-risk: broad\nDirective: Keep route audit rows either covered or explicitly unsupported_on_workers; do not reintroduce legacy delegate depth casts.\nTested: npm run build -- --pretty false\nTested: npm run typecheck\nTested: focused unresolved-gap tests, 12 files / 132 tests\nTested: npm test, 238 files / 2,982 tests\nTested: node scripts/audit-routes.mjs --check\nTested: git diff --check\nNot-tested: Push/PR/remote issue closure intentionally not performed
The remaining dashboard verifier gaps were coupled through the generated single-file bundle: markdown loading, visual reset tokens, live-region accessibility, reduced motion, and chat render volume all affect the same shipped artifact. This commit closes the dashboard slice as one reviewable batch and regenerates the served HTML.

Constraint: No new frontend dependencies; keep existing Lit/Vite build flow.\nRejected: Keep glass fallbacks in unowned components | generated HTML still shipped legacy reset tokens and failed the release regression.\nRejected: Add virtualizer dependency | a bounded incremental render window closes the perf issue with less surface area.\nConfidence: high\nScope-risk: moderate\nDirective: Do not reintroduce eager highlight.js CDN assets or --glass-* dashboard tokens.\nTested: npm run build:ui --workspace @crowclaw/web\nTested: npm run build:html --workspace @crowclaw/web\nTested: npm test -- tests/dashboard-polish.test.ts tests/a11y.test.ts\nTested: npm test, 238 files / 2,982 tests\nTested: rg legacy glass/highlight.js token checks\nTested: git diff --check\nNot-tested: Browser visual screenshot pass not run for this non-layout-release batch
The local 0.8.1 branch now has verified implementation commits for the remaining runtime and dashboard gaps. Recording the exact SHAs, issue coverage, and verification evidence keeps the release lane resumable without relying on chat state.

Constraint: User requested live release tracking that survives interruption.\nConstraint: Branch remains local release/v0.8.1 with no push or PR.\nRejected: Leave verification evidence only in commit messages | release handoff needs a repo-local ledger and changelog.\nConfidence: high\nScope-risk: narrow\nDirective: Continue updating this ledger before any additional release batch.\nTested: npm run build -- --pretty false\nTested: npm run typecheck\nTested: npm test, 238 files / 2,982 tests\nTested: npm run build:ui --workspace @crowclaw/web\nTested: npm run build:html --workspace @crowclaw/web\nTested: node scripts/audit-routes.mjs --check\nTested: git diff --check\nNot-tested: Push/PR/remote issue closure intentionally not performed
- Merge [Unreleased] release/v0.8.1 sweep section into single [0.8.2]
  CHANGELOG entry. Scope grew from 9 (PR #289) to 53 issues once the
  v0.6 / v0.7 audit-debt implementation contracts finished.
- Bump README test count badge 2,864 -> 2,982 and rewrite the v0.8.2
  line in the beta warning to reflect the consolidated 53-issue scope.
- Rename docs/release-v0.8.1-worklog.md -> docs/release-v0.8.2-worklog.md
  with a header note recording the branch rename.

Verification:
- npm run typecheck β€” clean
- npm test β€” 238 files, 2,982 / 2,982 (no skips on this run)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reproduced npm test on the consolidated branch: 238 files, 2,982 passed,
no skips. Earlier worklog/PR #289 [0.8.2] section had carried a
"1 a11y placeholder skipped" line that no longer reflects current state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@subinium subinium merged commit 72fa31b into main May 2, 2026
1 check passed
subinium added a commit that referenced this pull request May 3, 2026
All 8 phases of the v0.8.3 sweep resolved as a GitHub-close pass with
zero source code change. Verifier audit on main (commit 72fa31b)
confirmed every issue in scope had already been implemented and shipped
via earlier release PRs (#209, #211, #251, #252, #290), but those PRs
used range syntax in their close clauses ("Closes #230-#240", "Closes
the 10-issue gap (#241-#250)") which GitHub does not auto-process β€”
leaving 52 issues in OPEN state despite the implementation being on
main.

- CHANGELOG [Unreleased] -> [0.8.3] with the 52-issue close summary,
  grouped by which earlier release shipped the work.
- README updates: changelog badge v0.8.2 -> v0.8.3 and the beta
  warning rewritten to include "52-issue v0.8.3 GitHub-close pass".
- docs/release-v0.8.3-worklog.md finalised with the per-phase result
  ledger and verifier evidence locations.

Verification:
- npm run typecheck β€” clean
- node scripts/audit-routes.mjs --check β€” zero missing rows
- gh issue list --state open --label priority/critical β€” 0

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
subinium added a commit that referenced this pull request May 3, 2026
* chore(release): bootstrap v0.8.3 sweep

- Bump root + 19 packages + wrangler.jsonc 0.8.2 -> 0.8.3 via
  scripts/sync-versions.mjs.
- Scaffold docs/release-v0.8.3-worklog.md with the 8-phase plan for
  the 52 issues that remained open at v0.8.2 cut.
- Add CHANGELOG [Unreleased] stub for the sweep.
- GitHub-closed verifier-confirmed issues #224, #242, #244, #246,
  #247, #248 (already shipped in v0.8.1 PR #252; verified in v0.8.2
  PR #290). No code change for these closes.

Phase order: critical bugs (#190, #212, #213, #214) -> Hermes harness
(#231) -> wiring (#215, #216, #218) -> Hermes parity (#232-#240) ->
Web UX wave (~22) -> memory/plugins (#186, #189, #191) -> Cloudflare
parity (#255).

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

* chore(release): finalize v0.8.3 GitHub-close pass

All 8 phases of the v0.8.3 sweep resolved as a GitHub-close pass with
zero source code change. Verifier audit on main (commit 72fa31b)
confirmed every issue in scope had already been implemented and shipped
via earlier release PRs (#209, #211, #251, #252, #290), but those PRs
used range syntax in their close clauses ("Closes #230-#240", "Closes
the 10-issue gap (#241-#250)") which GitHub does not auto-process β€”
leaving 52 issues in OPEN state despite the implementation being on
main.

- CHANGELOG [Unreleased] -> [0.8.3] with the 52-issue close summary,
  grouped by which earlier release shipped the work.
- README updates: changelog badge v0.8.2 -> v0.8.3 and the beta
  warning rewritten to include "52-issue v0.8.3 GitHub-close pass".
- docs/release-v0.8.3-worklog.md finalised with the per-phase result
  ledger and verifier evidence locations.

Verification:
- npm run typecheck β€” clean
- node scripts/audit-routes.mjs --check β€” zero missing rows
- gh issue list --state open --label priority/critical β€” 0

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment