Skip to content

Fix the screens the first subscription build walked through - #179

Merged
artyomsv merged 4 commits into
masterfrom
fix/factory-operator-feedback
Sep 27, 2026
Merged

artyomsv merged 4 commits into
masterfrom
fix/factory-operator-feedback

Conversation

@artyomsv

Copy link
Copy Markdown
Owner

Why

The first live subscription build (ticket spire-test #37) worked end to end: it paid with the seat, recorded 69,888 cached input, 4,103 input and 730 output tokens as unmetered, and cost 0. The operator's walk through the screens found seven rough edges. This PR fixes them.

What

  1. Harness keys: Delete. A switched-off key or seat can be deleted. One no run used is removed. One a run used has its secret erased and leaves the screen; the row stays only so the run can still name what paid (V86: api_key nullable, erased_at, label unique among live rows only). A member still switched on is refused with harness_credential_still_on.
  2. Build setup. The form says which fields keep it from saving ("To save, fill in: Base branch, Model."). Save used to stay disabled with no reason given.
  3. Work items. A note says tickets arrive by a scheduled scan (every 30 s by default), so a new ticket can take a minute or two to appear. The repository has no ticket webhook today; the scan is the only intake for GitHub issues.
  4. Approval panel. Shows Pays with, which the approval binds, and captions the two texts: "Specification — the ticket text" and "Plan — the one step the build runs".
  5. Work item page. Reads the item again every 10 s while visible and no panel is open, like Runs.
  6. Verify stop. verify_capability_unavailable now says verification is not built yet and the result is held: no push, no pull request.
  7. Ticket source. Accounts show role and bot handle (public-github · github · Reviewer · @code-spire-mole). Two accounts shared the name public-github, so the reviewer account had been picked as the ticket source without it being visible. That is why the ticket comment came from mole. The setting itself is the operator's to change.

Checks

  • Orchestrator suite passes; the targeted pool, sign-in, seat and resource suites pass.
  • Full UI: 936 tests in 105 files; npm run build passes. One run saw ReviewDetail.archive fail once under load; it passes alone twice and in a full re-run, and this PR does not touch it.
  • 15 production mutants, each caught by the intended test.

What the operator hit on the first live subscription build:

- Harness keys: a switched-off key or seat can now be deleted. One no run
  used is removed; one a run used has its secret erased and leaves the
  screen, keeping only the name the run shows (V86). Switching off alone
  kept the key or the person's sign-in stored for ever.
- Build setup: the form says which fields keep it from saving, instead
  of a Save button that silently does nothing.
- Work items: says that tickets arrive by a scheduled scan, so a new one
  can take a minute or two to appear.
- Approval panel: shows how the build pays, and labels which text is the
  specification and which the one-step plan.
- Work item page: reads the item again every 10 seconds while no panel
  is open, like Runs, so a gate or a finished build shows without a click.
- Verify stop: says verification is not built yet and the result is held,
  with no push and no pull request.
- Ticket source: names the account by role and bot handle. Two accounts
  shared one name, so the reviewer account had been picked unseen.
- A key picked in the last hour is erased rather than deleted: a
  dispatch picks a key and writes its run a moment later, outside one
  transaction, so deleting could fail that run's insert.
- The API-key pick re-checks, after waiting for a row, that the key is
  still on and not erased, so an erased key is never returned and read
  as a corrupt one.
- The work item page numbers its reads and shows only the newest; polls
  never overlap and none is applied after a panel opens.
The first poll supersedes a first load still out, whose answer is then
dropped; the poll now fills an empty page instead of only updating one,
so a slow first load no longer leaves the page loading for ever.
… button

- A first load overtaken by a poll now has its error dropped like its
  answer, so an obsolete error never replaces the item the poll showed.
- ReviewDetail.archive waited the default second for the Archive
  button, and failed under full-suite load; it waits five now.
@artyomsv
artyomsv merged commit 95c2ec3 into master Sep 27, 2026
14 checks passed
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