build(ploeg): consume Ploeg from ploeg-hq/ploeg and stop publishing it from Unfold #206

Merged
ryangr0 merged 5 commits from ryangr0/chore/ploeg-submodule-cutover into development 2026-10-04 00:12:35 +00:00 AGit
Owner

Completes the consumer cutover approved in webgrip/unfold#1 and tracked in webgrip/unfold#2. Ploeg now lives in github.com/ploeg-hq/ploeg. Unfold pins it as a submodule and stops versioning and publishing it. System ADR-0019 records the decision and supersedes ADR-0004.

What changes

1. Ploeg's source leaves this repository. The 783 tracked files under apps/ploeg are replaced by one gitlink (mode 160000). The path stays apps/ploeg, so the integration tests, the unified demo and existing doc links keep working.

2. One pinned dependency

URL https://github.com/ploeg-hq/ploeg.git (.gitmodules)
Pin 87f8dc45a0ea768c6ab95196d8b99d481df10c65 = v0.1.0 (annotated tag object f2567286, verified with git ls-remote)
Provenance Fresh root 88cce444 extracted from Unfold 9c1d53f. development is still 9c1d53f, so no Ploeg change on trunk is lost.
Equivalence Every apps/ploeg path at 9c1d53f exists at v0.1.0. After normalising the module path, 60 files differ: release, chart and image identity, docs, three gofmt import reorders, and the canary fix 87f8dc4.
Upstream CI on the pin run 37139268564 passed; release run 37139612304
  • mise run setup runs git submodule sync/update --init --recursive. Every checkout that verifies, builds docs or runs the demo uses submodules: recursive, and the TechDocs prepare commands initialise the submodule.
  • scripts/ploeg-pin.mjs (in mise run verify) refuses vendored source, another URL, and an uninitialised or modified checkout. With --published it also requires the pin to be on Ploeg's main. That is the new ploeg-pin job on PRs and pushes, and release waits for it. A PR that pins an unmerged upstream change stays red until the change lands upstream.
  • The pin moves only in a commit scoped ploeg (for example build(ploeg): pin ploeg-hq/ploeg v0.1.1), and such a commit never releases Unfold. Renovate ignores apps/ploeg and never moves the pin.

3. Release ownership moves to Ploeg.

  • on_release_published.yml loses the Ploeg chart, image, signing and distribution jobs.
  • publish_release.py / publish_chart.py refuse ploeg before any Git, network or file access. Tests patch every side-effecting function to fail and prove this.
  • The Go module export to github.com/webgrip/ploeg is deleted, including the API call that disabled GitHub Actions there.
  • The Vloer publisher now takes the GitHub release out of draft itself (PUBLISHES_LAST is gone).
  • release-prepare.mjs and apps/.releaserc.cjs touch only Vloer's chart. The preflight drops the ploegd and charts/ploeg registry checks.
  • release-floors.json keeps Ploeg's floor 0.4.0-rc.34 and the withdrawn 1.0.0-rc.1, and marks Ploeg retired: the last Unfold-published version is 0.4.0-rc.35. Both loaders refuse any train that versions a retired component. The unfold train is ["vloer"].

4. Verification follows the boundary.

  • mise run verify runs Ploeg's own scripts/verify.sh at the pin (gofmt, vet, build, go test ./... with PostgreSQL, licence/brand/release-policy scripts, OpenSpec, Helm lint/template/goldens).
  • It also compiles the unified demo helper against the pin and keeps the managed qualification.
  • The verify cache keys the Ploeg gates on the pinned commit, so a PR that does not move the pin skips them.
  • CI no longer builds the ploegd image context.

