Skip to content

feat(pstack): autopilot loops catch the operator up with /ketchup - #616

Merged
poteto merged 1 commit into
mainfrom
pstack/autopilot-ketchup
Oct 14, 2026
Merged

poteto merged 1 commit into
mainfrom
pstack/autopilot-ketchup

Conversation

@poteto

@poteto poteto commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Both poteto-mode autopilot playbooks now report to the operator through the ketchup skill.

  • autopilot-full: each hourly tick that changes something for the operator ends with a catch-up written per ketchup. A tick that changes nothing stays quiet. The final reply is also a ketchup catch-up. It covers PR state and verdicts, what merged, countersigns, and open operator gates, and links to each PR and the decision trails.
  • autopilot-stack: the final reply is a ketchup catch-up with links to the stack root and tip, a one-line verdict per link, and anything parked or excluded.

No version bump. One separate bump PR follows once this lands.


Note

Low Risk
Playbook-only wording changes for how autopilot agents report to the operator; no runtime code or security paths.

Overview
Autopilot full and stack playbooks now route operator communication through the ketchup skill instead of ad-hoc reply bullets.

For autopilot-full, each hourly audit tick that changes something for the operator must end with a ketchup-style catch-up; ticks with no operator-visible change stay silent. The standing Reply section is rewritten to require the same ketchup format, still covering PR state/verdicts, merges, countersigns, open gates, and now explicitly including links to PRs and decision trails.

For autopilot-stack, the final Reply is aligned the same way: ketchup catch-up with stack root/tip links, per-link verdicts, and parked/excluded items with reasons.

Reviewed by Cursor Bugbot for commit 5eb48d6. Bugbot is set up for automated code reviews on this repo. Configure here.

@poteto
poteto merged commit 8043881 into main Oct 14, 2026
1 check passed
@poteto
poteto deleted the pstack/autopilot-ketchup branch October 14, 2026 06:39

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

Reviewed by Cursor Bugbot for commit 5eb48d6. Configure here.

6. **Run the root layer.** Anything that loosens a gate, such as a raised budget or an allowlist entry, needs a verifier's proof and then your fresh countersign, because the owner is the one who wants green. Under a grant that covers approvals, that countersign is the approval, and the owner's record of it points at your countersign for a lane to check. A disabled or soft-failed check always comes out, because it stops guarding every case. Never give or bypass an approval the forge enforces, because no countersign covers it.

On the operator's go, arm `/loop 1h` to audit until no delegated work is left, because long runs drift and agents stall silently. Each tick re-reads this playbook from trunk and fixes drift, such as an unreported head or an unrecorded agent, by having its owner record it, because drift is a gap in the record, not a stall. It probes every agent, down to the leaf lanes, and judges each by its side effects, because status text and summaries can hide a stuck child. An agent is stuck when it errors, cannot start turns, or shows nothing new past its stuck-after runtime, and so is an owner that has neither pushed nor written a trail row by the first tick. One waiting on you or the operator is not stuck, so answer it. Replace a stuck agent at once, without waiting for its stop to land.
On the operator's go, arm `/loop 1h` to audit until no delegated work is left, because long runs drift and agents stall silently. Each tick re-reads this playbook from trunk and fixes drift, such as an unreported head or an unrecorded agent, by having its owner record it, because drift is a gap in the record, not a stall. It probes every agent, down to the leaf lanes, and judges each by its side effects, because status text and summaries can hide a stuck child. An agent is stuck when it errors, cannot start turns, or shows nothing new past its stuck-after runtime, and so is an owner that has neither pushed nor written a trail row by the first tick. One waiting on you or the operator is not stuck, so answer it. Replace a stuck agent at once, without waiting for its stop to land. A tick that changed something for the operator ends by catching them up per the **ketchup** skill, and one that changed nothing stays quiet.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tick ketchup fights the plan prompt

Medium Severity · Logic Bug

Hourly ticks now end with a ketchup catch-up, but planned programs still arm /loop 1h with a verbatim prompt that posts only a short delta status and forbids repeating earlier reports. check-plan.mjs still requires the words status message. Agents that re-read the playbook and obey the plan will double-post or drop ketchup.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5eb48d6. Configure here.

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.

2 participants