Pulp Engine Document Rendering
Get started
Release v0.78.3

Release v0.78.3 — recovery patch for v0.78.2

Date: 2026-05-08 Tag: v0.78.3

Summary

Recovery patch for the v0.78.2 line. The v0.78.2 tag exists in git but no artifacts shipped — the website sync-docs build guardrail correctly rejected apps/website#build because the original docs/release-v0.78.2.md:81 referenced an absolute Windows path to an internal-only authoring file (the kind project policy forbids leaking into published docs). The Release workflow’s CI gate then rejected the v0.78.2 tag and no Docker image, GH Release, npm package, or PyPI package was published.

v0.78.3 carries the same code payload as v0.78.2 plus a one-line release-note fix that satisfies the guardrail. The v0.78.2 git tag is preserved as a historical “tagged but never shipped” marker per tag-immutability — never force-pushed, never moved.

What landed

The fix

docs/release-v0.78.2.md:81 “Known residual” bullet — replaced the absolute path reference with neutral prose (“the internal audit-remediation plan”). One-line edit, caught by apps/website/scripts/sync-docs.mjs at build time. Commit d378bdb.

Carried forward from v0.78.2 (unchanged)

The four v0.78.2 workstreams land for the first time on a published release here. Code identical to v0.78.2’s tagged commit 5e8eff6:

  • Reproducible default test gate on Windowsapps/api/vitest.config.ts + apps/editor/vitest.config.ts mirror the existing vitest.file.config.ts Windows-singleFork pattern. pnpm test runs green on Windows with no flag overrides.
  • U+FFFD encoding-corruption guardscripts/check-encoding.sh extended; wired into .github/workflows/ci.yml; 14 U+FFFD bytes cleaned from 4 source files.
  • Python SDK packaging name fixgit mv packages/sdk-python/docuforge → pulp_engine; pyproject.toml + 21 import / mock.patch() string fixes across 14 SDK files. New python3 -m compileall CI guard.
  • Tag-glob hygienerelease.yml + the two publish workflows skip -rc*/-alpha*/-beta* tags.
  • per-template-rate-limit.test.ts Windows wall-clock fix (1ms → 50ms window / 5ms → 100ms wait) — surfaced during rc validation.

See docs/release-v0.78.2.md for the full per-line-item detail; that document is canonical for what shipped, even though the v0.78.2 tag itself never produced artifacts.

Why v0.78.2 stays as an unpublished tag

Per the project’s tag-immutability rule (memory feedback_tag_immutability.md): “Tags are immutable; post-tag fixes go in a new patch version, not a force-push”. The v0.78.2 tag was pushed and CI immediately failed; no consumer received any v0.78.2 artifact (no Docker image, no GH Release, no npm/PyPI publish). Deleting and re-pointing the tag would be force-push behaviour even with no consumers — the rule covers it. v0.78.3 is the documented recovery path.

git tag --list 'v0.78.*' will show:

  • v0.78.0 — published
  • v0.78.1 — published
  • v0.78.2tagged at 5e8eff6, no artifacts; superseded by v0.78.3
  • v0.78.3 — published (this release)

Verification

The same recipe used for the v0.78.2 release-candidate validation, run again on the v0.78.3 commit:

  • bash scripts/check-encoding.sh — clean
  • python -m compileall packages/sdk-python/pulp_engine packages/sdk-python/tests — exit 0
  • pnpm lint / pnpm typecheck / pnpm build — green (the website build is the relevant one this time; sync-docs guardrail no longer trips)
  • pnpm --filter @pulp-engine/editor test — passes with no flag overrides
  • pnpm --filter @pulp-engine/api test:file — passes with no external services

CI on the v0.78.3 commit must run end-to-end; the Release workflow’s CI gate will then unblock on the v0.78.3 tag and exercise the docker / version-check / windows-installer / scan / release jobs. PyPI / npm Trusted Publisher entries remain a one-time registry-side configuration carried over from earlier releases; nothing in v0.78.3 attempts publishes that didn’t previously work.

Known residual

Same set as v0.78.2’s “Known residual” section, restated for completeness:

  • Coverage gate runtime drift on Linux CI. rc2 / 5e8eff6 runs took longer than the prior fe5852e baseline (slow runner, not a code regression). Worth tracking if the trend continues.
  • per-template-rate-limit (or adjacent) test:file flake on Windows local runs. A single transient failure surfaced during the local rc2 verification recipe but did not reproduce on a second run. Environmental (Windows wall-clock variance under singleFork); separate from the test fixed in c786733; logged as a follow-up.
  • Audit blockers C–F deferred to follow-up patches per the internal audit-remediation plan: OpenAPI version + route-security drift (Workstream C), HA Redis/S3 automated checks (Workstream D), complexity hotspot first-carve (Workstream E). v0.78.3’s scope is reproducible-gate + Python SDK + hygiene + the v0.78.2 release-note fix.