Release v0.76.1
Release v0.76.1 — audit remediation + post-closure CI firefight
Date: 2026-04-24
Tag: v0.76.1
Summary
First release to ship the three audit-remediation batches (docs credibility, hermetic local tests, polish + instrumentation) plus the five CI-firefight fixes that landed after the audit arc closed. No breaking product changes; no schema or CLI changes.
v0.76.0 was tagged without a preceding version-bump commit and was permanently burned at the check-version.mjs gate — all five release workflows failed in 3–4 seconds each, no artifacts published anywhere. Per tag-immutability policy, v0.76.0 is a dead tag; v0.76.1 is the first actually-shipping release on this line.
What landed
Batch 1 — docs credibility (commit bd06082)
docs/deployment-guide.mdenv tables gained an explicitDefaultcolumn, pulled from the Description prose and matched againstapps/api/src/config.ts. Previously theExamplecolumn was being misread as the default by buyers. Three defaults that had drifted were corrected:NODE_ENV=development(image:production),OIDC_REDIRECT_URIis Required-when-OIDC-enabled,OIDC_AUTO_PROVISION=true.- Go SDK consumer-install docs (
docs/sdk-generation-guide.mdrow andpackages/sdk-go/README.mdbanner) now describe the public mirror as “first-publish pending” with the exactRepository not foundsymptom, instead of promising a livego getpath. Two bugs in the Go recipe fixed:packageName=pulp-engine→packageName=pulpengine(Go identifiers reject hyphens), and the stalerewriteGoModulefunction reference → the actualpostProcesshook ingenerate-sdks.ts. - All four shipped SDK READMEs (TypeScript, Python, Go, .NET) gained a “Preview routes in production” subsection that explains the
PREVIEW_ROUTES_ENABLEDgate and points atGET /capabilitiesas runtime truth. The production-endpoint list was corrected fromPOST /render/pdf(doesn’t exist) to the real surface (POST /render+ per-format routes). - Python SDK README’s bad repo link (
github.com/anthropics/pulp-engine) fixed togithub.com/TroyCoderBoy/pulp-engine. .claudepath leaks removed from 4 source docs that were publishing to the website and 404-ing in production. New content-gate inapps/website/scripts/sync-docs.mjsfails the website build on regression.
Batch 2 — hermetic local tests (commit 0620c59)
apps/api/src/__tests__/setup/env-isolation.setup.tswidened to stripREDIS_URL,RATE_LIMIT_STORE,RATE_LIMIT_FAIL_OPEN(prevents a populated devREDIS_URLfrom flooding the API suite with 429s). Swapped the staleOIDC_ISSUERentry for the real enable flagOIDC_DISCOVERY_URLthat’s actually read byconfig.ts.- New
apps/api/README.mdwith honest local test-loop setup. Documents the actualdotenv -e ../../.env -- vitest runcontract, uses the exact CI Docker shape for the throwaway Postgres container (postgres:16,POSTGRES_DB=pulp-engine), and explicitly calls out ephemeral per-run DB provisioning as a non-goal. - Editor test determinism:
apps/editor/vitest.config.tsswitched topool: 'forks'(Vitest 4 shape matchingapps/api/vitest.file.config.ts), plus a newapps/editor/src/test-setup.tswith a defensiveafterEachthat callscleanup()gated ondocumentpresence andlocalStorage?.clear?.()/sessionStorage?.clear?.()with optional chaining so tests that stub storage with minimal objects don’t throw. Resolves the cross-file jsdom contamination that was producinggetMultipleElementsFoundErrorinlogin-identity.test.tsxunder the default threads pool.
Batch 3 — polish + instrumentation (commit d0905b9)
- Licence copy alignment across
README.mdand three marketing pages (pricing.astro,features.astro,get-started.astro). Each mention of licence-key behaviour gains a short honest disclosure: the current gate is a presence check onPULP_LICENCE_KEY, cryptographic validation is on the roadmap, removing the watermark remains a licence breach regardless of technical means.EVALUATION-LICENCE.mduntouched — the legal text is interpretable in a way that’s compatible with current code behaviour. - New
docs/initiatives/signed-licence-v1.md— single anchor for the disclosures above, describing current enforcement, target enforcement, and why it’s deferred. - Windows installer smoke gained bootstrap diagnostics.
installer/scripts/start-pulpengine.ps1writes timestamped phase markers to%APPDATA%\PulpEngine\logs\bootstrap.log(entry, env-load, chromium-resolve, chromium-resolved, pre-spawn, spawned); resolved Chromium path is logged before the existence check..github/workflows/ci.yml’s/health/readytimeout block appendsGet-Process node/Get-NetTCPConnection/Get-CimInstance Win32_Processcaptures to the same log, defensively creating$LogDirif it’s missing. All of this rides the existingci-windows-logsartifact upload.continue-on-error: trueon the Start step is preserved — this batch adds visibility, not gating. - Editor bundle visualizer wired in behind
VITE_BUNDLE_REPORT=1env gate. Default-off. Initial measurement:bwip-js(1400 KB rendered / 258 KB gzip) andexceljs(1287 KB / 278 KB gzip) together account for ~85% of the vendor bucket; both have independent lazy boundaries and are candidates for a future named-chunk promotion.
Ops ticket (commit 41ef7c6)
docs/initiatives/go-mirror-first-publish.md— one-time operator prerequisites to un-404github.com/TroyCoderBoy/pulp-engine-go. Sync script and workflow were already built; only the public mirror repo +PULP_ENGINE_GO_MIRROR_TOKENActions secret are pending. Fully actionable without reopening any code.
Post-closure CI firefights (commits 6bb4b01 · 68d6638 · 2ce51da · d9009e7)
- Prisma
6.19.3upstream packaging regression — the CLI shipped with a 7.x Wasm engines bundle, which rejected thedatasource { url = env("DATABASE_URL") }form our schema uses. Every CI job with a cleanpnpm install --frozen-lockfilefailed at theapps/apipostinstall hook withPrisma CLI Version : 7.8.0(the 6.x CLI loading the 7.x engine). Pinned bothprismaand@prisma/clientto exact6.18.0; re-resolved lockfile has matching@prisma/engines-version@6.18.0-8.34b5a692.... Thedb:generate/db:migrate/db:deployscripts also gained apnpm execprefix to force workspace-local binary resolution regardless of shell PATH. - Website test
Responsehelpers in the playground suite were wrapping bodies innew Blob([...])which tripped a jsdom/undici/Node-Blob realm mismatch on CI Linux (TypeError: object.stream is not a function). Switched to string bodies with explicitContent-Typeheaders; the Fetch spec guaranteesresponse.blob().typecomes from Content-Type so assertions remained valid. plugin-storage-activation.test.tsbriefly un-parked during Batch 3 diagnostic pass (3× green local runs), then re-parked after CI Windows reproduced the failure on the next run. CI gave us the concrete diagnostic the earlier “cross-file state pollution” hypothesis missed — the test’s fake plugin callsctx.templateStore.list()inside its activation function at line 188, whichplugin-system.plugin.ts:293’sassertStoreReadyexplicitly forbids. Timing-sensitive, not deterministically broken; GH Actions Windows’ slower disk I/O races reliably into the failure window. Parked until the test plugin is fixed; tracked indocs/initiatives/file-mode-wip-followups.md.
Operational posture
- v0.76.0 is burned. Tag exists on origin pointing at
d9009e7, which still has0.75.8in allpackage.jsonfiles. All 5 release workflows (Release, Publish {TypeScript, Python, Go, .NET} SDK) failed at thecheck-version.mjsgate in 3–4 seconds. No GitHub Release exists for v0.76.0; no npm, PyPI, NuGet, or GHCR artifacts published. The tag is permanent per the repo’s tag-immutability policy. - Cloudflare Pages (pulpengine.dev) auto-deploys from
mainand reflects every commit above — the Batch 3 licence-copy disclosure (“cryptographic validation”, roadmap link) is live on the pricing page. - v0.76.1 is the first tag to ship installer artifacts since v0.75.8. Go SDK publish will fail at the mirror-sync step until the Go-mirror ops ticket is executed; all other publishes are unblocked.
Verified before tagging
node scripts/check-version.mjs— all 9 version surfaces aligned at0.76.1, tag matches, CHANGELOG section + link present,docs/release-v0.76.1.mdexists.pnpm --filter @pulp-engine/api typecheck— green.pnpm --filter @pulp-engine/editor typecheck— green.pnpm --filter @pulp-engine/website build— 110 pages, postbuild clean,.claudegate green.pnpm --filter @pulp-engine/api test:file(withplugin-storage-activation.test.tsre-parked) — 73 passed, 8 skipped (81 files) · 1225 passed, 97 skipped (1322 tests). Matches pre-Batch-3 baseline.pnpm --filter @pulp-engine/editor test— 5 consecutive runs in default parallel mode: all green (95 files, 1311 passed, 2 skipped, 0 failed).pnpm --filter @pulp-engine/website test— 8 files, 60 tests, 0 failed.pnpm sdk:generate— green;.NETcsproj andsdk-go/version.goregenerated to0.76.1.
Known residual (tracked, not blocking)
- Go public mirror 404 until the ops runbook (
docs/initiatives/go-mirror-first-publish.md) is executed. plugin-storage-activation.test.tsparked inWIP_TESTS; tracked infile-mode-wip-followups.mdwith the concretectx.templateStore.list()-during-activation diagnostic.- Editor vendor chunk promotion for
bwip-jsandexceljsdeferred; measurement infrastructure is in place to inform the split decision.