Skip to content

Report real counts from hookdeck_queue_status - #11

Merged
garethx merged 1 commit into
fix/dashboard-copyfrom
fix/queue-status-counts
Aug 12, 2026
Merged

Report real counts from hookdeck_queue_status#11
garethx merged 1 commit into
fix/dashboard-copyfrom
fix/queue-status-counts

Conversation

@garethx

@garethx garethx commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Found by actually watching the agent answer with this tool while setting up a demo for the announcement post. Asked what needed attention in a project with four open issues, it said:

⚠️ Attention needed:

  • Open issues: 1 page of open issues detected

You have 1 open issue that may need your attention. This could be a connection that's paused, a service experiencing problems, or another configuration issue.

The tool listed events and issues with limit=1 and returned the length of each page:

failed = await api.list_events(status="FAILED", limit=1)
issues  = await api.list_issues(status="OPENED", limit=1)
return json.dumps({
    "failed_events_page_count": len(_models(failed)),   # 0 or 1. Always.
    "open_issues_page_count":   len(_models(issues)),   # 0 or 1. Always.
})

The field names were honest and the numbers were useless. The agent's primary status tool could not report how much of anything there was, so the model filled the gap by speculating — which is the worst failure mode for a tool whose job is telling it what is true.

Issues have a dedicated count endpoint (GET /issues/count), so those are now counted exactly. Events do not — I checked, /events/count 404s — so failures are counted over a page of 100, with failed_events_is_at_least marking a full page. A floor the model can report as a floor beats a ceiling it will report as a total.

Same question now answers "Open issues: 4".

Four tests cover it, including that the old page-count fields are gone rather than renamed alongside.


Stacked on #10 (base is fix/dashboard-copy), because the demo that surfaced this needs both in the working tree. If #10 merges first, retarget this to main before merging — last time a stacked PR merged into its base branch instead of main and the work sat stranded until we noticed.

Ships in the wheel, so patch release when convenient.

Found by watching the agent answer with it. Asked what needed attention in a
project with four open issues, it said "1 page of open issues detected" and
then guessed at what that might mean.

The tool listed events and issues with `limit=1` and returned the length of
each page, so `failed_events_page_count` and `open_issues_page_count` could
only ever be 0 or 1. The names were honest and the numbers were useless: the
agent's primary status tool could not report how much of anything there was.

Issues have a dedicated count endpoint, so open issues are now counted exactly.
Events do not, so failures are counted over a page of 100 with
`failed_events_is_at_least` saying when that page was full — a floor the model
can report as a floor, rather than a ceiling it will report as a total.

Same question now answers "Open issues: 4".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@garethx
garethx merged commit 61b74b4 into fix/dashboard-copy Aug 12, 2026
7 checks passed
garethx added a commit that referenced this pull request Aug 12, 2026
…#14)

* Report real counts from hookdeck_queue_status

Found by watching the agent answer with it. Asked what needed attention in a
project with four open issues, it said "1 page of open issues detected" and
then guessed at what that might mean.

The tool listed events and issues with `limit=1` and returned the length of
each page, so `failed_events_page_count` and `open_issues_page_count` could
only ever be 0 or 1. The names were honest and the numbers were useless: the
agent's primary status tool could not report how much of anything there was.

Issues have a dedicated count endpoint, so open issues are now counted exactly.
Events do not, so failures are counted over a page of 100 with
`failed_events_is_at_least` saying when that page was full — a floor the model
can report as a floor, rather than a ceiling it will report as a total.

Same question now answers "Open issues: 4".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Test the dashboard bundle, with no toolchain to maintain

Closes #9.

`dist/index.js` ships in the wheel and had no tests of any kind. It was also
invisible in the 86% figure, which is Python only — so the number read better
than the coverage was.

Takes the issue's preferred option. The bundle gets React, its hooks, its
components and its fetch from the injected SDK, so faking that SDK and running
the file under `node:vm` exercises the shipped bytes with no package.json, no
lockfile and no second ecosystem. `createElement` returns plain objects rather
than rendering: every question here is about the tree and the requests, and
none of them need a DOM. Node's own test runner runs it, so CI adds a job and
nothing else.

15 tests, each one mutation-checked. Inverting the pause/resume expression,
inverting only its label, dropping `disabled: busy`, removing the SDK guard,
changing the retry endpoint and typo'ing the registered name all now fail.

Two of them failed to catch their mutation on the first pass, and both were
the test's fault rather than the code's:

* the SDK-guard test could not express "this host has no SDK", because the
  harness always built a complete one and merged the caller's over it. It was
  asserting that a valid host loads.
* the busy-on-failure test asserted no button was left disabled, and passed
  because a failed action swaps the whole page for the error card — which has
  no disabled buttons at all. It would have passed against anything.

The second is worth recording: the issue expected `setBusy(false)` in `act()`'s
catch to be what stops the panel wedging. It is not. The error card replaces
the page and its Retry has no `disabled` binding, so the way back is open
whatever `busy` holds. The test now asserts the recovery that actually exists.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant