Skip to content

Turn bursts on and off from a project card, and remove a project with its history kept - #71

Merged
ne0x86 merged 2 commits into
mainfrom
card-actions
Oct 27, 2026
Merged

ne0x86 merged 2 commits into
mainfrom
card-actions

Conversation

@ne0x86

@ne0x86 ne0x86 commented Oct 27, 2026

Copy link
Copy Markdown
Owner

What and why

Two quick actions on a project card that the owner missed during a clean install.

The state chip turns bursts on and off

Turning a project's bursts on or off took four steps: open Settings, tick or untick Active, then Save. Now the state chip at the top of the card ("active · priority ×2", or "inactive") is a button.

  • One click turns bursts on or off, and the page comes back to that card.
  • The form says the state it wants, so a page that is out of date can never flip it the wrong way.
  • Its accessible name says what a press does, such as "Turn off bursts on acme/api (active · priority ×2)".
  • Weight 0. A project with weight 0 stays off whatever its flag says, so turning it on also gives it weight 1.
  • The Active box in Settings still works.

A trash button removes a project from lastcall

  • A trash button sits at the other end of the card's header. It only opens a confirmation, a popover like the "?" bubbles, with no JavaScript.
  • The confirmation says what removing does. Cancel has the focus.
    • lastcall stops working on the project.
    • Its history and what lastcall learned stay, so adding it again picks up where it left off and does not propose again what you rejected.
    • Its settings are forgotten.
    • Nothing changes on GitHub.
    • It goes back to the list of repositories to add.
  • The store keeps the history. Runs, findings, ideas, labelled issues and pull requests are keyed by the repository's name, so only the projects row goes, together with the orders that have not started. One transaction checks for a run and deletes them, and while a run is going on the project, the removal is refused (409).
  • Container and Loki source choices stay, so they come back with the project. The Settings page now shows such a choice as belonging to a project that is gone, and saving the page no longer erases it.
  • The service skips an order whose project was removed while it waited (start_order now says whether it started one).
  • Sync keeps recording what happens to the pull requests of a removed project, but it neither merges nor watches them.
  • The CLI gets lastcall project remove <owner/name>, with the same rules.
  • Old browsers. Without popover support, neither the question nor the trash button shows. Inline, the question would sit in every card one click away from removing it; the CLI does it there.

Docs

The README's quickstart and command list mention both actions. DESIGN.md section 13 describes them and what removal keeps.

How it was verified

  • The checks. uv run ruff check && uv run ruff format --check && uv run mypy && uv run pytest passes: 718 tests pass and 33 are skipped. 27 cases are new:
    • the toggle on and off, with weight 0, CSRF, sign-in, 404 and the accessible names in English and Spanish;
    • the confirmation's markup, and removal with its history kept, its orders cancelled, the project back among the suggestions and added again;
    • the refusal while a run goes, and the service skipping a cancelled order;
    • the Settings page keeping the choices of a removed project;
    • the watch, and the CLI.
  • Screenshots at 320, 390 and 1280 px, in English and Spanish, light and dark:
    • the cards in both states, the open confirmation, and the page after a toggle and after a removal;
    • every page answers 200, and nothing is wider than the screen;
    • on a phone the confirmation is a sheet at the bottom with its title and buttons always in view;
    • with the keyboard, Enter opens it with the focus on Cancel, and Escape closes it.

🤖 Generated with Claude Code

ne0x86 and others added 2 commits October 27, 2026 11:34
…t from its card

The state at the top of a project's card is now a button in a small form
(POST /projects/<owner>/<name>/active): one click turns the project's bursts on
or off, where it took opening Settings, ticking Active and saving. The form says
the state it wants, so a page that is out of date cannot flip the project the
wrong way. The route changes only the flag, except that turning on a project
whose weight is 0 or less gives it weight 1, or its chip would still say off. The
owner returns to the card with no notice. The chip keeps its look, gains hover
and focus states, and is named for what a press does and for what it shows ("Turn
off bursts on acme/api (active, priority x2)"); it has no aria-pressed, because
its name changes with its state. Its "?" says that a click turns bursts on or off.
The Active box in Settings stays.

A trash button at the end of the header opens a popover that asks first: what
removing means, a Cancel button and a danger Remove button in a POST form.
lastcall stops working on the repository; its history and what it learned stay;
its settings are forgotten; nothing changes on GitHub; it goes back to the list of
repositories to add. Without popover support the question shows inline in the
card and the trash button hides. POST /projects/<owner>/<name>/remove refuses
while a run is going on the project and says to remove it when the run ends;
otherwise one transaction deletes its orders that have not started and its row in
projects, and nothing else. Runs, findings, ideas, labelled issues and pull
requests are keyed by the repository's name, so adding it again picks up where it
left off and the judge does not propose again what the owner rejected.
`lastcall project remove <owner/name>` follows the same rules.

What else refers to a project by name:
- The choices of containers and Loki sources stay in the settings and come back
  with the project. The Settings page used to show the choice for a removed
  project as no selection with a hidden "shown" field that still named it, so
  saving the page erased it. It now shows no project for it, says that it was
  chosen for one that is not a project now (logs.shown), and keeps it.
- The service started an order by its id even if the owner had cancelled it in
  the meantime. Store.start_order now says whether it started one, and the
  service skips the others.
- sync goes on following the open pull requests of a removed project, and
  neither merges nor watches them; watch, the ranking, the dashboard and the
  runs of the command line already cope with a project that is not there.

README (quickstart) and DESIGN.md (section 13) describe both actions and what
removal keeps.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…sh button

Inline, the question would sit in every card, one click away from removing the project. Browsers without popover
support remove a project with `lastcall project remove` instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ne0x86
ne0x86 merged commit 9f49225 into main Oct 27, 2026
3 checks passed
@ne0x86 ne0x86 mentioned this pull request Oct 27, 2026
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