Skip to content

decide & spike: fold postguard-dotnet into postguard (ship pg-ffi and bindings together) #256

Description

@rubenhensen

Body rewritten 2026-09-24. The original body was a one-line "spike and decide". It is preserved verbatim in a comment below. The question was decided on 2026-08-11, and that comment is the authority. This body summarises it and records where execution stands.

Decided: fold postguard-dotnet into postguard

The real reason is not tidiness in build.sh. The cryptify merge (#285) removed version drift by giving everything one lockfile, and that guarantee stops at the pg-ffi release boundary. postguard-dotnet consumes a frozen pg-ffi-v* release artifact through a one-line pin. Two lags stack:

  1. pg-core → pg-ffi. A "0.6" requirement means a pg-core patch release rebuilds nothing.
  2. pg-ffi → .NET. Nothing guards the currency of .github/pg-ffi-version.

The gap has widened since the decision (measured 2026-09-24):

then (08-11) now
pg-core on main 0.6.3 0.6.10
newest pg-ffi tag pg-ffi-v0.1.3 pg-ffi-v0.1.3 (unchanged)
postguard-dotnet's pin pg-ffi-v0.1.2 pg-ffi-v0.1.2 (unchanged)
E4A.PostGuard on nuget.org 0.6.0 0.6.0

The decision, part by part (reasons are in the decision comment):

  • A history-preserving import into pg-dotnet/. The nine closing keywords in its history all target issues that are already closed. Re-run that audit immediately before and after merge (postguard-js#139).
  • Kill the pin. dotnet pack takes its five platform binaries as artifacts from a build-ffi matrix in the same run. Delete .github/pg-ffi-version and PgFfiVersionTests.cs.
  • pg-ffi pins pg-core with =, plus a ci_wiring.rs-style test that goes red when the two disagree. release-plz's release PR going red on a one-sided bump is accepted as the loud failure.
  • One release brain. release-please goes, and E4A.PostGuard's version becomes pg-core's. The cost is accepted: a C#-only fix needs a pg-core release.
  • A second required context for the .NET lane. REQUIRED_CHECK in ci_wiring.rs and scripts/ruleset-drift.sh generalise from a scalar to a set. It is not aggregated behind Wire compat.
  • The trusted-publishing cutover has no window. Add a postguard policy scoped to delivery.yml plus a dedicated environment:, publish once, verify on nuget.org, then delete the old policy. Create the policy close to the cutover, because a new policy is only "temporarily active" for 7 days.
  • Cut a pg-core release deliberately to drive the first publish.

Where execution stands

  1. spike: assert the required-context list itself, not just the workflow wiring (the registry half of #272/#222) #318 merges first. Done 2026-08-11 (ci: assert main's ruleset still requires the gate build.yml produces #333).
  2. Not started. Import into pg-dotnet/, the .NET CI lane, the artifact fan-in, the = pin and its coupling test, release-please removed. On main today there is no pg-dotnet/, workspace members are [pg-core, pg-cli, pg-pkg, pg-ffi, cryptify], pg-ffi/Cargo.toml has pg-core = { version = "0.6" }, and pg-ffi/build.sh still copies into ../../postguard-dotnet.
  3. Not started. Ruleset gains the .NET context; REQUIRED_CHECK and ruleset-drift.sh become sets.
  4. Not started. Trusted-publishing policy, a pg-core release, first publish verified, old policy deleted. decide & spike: fold postguard-dotnet into postguard (ship pg-ffi and bindings together) #256 closes here.
  5. Retiring postguard-dotnet is task: retire postguard-dotnet — release automation off, banner, transfer #39, archive #342, which is blocked by this ticket.

Steps 2 and 4 need workflow YAML, which dobby-coder cannot push. The work is best split into child tickets per step, each with a dobby-carryable code half and a maintainer-applied YAML half.

Assumption to confirm before step 4

The decision gated step 4 on confirming how consumers pull E4A.PostGuard. One external consumer is now known: Worth-NL/NotifyNL-OMC pins E4A.PostGuard 0.3.0 exactly. That supports the exact-pin premise. It also means a real install base exists, and the package id and nuget.org channel have to survive the move unchanged.

Part of #247 (workstream F).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestwayfinder:247Member of the fleet-audit remediation map (#247)wayfinder:taskWayfinder ticket: manual work unblocking a decision, or execution under this map

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions