feat(vloer): show tasks Ploeg could not start under Needs you #212

Merged
ryangr0 merged 1 commit from ryangr0/replace/202-route-refusals into development 2026-10-04 08:39:59 +00:00 AGit
Owner

Replaces #202 (feat: list and show tracker tasks that routing refused) after the Ploeg separation in #206. Its Ploeg part is ploeg-hq/ploeg#51; this PR moves Unfold's pin to that branch and carries the rest.

Commits

  • e10ee1f2 build(ploeg): pin ploeg-hq/ploeg#51 to list routing refusals
  • ff6d4c7e feat(vloer): show tasks Ploeg could not start under Needs you (from 3958fc77c7)
  • 27582537 chore(site): re-record the demo replay with the Could not start group (from ee5446c894)

Merge order

  1. #206, the cutover. Until it merges, this PR's diff also shows the cutover commits it is stacked on.
  2. ploeg-hq/ploeg#51.
  3. Move the pin in this PR's build(ploeg) commit to the merge commit on Ploeg's main, then merge. Until then the ploeg-pin check is red by design: it requires the pinned commit on Ploeg's main.

Verification (local, at 27582537 with Ploeg 619ddcb6)

  • mise run verify with the result cache, as a pull request runs it: all gates passed. That includes the Ploeg group (its own scripts/verify.sh at the pin), Vloer, the extension, the demo replay check, integration (managed qualification) and docs.
  • Ploeg side: GitHub CI passed on ploeg-hq/ploeg#51.

What happened to each commit of #202

Commit Subject Here
3936664d42 feat(ploeg): list recent routing refusals on the operator API Ploeg part ported to ploeg-hq/ploeg#51
3958fc77c7 feat(vloer): show tasks Ploeg could not start under Needs you Ploeg part ported to ploeg-hq/ploeg#51; Unfold part re-applied as ff6d4c7e
ee5446c894 chore(site): re-record the demo replay with the Could not start group re-recorded on the new base with mise run demo-record as 27582537

The original had no reviews or comments. Its checks were red because development itself failed at mise install --locked; #206 fixes that lock. No earlier check result carries over.

Original description of #202

VIK-1632 Ploeg: list recent routing refusals on the operator API

https://vikunja.webgrip.dev/tasks/1632

  • New GET /api/v1/operator/route-refusals returns {schemaVersion, generatedAt, windowDays: 14, refusals}. It lists the newest refusal of each task, newest first, at most 50, within the consumer's teams. A task drops out when a later work_item.queued or work_item.refreshed audit exists for it, or when its refusal is older than 14 days. Any query parameter answers 400 invalid_request.
  • target.Refusal now carries a stable Code (label_missing, label_not_allowed, label_unregistered, multiple_labels, labels_unread, no_board_rule, target_not_ready) and Allowed, the repo/ labels of the matched board rule. Both are stored in the audit detail. Rows written before this change answer unclassified with allowedLabels: []. The tracker comment is unchanged, and a test pins its exact text.
  • Migration 0036_route_refusals.sql adds a partial index on audit_log (at) for this action.
  • Schema operator-api.v1 gains routeRefusalsResponse. The contracts README and route-a-multi-repo-board.md name the endpoint.

VIK-1633 Vloer: show tasks Ploeg could not start under Needs you

https://vikunja.webgrip.dev/tasks/1633

  • PloegClient.now reads route-refusals with added: true. A 404 from an older Ploeg becomes an empty list with no notice, and any other failure becomes errors.refused. Rows are filtered to the user's teams. The board name and the task link come from the task connection whose provider and project match (sourceTaskUrl). Without a match the link falls back to ploeg.trackerUrl, and without that there is no button.
  • Now shows a Could not start group first inside Needs you. Each code has its own plain sentence; unclassified shows Ploeg's reason. The primary button reads Open in Vikunja. A failed read shows an inline notice with Try again.
  • The demo has one illustrative refusal and calls nothing. The site demo replay is re-recorded in a separate chore(site) commit (ADR-0015).

Tests

  • Ploeg: new tests in pkg/target/refusal_test.go, pkg/store/route_refusals_test.go and pkg/httpapi/route_refusals_test.go. go test -count=1 ./... passed and go vet ./... reported nothing.
  • Vloer: new cases in test/now-view.test.mjs and test/ploeg.test.ts. npm test passed all 707 tests, and npm run check passed.
  • mise run verify passed every gate: vloer, demo-replay, vloer-extension, ploeg, brand, site, site-demo, helm, release, integration and docs.

