Preserve typed PR pagination while fixing pull_request null classification #991

Closed
opened 2026-07-10 09:30:09 +00:00 by coilyco-ops · 5 comments
Member

PR coilyco-flight-deck/ward#989 fixes the pull_request: null classifier, but the first attempt introduced a separate PR-listing regression.

Review finding from #989:

  • listOpenPullRequests now calls a generic open issue feed with state=open&limit=N, then filters pull_request != nil client-side.
  • Forgejo applies limit before ward filters, so a repo whose first N open rows are normal issues can return zero PRs even when open PRs exist later.
  • The old type=pulls query applied the limit to PR rows directly.

Expected fix:

  • Keep the non-null pull_request classifier for mixed feeds and tests.
  • Preserve kind-scoped pagination for listOpenIssues and listOpenPullRequests, or fetch enough pages before filtering so each helper returns its requested kind reliably.
  • Add regression coverage where the generic first page is filled with normal issues before a later PR, proving the PR list still finds the PR or proving the helper keeps the typed PR query.

This is filed separately because ward#985 is currently reserved and the running worker will not re-read review comments.

PR `coilyco-flight-deck/ward#989` fixes the `pull_request: null` classifier, but the first attempt introduced a separate PR-listing regression. Review finding from `#989`: * `listOpenPullRequests` now calls a generic open issue feed with `state=open&limit=N`, then filters `pull_request != nil` client-side. * Forgejo applies `limit` before ward filters, so a repo whose first N open rows are normal issues can return zero PRs even when open PRs exist later. * The old `type=pulls` query applied the limit to PR rows directly. Expected fix: * Keep the non-null `pull_request` classifier for mixed feeds and tests. * Preserve kind-scoped pagination for `listOpenIssues` and `listOpenPullRequests`, or fetch enough pages before filtering so each helper returns its requested kind reliably. * Add regression coverage where the generic first page is filled with normal issues before a later PR, proving the PR list still finds the PR or proving the helper keeps the typed PR query. This is filed separately because `ward#985` is currently reserved and the running worker will not re-read review comments.
Author
Member

WARD-DISPATCH: deferred ⏸

deferred details

This forwarded dispatch was deferred after the issue was already reserved.

Attempted harness: codex
Attempted run: ward agent engineer coilyco-flight-deck/ward#991 --harness codex --details Fix ward#991. PR #989 fixed pull_request:null but regressed listOpenPullRequests by fetching a generic limited issue feed and filtering client-side, so PRs can disappear when normal issues fill the first page. Preserve typed PR pagination or fetch enough pages before filtering. Add a regression test where normal issues precede a PR beyond the first generic limit.
Container: engineer-codex-ward-991
Container created: no running engineer was observed.
Host log: /Users/kai/.ward/agent-logs/dispatch/20260710T093017Z-director-codex-zv99-coilyco-flight-deck-ward-991.log
Capacity: ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run ward agent reap for stale engineers

Retry: the issue stays queued and the director will try again when a slot opens.

— Codex, via ward agent

<!-- ward-agent-reservation-released --> <!-- ward-needs-redispatch --> WARD-DISPATCH: deferred ⏸ <details><summary>deferred details</summary> This forwarded dispatch was deferred after the issue was already reserved. Attempted harness: `codex` Attempted run: `ward agent engineer coilyco-flight-deck/ward#991 --harness codex --details Fix ward#991. PR #989 fixed pull_request:null but regressed listOpenPullRequests by fetching a generic limited issue feed and filtering client-side, so PRs can disappear when normal issues fill the first page. Preserve typed PR pagination or fetch enough pages before filtering. Add a regression test where normal issues precede a PR beyond the first generic limit.` Container: `engineer-codex-ward-991` Container created: no running engineer was observed. Host log: `/Users/kai/.ward/agent-logs/dispatch/20260710T093017Z-director-codex-zv99-coilyco-flight-deck-ward-991.log` Capacity: `ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run `ward agent reap` for stale engineers` Retry: the issue stays queued and the director will try again when a slot opens. </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-DISPATCH: deferred ⏸

deferred details

This forwarded dispatch was deferred after the issue was already reserved.

