Skip to content

automations: the conversation can change one in place - #1829

Merged
ZeroPoint95 merged 3 commits into
devfrom
zeropoint95/automation-change-op
Oct 15, 2026
Merged

ZeroPoint95 merged 3 commits into
devfrom
zeropoint95/automation-change-op

Conversation

@ZeroPoint95

@ZeroPoint95 ZeroPoint95 commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Adds a change op to the automation tool, so asking in chat to change an automation changes that automation instead of proposing a duplicate.

Based on dev, after #1831 (squash 966e2a7).

What changed

  • change takes an id and only what changes: title, words, when, say/do, look, worktree, limits
  • It raises the same card as the typed edit: save this change?, 1 Save / 0 Don't save, and next run in place of first run
  • Save goes through Store.Update, so a finished one-time reminder given a new time wakes again
  • Re-sending the same when is not a new schedule. automation.ScheduleChanged decides that for both the card and the save, so the card never promises a run the save doesn't give.
  • A rhythm keeps its stored zone, empty (the machine's) included
  • A card whose automation already has an id is a change. AutomationHead and AutomationOptions decide this for both doors.
  • Belt facts: one that exists is changed, never proposed again
  • Prefix budget: both arms are 22 bytes lighter (52,691 / 44,913); waivers lowered, PERF.md updated
  • Manual: "Change an automation" starts with asking in chat, the old "no verb for it" line is gone, and there are 3 new probes. DESIGN.md is updated too.

How it was checked

Run after rebasing onto dev at 966e2a7:

  1. gofmt -l and go vet on automation, session, tui3 and manual: clean
  2. go test -race ./internal/automation/: ok
  3. go test -run 'Change|Prefix|Automation|Belt|ReSending|Paused|Deleted' ./internal/session/: ok. Prefix is 52,691 fixed and 44,913 lean; dev measures 52,713 and 44,935.
  4. go test -run 'TestAChangeTheModelAsksForDrawsTheEditsCard|Automation|Typed|Edit' ./internal/tui3/: ok
  5. go test ./internal/manual/ ./internal/e2e/: ok
  6. make changelog-check: 7 entries, all well formed
  7. make test-laws: ok

New tests:

  • a finished reminder moved to 5pm is active at the new time, and still only one automation exists
  • re-sending the same when keeps the next run, the anchor and the zone
  • don't save, or a correction, leaves it as it was
  • deleted while the card is up: nothing is changed
  • paused stays paused, and the card promises no run
  • the surface draws the model's change card like the typed edit's

Checklist

  • Change entry: docs/changes/unreleased/1829-automation-change-op.md
  • Manual updated: automations.md, keys.md, questions.md, plus probes in chat_test.go
  • No .github/known-red.txt line (the ledger no longer exists)
  • Only my own paths are staged

🤖 Generated with Claude Code

ZeroPoint95 added a commit that referenced this pull request Oct 14, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ZeroPoint95 added a commit that referenced this pull request Oct 14, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ZeroPoint95 added a commit that referenced this pull request Oct 14, 2026
Review of #1829. A `when` re-sent as it was counted as a new schedule, so
the card worked out a next run from now while Store.Update, which only
reschedules on a different moment, rhythm or zone, kept the old one: a
finished watch's card promised a run it never got, and an hourly one's
promised a slot off its grid.

- automation.ScheduleChanged is now the one reading of "a different
  schedule", and the change op asks it before counting a `when` as new.
- A rhythm keeps its stored zone exactly, empty (the machine's) included,
  so re-sending the same `every` does not give it a zone and move it.
- The refusal names title and words too; a change's card says `next run`.
- DESIGN.md says the conversation's `change` raises `save this change?`.
- Tests: the same `when` re-sent, deleted while the card is up, and a
  paused one staying paused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ZeroPoint95
ZeroPoint95 force-pushed the zeropoint95/automation-change-op branch from 64cbff4 to bc85f95 Compare October 14, 2026 21:32
@ZeroPoint95
ZeroPoint95 marked this pull request as ready for review October 14, 2026 21:36
Base automatically changed from zeropoint95/codeaf-cron-system-7b4f2b to dev October 14, 2026 23:42
ZeroPoint95 and others added 3 commits October 14, 2026 19:42
The `automation` tool had no op that changes an existing automation, so
"move my water reminder to 5pm" could only propose a second one beside
the first, often a finished reminder left standing in /automations.

- `change` takes an id and only the fields that change, lays them over
  the saved automation, and raises the same card the typed edit does:
  `save this change?`, `1 Save` and `0 Don't save`. Save goes through
  Store.Update, which works a new schedule out from now and wakes a
  finished one-time reminder.
- An id on a card is what makes it a change, so AutomationHead and
  AutomationOptions decide it once for both doors; the typed edit now
  reads its head and answers from session.
- The page tells the model one that exists is changed, never proposed
  again. The bytes were paid out of the tool description's repeat of the
  watch fields; both prefix arms are 22 bytes lighter and both waivers
  fall by that (PERF.md).
- The manual's "Change an automation" leads with asking, and the denial
  that the chat had no verb for it is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of #1829. A `when` re-sent as it was counted as a new schedule, so
the card worked out a next run from now while Store.Update, which only
reschedules on a different moment, rhythm or zone, kept the old one: a
finished watch's card promised a run it never got, and an hourly one's
promised a slot off its grid.

- automation.ScheduleChanged is now the one reading of "a different
  schedule", and the change op asks it before counting a `when` as new.
- A rhythm keeps its stored zone exactly, empty (the machine's) included,
  so re-sending the same `every` does not give it a zone and move it.
- The refusal names title and words too; a change's card says `next run`.
- DESIGN.md says the conversation's `change` raises `save this change?`.
- Tests: the same `when` re-sent, deleted while the card is up, and a
  paused one staying paused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ZeroPoint95
ZeroPoint95 force-pushed the zeropoint95/automation-change-op branch from bc85f95 to 20958ce Compare October 14, 2026 23:45
@ZeroPoint95
ZeroPoint95 merged commit da8d601 into dev Oct 15, 2026
8 checks passed
@ZeroPoint95
ZeroPoint95 deleted the zeropoint95/automation-change-op branch October 15, 2026 00:54
ZeroPoint95 added a commit that referenced this pull request Oct 15, 2026
#1829 (automation change) and this branch both shrank the fixed prefix. The
two waiver paragraphs in PERF.md and prefixbudget_test.go are both kept, and
the re-measured prefix — 52,497 full, 44,893 lean, each side's savings adding
exactly — sets the waivers at 4,497 and 13,393.

Co-Authored-By: Claude Opus 5.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