Checks left to CI

None. Every gate ran locally.

🤖 Generated with Claude Code

🤖 Generated with Claude Code

Replaces #202 (feat: list and show tracker tasks that routing refused) after the Ploeg separation in #206. Its Ploeg part is [ploeg-hq/ploeg#51](https://github.com/ploeg-hq/ploeg/pull/51); this PR moves Unfold's pin to that branch and carries the rest. ## Commits - `e10ee1f2` build(ploeg): pin ploeg-hq/ploeg#51 to list routing refusals - `ff6d4c7e` feat(vloer): show tasks Ploeg could not start under Needs you (from `3958fc77c7`) - `27582537` chore(site): re-record the demo replay with the Could not start group (from `ee5446c894`) ## Merge order 1. #206, the cutover. Until it merges, this PR's diff also shows the cutover commits it is stacked on. 2. [ploeg-hq/ploeg#51](https://github.com/ploeg-hq/ploeg/pull/51). 3. Move the pin in this PR's `build(ploeg)` commit to the merge commit on Ploeg's `main`, then merge. Until then the `ploeg-pin` check is red by design: it requires the pinned commit on Ploeg's `main`. ## Verification (local, at `27582537` with Ploeg `619ddcb6`) - `mise run verify` with the result cache, as a pull request runs it: all gates passed. That includes the Ploeg group (its own `scripts/verify.sh` at the pin), Vloer, the extension, the demo replay check, integration (managed qualification) and docs. - Ploeg side: GitHub CI passed on [ploeg-hq/ploeg#51](https://github.com/ploeg-hq/ploeg/pull/51). ## What happened to each commit of #202 | Commit | Subject | Here | | --- | --- | --- | | `3936664d42` | feat(ploeg): list recent routing refusals on the operator API | Ploeg part ported to ploeg-hq/ploeg#51 | | `3958fc77c7` | feat(vloer): show tasks Ploeg could not start under Needs you | Ploeg part ported to ploeg-hq/ploeg#51; Unfold part re-applied as `ff6d4c7e` | | `ee5446c894` | chore(site): re-record the demo replay with the Could not start group | re-recorded on the new base with `mise run demo-record` as `27582537` | The original had no reviews or comments. Its checks were red because `development` itself failed at `mise install --locked`; #206 fixes that lock. No earlier check result carries over. <details><summary>Original description of #202</summary> ## VIK-1632 Ploeg: list recent routing refusals on the operator API https://vikunja.webgrip.dev/tasks/1632 - New `GET /api/v1/operator/route-refusals` returns `{schemaVersion, generatedAt, windowDays: 14, refusals}`. It lists the newest refusal of each task, newest first, at most 50, within the consumer's teams. A task drops out when a later `work_item.queued` or `work_item.refreshed` audit exists for it, or when its refusal is older than 14 days. Any query parameter answers 400 `invalid_request`. - `target.Refusal` now carries a stable `Code` (label_missing, label_not_allowed, label_unregistered, multiple_labels, labels_unread, no_board_rule, target_not_ready) and `Allowed`, the repo/ labels of the matched board rule. Both are stored in the audit detail. Rows written before this change answer `unclassified` with `allowedLabels: []`. The tracker comment is unchanged, and a test pins its exact text. - Migration **0036_route_refusals.sql** adds a partial index on `audit_log (at)` for this action. - Schema `operator-api.v1` gains `routeRefusalsResponse`. The contracts README and `route-a-multi-repo-board.md` name the endpoint. ## VIK-1633 Vloer: show tasks Ploeg could not start under Needs you https://vikunja.webgrip.dev/tasks/1633 - `PloegClient.now` reads route-refusals with `added: true`. A 404 from an older Ploeg becomes an empty list with no notice, and any other failure becomes `errors.refused`. Rows are filtered to the user's teams. The board name and the task link come from the task connection whose provider and project match (`sourceTaskUrl`). Without a match the link falls back to `ploeg.trackerUrl`, and without that there is no button. - Now shows a **Could not start** group first inside Needs you. Each code has its own plain sentence; `unclassified` shows Ploeg's reason. The primary button reads **Open in Vikunja**. A failed read shows an inline notice with Try again. - The demo has one illustrative refusal and calls nothing. The site demo replay is re-recorded in a separate `chore(site)` commit (ADR-0015). ## Tests - Ploeg: new tests in `pkg/target/refusal_test.go`, `pkg/store/route_refusals_test.go` and `pkg/httpapi/route_refusals_test.go`. `go test -count=1 ./...` passed and `go vet ./...` reported nothing. - Vloer: new cases in `test/now-view.test.mjs` and `test/ploeg.test.ts`. `npm test` passed all 707 tests, and `npm run check` passed. - `mise run verify` passed every gate: vloer, demo-replay, vloer-extension, ploeg, brand, site, site-demo, helm, release, integration and docs. ## Checks left to CI None. Every gate ran locally. 🤖 Generated with [Claude Code](https://claude.com/claude-code) </details> 🤖 Generated with [Claude Code](https://claude.com/claude-code)
711a4814 moved uv to 0.12.22 in mise.toml but left the lockfile at
0.12.21. mise-action runs `mise install --locked`, which refuses a
version the lockfile does not hold, so the checks job has failed before
any gate since that commit, on development and on every pull request.