Attempted harness: codex
Attempted run: ward agent engineer coilyco-flight-deck/ward#991 --harness codex --details Fix ward#991. PR #989 fixed pull_request:null but regressed listOpenPullRequests by fetching a generic limited issue feed and filtering client-side, so PRs can disappear when normal issues fill the first page. Restore typed PR pagination while preserving null pull_request issue classification, add regression coverage, and close ward#991 when landed.
Container: engineer-codex-ward-991
Container created: no running engineer was observed.
Host log: /Users/kai/.ward/agent-logs/dispatch/20260710T094019Z-director-codex-zv99-coilyco-flight-deck-ward-991.log
Capacity: ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run ward agent reap for stale engineers

Retry: the issue stays queued and the director will try again when a slot opens.

— Codex, via ward agent

<!-- ward-agent-reservation-released --> <!-- ward-needs-redispatch --> WARD-DISPATCH: deferred ⏸ <details><summary>deferred details</summary> This forwarded dispatch was deferred after the issue was already reserved. Attempted harness: `codex` Attempted run: `ward agent engineer coilyco-flight-deck/ward#991 --harness codex --details Fix ward#991. PR #989 fixed pull_request:null but regressed listOpenPullRequests by fetching a generic limited issue feed and filtering client-side, so PRs can disappear when normal issues fill the first page. Restore typed PR pagination while preserving null pull_request issue classification, add regression coverage, and close ward#991 when landed.` Container: `engineer-codex-ward-991` Container created: no running engineer was observed. Host log: `/Users/kai/.ward/agent-logs/dispatch/20260710T094019Z-director-codex-zv99-coilyco-flight-deck-ward-991.log` Capacity: `ward agent engineer --harness codex: global engineer limit is reached: 12 running (limit 12); wait for a run to finish or run `ward agent reap` for stale engineers` Retry: the issue stays queued and the director will try again when a slot opens. </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-codex-ward-991 on host kais-macbook-pro-2.local.

Reserved by ward agent --harness codex (reserved 2026-07-10T17:12:41Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL). --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#991 · branch issue-991 · harness codex · workflow pull-requests-and-merge
  • Run: engineer-codex-ward-991 · ward v0.584.0 · dispatched 2026-07-10T17:12:41Z
  • Comment thread: 2 included in the pre-flight read, 0 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-codex-ward-991` on host `kais-macbook-pro-2.local`. Reserved by `ward agent --harness codex` (reserved 2026-07-10T17:12:41Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL). `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh**. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#991` · branch `issue-991` · harness `codex` · workflow `pull-requests-and-merge` - **Run:** `engineer-codex-ward-991` · ward `v0.584.0` · dispatched `2026-07-10T17:12:41Z` - **Comment thread:** 2 included in the pre-flight read, 0 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-10T09:30:20Z), @coilyco-ops (2026-07-10T09:40:22Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: merge-ready

details workflow: pull-requests-and-merge; review summary: review gate skipped by ~/.ward/config.yaml default felt: straightforward plumbing fix with one repo-hook cleanup. confidence: high. surprises: the repo-wide hook suite surfaced a pre-existing config-source comment violation, and I folded that hygiene fix into the branch so the commit stayed clean. follow-ups: none.
WARD-OUTCOME: merge-ready <details><summary>details</summary> workflow: pull-requests-and-merge; review summary: review gate skipped by ~/.ward/config.yaml default felt: straightforward plumbing fix with one repo-hook cleanup. confidence: high. surprises: the repo-wide hook suite surfaced a pre-existing config-source comment violation, and I folded that hygiene fix into the branch so the commit stayed clean. follow-ups: none. </details>
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-codex-ward-991 on host kais-macbook-pro-2.local.

Reserved by ward agent --harness codex (reserved 2026-07-10T18:14:06Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL). --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#991 · branch issue-991 · harness codex · workflow pull-requests-and-merge
  • Run: engineer-codex-ward-991 · ward v0.584.0 · dispatched 2026-07-10T18:14:06Z
  • Comment thread: 3 included in the pre-flight read, 1 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-codex-ward-991` on host `kais-macbook-pro-2.local`. Reserved by `ward agent --harness codex` (reserved 2026-07-10T18:14:06Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL). `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh**. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#991` · branch `issue-991` · harness `codex` · workflow `pull-requests-and-merge` - **Run:** `engineer-codex-ward-991` · ward `v0.584.0` · dispatched `2026-07-10T18:14:06Z` - **Comment thread:** 3 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-10T09:30:20Z), @coilyco-ops (2026-07-10T09:40:22Z), @coilyco-ops (2026-07-10T17:20:44Z) - stripped: @coilyco-ops (2026-07-10T17:12:42Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.584.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Sign in to join this conversation.
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
coilyco-flight-deck/ward#991
No description provided.