Repository navigation
app: whose frame it is, and bubbles that say who - #475
Merged
Merged
Conversation
The first half of plans/SHARED_HISTORY_PLAN.md's step 2 (as amended in fizzyedit/plans#21): who made each step of a document's history, kept by the host on the channel owners already report through (Host.recordStep, fizzy#456). - sdk.Author: the person, an agent, a tape, or nobody known; identity is kind, plugin and session. - Host.act / endAct / acted / actAgain / author: who is acting. Innermost wins; an outermost act starts a run; work put off acts again as its stored author and run. - Host.setInputAuthor: the frame's input author, for the app to set where input is consumed. - Host.recordStep keeps who made every step not the person's, per document, by step id, and the document's top; the recorder still hears a step only while recording. Working alone, nothing is kept. Host.stepAuthor, topStep, mayMerge; forgetDocumentAuthors when a document closes. - Step.top: the entry on top after a step, so Undo can name whose step it takes back. The fingerprint moves. Nothing calls act yet, and owners report steps only while recording until the plan's step 3, so nothing changes for a person yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The app half of plans/SHARED_HISTORY_PLAN.md's step 2, on the host's authors (the PR below):
- The frame's input author: Editor.tick sets it around where input is consumed (the layout's
draw, keybinds, overlays, the palette) and clears it around plugins' frame hooks: the person's,
or a tape's while one drives (Demo.author), the drivers having already stopped for real input.
- A tape's commands act as the tape (Demo's stage command), a live tape as whoever it plays for.
- automation.Api.playAs (service version 6): play a live tape for an author, so an agent's
pointer tape is the agent's. play alone leaves the tape its own author.
- An agent's edit says whose in the activity bubble ("Claude · Draw"). The person's, and a demo's
narrating itself, stay plain.
- The whole-editor test asserts the tour adds no unattributed step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
Author
|
Gates on this head (macOS): |
foxnne
marked this pull request as ready for review
October 16, 2026 21:53
#474 landed squashed; this branch carried its original commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 17, 2026
Merged
foxnne
added a commit
that referenced
this pull request
Oct 17, 2026
…g joins (#479) Part of fizzyedit/plans#14: `plans/SHARED_HISTORY_PLAN.md`, step 3 (text's half; pixi's follows in its repo). ## What changes - **Text reports every step** through `Host.recordStep`, not only while recording. The host keeps who made each one (#474); working alone, it keeps nothing. Encoding a step's `effect` still happens only while the document is recorded, so a document nobody records costs one call per step. - **Each step carries `top`:** the last applied entry after it (`History.lastApplied`), for added, joined, undone and redone alike. The host knows the top step and its author without asking for the line, which Undo's "Undo Claude's …" label (step 5) needs. - **One hand's typing never joins another's run.** `History.end` takes `may_join`. The editor's edit hook fills it from `Host.mayMerge` on the step on top. When that step is someone else's, VSCode's grouping rule doesn't get to fold the new keystroke into it: an agent typing doesn't extend the person's step, nor the person an agent's. - **Typing calls `documentEdited`,** as its doc comment always said it did. A person's typing runs no command, so it still raises no activity bubble. ## SDK impact - [x] None. Text is built in, and #474's API is used as is. ## Verified - [x] macOS: - **New unit test:** an edit with `may_join = false` starts a step of its own where VSCode's rule would have joined it. The existing history tests pass `true` and behave as before. - **`zig build test`:** 573/574 (1 skipped). `check-tests-reached` passes. - **`test-integration`:** 53/53 steps, 556/556 tests. The whole-editor test's check from #475, that the tour adds no unattributed step, now covers real steps: the tour's typing and commands are each attributed to the tape. Two warnings print, and both are on unmodified `main` too (a demo replay mismatch and a float position). - `check-fmt`, `check-web`, `test-sdk-version`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
foxnne
added a commit
that referenced
this pull request
Oct 17, 2026
## What changes `sdk_version` goes from 0.2.28 to 0.2.29. Merging this tags `sdk-v0.2.29` and publishes its tarball. **Why now:** authors (#474, #475) need a release before plugins can use them: - the agent acts as its connection around each command, and plays its pointer tapes with `playAs`; - chat acts around its writes; - pixi's calls that wait out the person's stroke keep their author (`plans/SHARED_HISTORY_PLAN.md` step 2's plugin PRs). ## SDK impact - [ ] None - [ ] Core-only or additive: reaches plugins at the next SDK release - [ ] Fingerprint moved: recorded in `sdk/src/version.zig`, `sdk_version` untouched, PR labelled `sdk` - [x] SDK release: bumps `sdk_version`, lists the `sdk` PRs since the last `sdk-v*` tag **`sdk` PRs since `sdk-v0.2.28`:** - **#474:** who made each step. - `sdk.Author`; `Host.act` / `endAct` / `acted` / `actAgain` / `author` / `setInputAuthor`. - The host keeps a per-document author map filled in `recordStep`. - `stepAuthor`, `topStep`, `mayMerge`, `forgetDocumentAuthors`, and `Step.top`. - The fingerprint moved. Everything is additive (a defaulted field, new functions). **Reaching plugins, no fingerprint move:** - **#475:** the automation service's `playAs(bytes, author)` (`service_version` 5 → 6). Activity titles name an acting agent ("Claude · Draw"). - **#468:** `core`: `MenuRowOptions.anchor`, a stable name for a menu row's button. ## Verified - [x] macOS: - On this head, `zig build test-sdk-version` passes, and `scripts/pack-sdk.sh` packs `fizzy-sdk-v0.2.29.tar.gz`. - fizzyedit/pixi, fizzyedit/agent and fizzyedit/atlas `main` build against this `sdk/` (`--fork`) with no changes. - [ ] Windows: - [ ] Linux: CI. - [ ] Web: ## Follow-ups - The repin automation opens `sdk: repin to fizzy SDK 0.2.29` PRs in the store plugins whose fingerprint moved. - The agent has no repin automation: its repin is a hand-made PR, carrying the agent's `act` around `agentCall` and `playAs` for its pointer tapes. - Chat's repin carries its `act` around ACP writes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #474 (the SDK half); review that first. Part of fizzyedit/plans#14:
plans/SHARED_HISTORY_PLAN.md, step 2, as amended in fizzyedit/plans#21.What changes
The app now says who is acting, using #474's
Host.actandsetInputAuthor.Editor.ticksets it where input is consumed: around the active document's tick, native menu actions, the layout's draw and floats, then around plugin keybinds, the keymap, overlays and the palette.endFrame. Plugins'beginFrameand event delivery run with none, as the plan says: they act for themselves, or are nobody's.Demo.author). The demo player and the live driver stop for a real press or key before the frame's input is consumed, so a frame a person takes over is theirs.actas the tape (Demo's stagecommand), and a live tape's as whoever it plays for. A demo's author is its title; a live tape played by nobody in particular is "a tape".automation.Api.playAs(bytes, author)(service version 6): a live tape played for an author. An agent's pointer tape (fizzy_act) is then the agent's. Plainplayleaves the tape its own author. The service tells the app through a newOnAuthorhook, beside itsOther.SDK impact
service_version5 → 6), so a plugin built for version 5 gets null fromgetServiceTypedon this host and degrades. The agent plugin is the one consumer: it moves toplayAswith its repin.Verified
zig build,zig build test,check-fmt.test-integration,check-webandtest-sdk-versionresults are in a comment below once they finish.playAs. The agent plugin callsplayAsafter the SDK release; that PR will show it end to end.🤖 Generated with Claude Code