`mise lock uv` (mise 2026.9.18) records 0.12.22 for all seven platforms.
The openspec lock files it deletes under .mise/locks are kept.

Refs: https://github.com/webgrip/unfold/issues/2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
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
1bca2ac69b
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>
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>
Moves apps/ploeg to 619ddcb6, the head of ploeg-hq/ploeg#51, which is
the Ploeg side of Unfold PR 202. Once that pull request merges, move
the pin to its merge commit on Ploeg's main. Until then the ploeg-pin check
stays red, as it should.

Refs: https://github.com/ploeg-hq/ploeg/pull/51
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Now reads Ploeg's route-refusals list and shows a "Could not start"
group first inside Needs you. Each row names the tracker task, says in
plain words why routing refused it, with the repo/ labels its board
allows, and opens the task in its tracker. Vloer builds the link from
the task connection whose provider and project match, else the
configured tracker root, else offers no button.

A failed read shows an inline notice with Try again and leaves the other
sections alone; an older Ploeg that answers 404 shows nothing. The demo
shows one illustrative refusal and calls nothing.

VIK-1633

Replaces-commit: 3958fc77c7 (#202)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
chore(site): re-record the demo replay with the Could not start group
Some checks failed
[Workflow] On Pull Request / checks (pull_request) Failing after 9m6s
[Workflow] On Pull Request / ploeg-pin (pull_request) Failing after 2m6s
[Workflow] On Pull Request / release-policy (pull_request) Successful in 48s
[Workflow] On Pull Request / warnings (pull_request) Successful in 0s
275825379e
VIK-1633

Re-recorded with `mise run demo-record` on top of the Ploeg separation
(webgrip/unfold#206) instead of merging the recorded JSON.

Replaces-commit: ee5446c894 (#202)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ryangr0 force-pushed ryangr0/replace/202-route-refusals from 275825379e
Some checks failed
[Workflow] On Pull Request / checks (pull_request) Failing after 9m6s
[Workflow] On Pull Request / ploeg-pin (pull_request) Failing after 2m6s
[Workflow] On Pull Request / release-policy (pull_request) Successful in 48s
[Workflow] On Pull Request / warnings (pull_request) Successful in 0s
to 6210cca376
Some checks failed
[Workflow] On Pull Request / checks (pull_request) Has been cancelled
[Workflow] On Pull Request / warnings (pull_request) Has been cancelled
[Workflow] On Pull Request / ploeg-pin (pull_request) Has been cancelled
[Workflow] On Pull Request / release-policy (pull_request) Has been cancelled
2026-10-04 07:08:58 +00:00
Compare
ryangr0 force-pushed ryangr0/replace/202-route-refusals from 6210cca376
Some checks failed
[Workflow] On Pull Request / checks (pull_request) Has been cancelled
[Workflow] On Pull Request / warnings (pull_request) Has been cancelled
[Workflow] On Pull Request / ploeg-pin (pull_request) Has been cancelled
[Workflow] On Pull Request / release-policy (pull_request) Has been cancelled
to 501a018f54
All checks were successful
[Workflow] On Pull Request / ploeg-pin (pull_request) Successful in 38s
[Workflow] On Pull Request / release-policy (pull_request) Successful in 41s
[Workflow] On Pull Request / checks (pull_request) Successful in 6m47s
[Workflow] On Pull Request / warnings (pull_request) Successful in 1s
2026-10-04 07:12:39 +00:00
Compare
ryangr0 merged commit 90d9fdeca7 into development 2026-10-04 08:39:59 +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!212
No description provided.