5. Docs.

  • Unfold's site still renders Ploeg's pinned pages and links Ploeg source files on GitHub at the pinned commit (147 links checked, samples return HTTP 200).
  • Unfold no longer regenerates or validates Ploeg's configuration reference, domain pages or ledger; scripts/docs-configuration.py is deleted.
  • Fix in generate-domain.py with a regression test: Ploeg's standalone model cites Unfold ADR-0002 by URL, which the combined glossary used to mangle into ../../apps/ploeg/docs/domain/https:/….
  • ADR-0019 (accepted under #1/#2) supersedes ADR-0004. ADR-0001 and ADR-0018 get dated notes; ADR-0018's contract-version and bundle proposals stay proposed.
  • README, AGENTS.md, NOTICE, CI, artifacts, docs-publishing, journeys, local demo, managed execution, migration and the team-silver skill are updated.

Commits

  1. build(ploeg): consume Ploeg from ploeg-hq/ploeg as a submodule pinned at v0.1.0
  2. ci(release): stop versioning and publishing Ploeg from Unfold
  3. docs: record that Unfold pins Ploeg and releases only Vloer

Each intermediate commit passes docs-check, the Python release suite and release-check on its own.

Evidence (Unfold 05aa8f18 with Ploeg 87f8dc45, local, user ryan with non-root PostgreSQL, Go 1.27.1, Node 24.21.0, mise 2026.9.18)

  • mise run setup: passed.
  • mise run verify (CI env: GOFLAGS=-count=1, UNFOLD_VERIFY_CPUS=4, result cache on): all gates passed, 53.5 s wall.
    • Ploeg scripts/verify.sh: 36 packages ok, OpenSpec 17/17.
    • Managed qualification: TestOperatorWorkbenchQualification and …InferenceQualification passed. Exactly 2 capped, scoped ploeg-* keys were minted and both blocked; 0 inference requests, $0.
    • Checks covered: admission budget reservation, block on completion and on cancellation, blocked capability cannot resume, generation-fenced pause/resume, cancellation does not retry, a restart does not execute, and evidence survives restart.
  • mise run docs-check: 513 sources, 3,360 repository links, strict build ok.
  • mise run release-check: 44 passed, 0 failed, 1 opt-in skipped. That one, run separately with UNFOLD_RELEASE_HISTORY=true, passed.
  • Python release suite: 43 tests ok, including the new retired-publisher tests.

On merge

The commits here are build, ci and docs, so they release nothing by themselves. But development already holds unreleased Vloer changes since rc.35 (fix(vloer) ×2 and Renovate's feat(deps)). The release job after this merge will therefore cut unfold-v0.4.0-rc.36: the first Vloer-only release, computed above from the real history. Its notes will also list the ploeg-scoped commits that landed before the extraction; those ship in Ploeg v0.1.0, not in rc.36. The site train may also release (fix(site) since its last tag).

Production is not touched. homelab-cluster still runs the last Unfold-published Ploeg (rc.35 from Harbor), and adopting ghcr.io/ploeg-hq artifacts is a separate change.

Rollback

Revert the merge commit. That restores the vendored tree at 9c1d53f and the joint publisher. A rerun of the old Go export would then fail on purpose once github.com/webgrip/ploeg is archived.

Open-PR migration

PR Scope Disposition
#191 portable chart defaults cross-project Ploeg chart part → ploeg-hq PR; Vloer part → Unfold replacement
#192 record /demo in the site build Unfold-only stays; rebase after this merges
#194 editor sign-in approval Unfold-only stays; rebase after this merges
#195 retry a failed reviewer cross-project ploeg-hq PR, then Unfold replacement with pin bump
#198 name the ACP watchdog cross-project ploeg-hq PR, then Unfold replacement with pin bump
#199 delivery facts from the worker Ploeg + 1 Unfold doc first commit already on development (#188); ploeg-hq PR, then Unfold doc follow-up
#201 unsettled spend cross-project ploeg-hq PR, then Unfold replacement with pin bump
#202 routing refusals cross-project ploeg-hq PR, then Unfold replacement with pin bump
#204 verification provenance cross-project, stacked on #195 stacked ploeg-hq PR, then Unfold replacement

Replacement links are recorded on webgrip/unfold#2 and ploeg-hq/ploeg#45 as they open. No original is closed before its replacement exists and has run its checks.

Not in this PR

  • Production desired state, Ploeg's runtime and Vloer's behaviour.
  • Pre-existing and unrelated: the root mise.lock records uv 0.12.21 while mise.toml pins 0.12.22 since 711a4814; mise rewrites the lock locally.

🤖 Generated with Claude Code

Completes the consumer cutover approved in [webgrip/unfold#1](https://github.com/webgrip/unfold/issues/1) and tracked in [webgrip/unfold#2](https://github.com/webgrip/unfold/issues/2). Ploeg now lives in [github.com/ploeg-hq/ploeg](https://github.com/ploeg-hq/ploeg). Unfold pins it as a submodule and stops versioning and publishing it. System ADR-0019 records the decision and supersedes ADR-0004. ## What changes **1. Ploeg's source leaves this repository.** The 783 tracked files under `apps/ploeg` are replaced by one gitlink (mode `160000`). The path stays `apps/ploeg`, so the integration tests, the unified demo and existing doc links keep working. **2. One pinned dependency** | | | | --- | --- | | URL | `https://github.com/ploeg-hq/ploeg.git` (`.gitmodules`) | | Pin | `87f8dc45a0ea768c6ab95196d8b99d481df10c65` = `v0.1.0` (annotated tag object `f2567286`, verified with `git ls-remote`) | | Provenance | Fresh root `88cce444` extracted from Unfold `9c1d53f`. `development` is still `9c1d53f`, so no Ploeg change on trunk is lost. | | Equivalence | Every `apps/ploeg` path at `9c1d53f` exists at `v0.1.0`. After normalising the module path, 60 files differ: release, chart and image identity, docs, three gofmt import reorders, and the canary fix `87f8dc4`. | | Upstream CI on the pin | [run 37139268564](https://github.com/ploeg-hq/ploeg/actions/runs/37139268564) passed; release [run 37139612304](https://github.com/ploeg-hq/ploeg/actions/runs/37139612304) | - `mise run setup` runs `git submodule sync/update --init --recursive`. Every checkout that verifies, builds docs or runs the demo uses `submodules: recursive`, and the TechDocs prepare commands initialise the submodule. - `scripts/ploeg-pin.mjs` (in `mise run verify`) refuses vendored source, another URL, and an uninitialised or modified checkout. With `--published` it also requires the pin to be on Ploeg's `main`. That is the new **`ploeg-pin`** job on PRs and pushes, and `release` waits for it. A PR that pins an unmerged upstream change stays red until the change lands upstream. - The pin moves only in a commit scoped `ploeg` (for example `build(ploeg): pin ploeg-hq/ploeg v0.1.1`), and such a commit never releases Unfold. Renovate ignores `apps/ploeg` and never moves the pin. **3. Release ownership moves to Ploeg.** - `on_release_published.yml` loses the Ploeg chart, image, signing and distribution jobs. - `publish_release.py` / `publish_chart.py` refuse `ploeg` before any Git, network or file access. Tests patch every side-effecting function to fail and prove this. - The Go module export to `github.com/webgrip/ploeg` is deleted, including the API call that disabled GitHub Actions there. - The Vloer publisher now takes the GitHub release out of draft itself (`PUBLISHES_LAST` is gone). - `release-prepare.mjs` and `apps/.releaserc.cjs` touch only Vloer's chart. The preflight drops the `ploegd` and `charts/ploeg` registry checks. - `release-floors.json` keeps Ploeg's floor `0.4.0-rc.34` and the withdrawn `1.0.0-rc.1`, and marks Ploeg `retired`: the last Unfold-published version is `0.4.0-rc.35`. Both loaders refuse any train that versions a retired component. The `unfold` train is `["vloer"]`. **4. Verification follows the boundary.** - `mise run verify` runs Ploeg's own `scripts/verify.sh` at the pin (gofmt, vet, build, `go test ./...` with PostgreSQL, licence/brand/release-policy scripts, OpenSpec, Helm lint/template/goldens). - It also compiles the unified demo helper against the pin and keeps the managed qualification. - The verify cache keys the Ploeg gates on the pinned commit, so a PR that does not move the pin skips them. - CI no longer builds the `ploegd` image context. **5. Docs.** - Unfold's site still renders Ploeg's pinned pages and links Ploeg source files on GitHub at the pinned commit (147 links checked, samples return HTTP 200). - Unfold no longer regenerates or validates Ploeg's configuration reference, domain pages or ledger; `scripts/docs-configuration.py` is deleted. - Fix in `generate-domain.py` with a regression test: Ploeg's standalone model cites Unfold ADR-0002 by URL, which the combined glossary used to mangle into `../../apps/ploeg/docs/domain/https:/…`. - ADR-0019 (accepted under #1/#2) supersedes ADR-0004. ADR-0001 and ADR-0018 get dated notes; ADR-0018's contract-version and bundle proposals stay proposed. - README, AGENTS.md, NOTICE, CI, artifacts, docs-publishing, journeys, local demo, managed execution, migration and the team-silver skill are updated. ## Commits 1. `build(ploeg): consume Ploeg from ploeg-hq/ploeg as a submodule pinned at v0.1.0` 2. `ci(release): stop versioning and publishing Ploeg from Unfold` 3. `docs: record that Unfold pins Ploeg and releases only Vloer` Each intermediate commit passes `docs-check`, the Python release suite and `release-check` on its own. ## Evidence (Unfold `05aa8f18` with Ploeg `87f8dc45`, local, user `ryan` with non-root PostgreSQL, Go 1.27.1, Node 24.21.0, mise 2026.9.18) - `mise run setup`: passed. - `mise run verify` (CI env: `GOFLAGS=-count=1`, `UNFOLD_VERIFY_CPUS=4`, result cache on): **all gates passed**, 53.5 s wall. - Ploeg `scripts/verify.sh`: 36 packages ok, OpenSpec 17/17. - Managed qualification: `TestOperatorWorkbenchQualification` and `…InferenceQualification` passed. Exactly 2 capped, scoped `ploeg-*` keys were minted and both blocked; 0 inference requests, $0. - Checks covered: admission budget reservation, block on completion and on cancellation, blocked capability cannot resume, generation-fenced pause/resume, cancellation does not retry, a restart does not execute, and evidence survives restart. - `mise run docs-check`: 513 sources, 3,360 repository links, strict build ok. - `mise run release-check`: 44 passed, 0 failed, 1 opt-in skipped. That one, run separately with `UNFOLD_RELEASE_HISTORY=true`, passed. - Python release suite: 43 tests ok, including the new retired-publisher tests. ## On merge The commits here are `build`, `ci` and `docs`, so they release nothing by themselves. But `development` already holds unreleased Vloer changes since rc.35 (`fix(vloer)` ×2 and Renovate's `feat(deps)`). The release job after this merge will therefore cut **`unfold-v0.4.0-rc.36`**: the first Vloer-only release, computed above from the real history. Its notes will also list the `ploeg`-scoped commits that landed before the extraction; those ship in Ploeg `v0.1.0`, not in rc.36. The site train may also release (`fix(site)` since its last tag). Production is not touched. `homelab-cluster` still runs the last Unfold-published Ploeg (rc.35 from Harbor), and adopting `ghcr.io/ploeg-hq` artifacts is a separate change. ## Rollback Revert the merge commit. That restores the vendored tree at `9c1d53f` and the joint publisher. A rerun of the old Go export would then fail on purpose once `github.com/webgrip/ploeg` is archived. ## Open-PR migration | PR | Scope | Disposition | | --- | --- | --- | | #191 portable chart defaults | cross-project | Ploeg chart part → ploeg-hq PR; Vloer part → Unfold replacement | | #192 record /demo in the site build | Unfold-only | stays; rebase after this merges | | #194 editor sign-in approval | Unfold-only | stays; rebase after this merges | | #195 retry a failed reviewer | cross-project | ploeg-hq PR, then Unfold replacement with pin bump | | #198 name the ACP watchdog | cross-project | ploeg-hq PR, then Unfold replacement with pin bump | | #199 delivery facts from the worker | Ploeg + 1 Unfold doc | first commit already on `development` (#188); ploeg-hq PR, then Unfold doc follow-up | | #201 unsettled spend | cross-project | ploeg-hq PR, then Unfold replacement with pin bump | | #202 routing refusals | cross-project | ploeg-hq PR, then Unfold replacement with pin bump | | #204 verification provenance | cross-project, stacked on #195 | stacked ploeg-hq PR, then Unfold replacement | Replacement links are recorded on [webgrip/unfold#2](https://github.com/webgrip/unfold/issues/2) and [ploeg-hq/ploeg#45](https://github.com/ploeg-hq/ploeg/issues/45) as they open. No original is closed before its replacement exists and has run its checks. ## Not in this PR - Production desired state, Ploeg's runtime and Vloer's behaviour. - Pre-existing and unrelated: the root `mise.lock` records uv 0.12.21 while `mise.toml` pins 0.12.22 since `711a4814`; mise rewrites the lock locally. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Replace the vendored apps/ploeg tree with a gitlink to
https://github.com/ploeg-hq/ploeg.git at v0.1.0
(87f8dc45a0ea768c6ab95196d8b99d481df10c65), which was extracted from
this repository at 9c1d53f.

- mise run setup, the verify, docs and demo checkouts and the TechDocs
  prepare commands initialise the submodule.
- scripts/ploeg-pin.mjs refuses vendored source, another repository and
  an uninitialised or modified checkout. The ploeg-pin job also requires
  the pinned commit on Ploeg's main, and the release waits for it.
- verify runs Ploeg's own scripts/verify.sh at the pin and compiles the
  unified demo helper, which now imports github.com/ploeg-hq/ploeg.
- The docs build still renders Ploeg's pinned pages, but no longer
  regenerates or validates Ploeg's configuration reference, domain pages
  or decision ledger, and it links Ploeg's source files on GitHub at the
  pinned commit. The combined glossary keeps a decision that a pinned
  model cites by URL instead of mangling it into a relative path.
- Renovate ignores apps/ploeg, drops the Go overlay and leaves the pin
  to people. CI no longer builds the ploegd image context.

Refs: https://github.com/webgrip/unfold/issues/2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unfold's train now versions Vloer only; github.com/ploeg-hq/ploeg
versions and publishes Ploeg with GitHub Actions.

- on_release_published.yml drops the Ploeg chart, image, signing and
  distribution jobs. The Vloer publisher is the only one, so it takes
  the GitHub release out of draft itself.
- publish_release.py and publish_chart.py refuse ploeg before any Git,
  network or file access. The Go module export to github.com/webgrip/ploeg
  is gone, including the call that disabled GitHub Actions there.
- release-prepare.mjs and apps/.releaserc.cjs touch only Vloer's chart,
  and a commit scoped ploeg never releases Unfold.
- release-floors.json keeps Ploeg's floor and withdrawn 1.0.0-rc.1, marks
  the component retired after 0.4.0-rc.35, and both loaders refuse a
  train that versions a retired component.
- The release preflight no longer checks registry access for ploegd or
  charts/ploeg.

Refs: https://github.com/webgrip/unfold/issues/2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: record that Unfold pins Ploeg and releases only Vloer
Some checks failed
[Workflow] On Pull Request / checks (pull_request) Failing after 37s
[Workflow] On Pull Request / ploeg-pin (pull_request) Failing after 24s
[Workflow] On Pull Request / warnings (pull_request) Successful in 1s
[Workflow] On Pull Request / release-policy (pull_request) Successful in 18s
05aa8f18c0
ADR-0019 records the consumer side of the separation approved in
webgrip/unfold#1: Ploeg lives in github.com/ploeg-hq/ploeg, Unfold pins
it as a submodule, and the unfold-v train versions Vloer only. It
supersedes ADR-0004; ADR-0001 and ADR-0018 get dated notes.

README, AGENTS.md, NOTICE, the team-silver skill and the current pages
now say where Ploeg lives, how the pin moves, what Unfold releases and
where Ploeg's artifacts come from.

Refs: https://github.com/webgrip/unfold/issues/2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ryangr0 force-pushed ryangr0/chore/ploeg-submodule-cutover from 05aa8f18c0
Some checks failed
[Workflow] On Pull Request / checks (pull_request) Failing after 37s
[Workflow] On Pull Request / ploeg-pin (pull_request) Failing after 24s
[Workflow] On Pull Request / warnings (pull_request) Successful in 1s
[Workflow] On Pull Request / release-policy (pull_request) Successful in 18s
to 1bca2ac69b
All checks were successful
[Workflow] On Pull Request / ploeg-pin (pull_request) Successful in 42s
[Workflow] On Pull Request / release-policy (pull_request) Successful in 16s
[Workflow] On Pull Request / checks (pull_request) Successful in 7m8s
[Workflow] On Pull Request / warnings (pull_request) Successful in 0s
2026-10-03 22:26:15 +00:00
Compare
build(docs): treat Ploeg's archived history pages as records
All checks were successful
[Workflow] On Pull Request / ploeg-pin (pull_request) Successful in 24s
[Workflow] On Pull Request / release-policy (pull_request) Successful in 29s
[Workflow] On Pull Request / checks (pull_request) Successful in 2m22s
[Workflow] On Pull Request / warnings (pull_request) Successful in 0s
3870a8b560
Ploeg's main keeps its pre-separation release history in
docs/history/legacy-changelog.md, a record no current page links. Unfold
renders Ploeg's docs from the pinned commit, so any pin past v0.1.0 failed
the docs build with that page as an orphan. ploeg/history now joins
ploeg/backlog as a record path: kept, marked "not current guidance" and
left out of the nav and search.

Refs: https://github.com/webgrip/unfold/issues/2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ryangr0 merged commit fd3099214d into development 2026-10-04 00:12:35 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
webgrip/unfold!206
No description provided.