Repository navigation
Releases: pssah4/pulse
Releases · pssah4/pulse
Release list
Pulse 0.4.2
Added
pulse doneverifies a published project merge and completes its record through Pulse, with checks bound to the exact result and base (#258).
Changed
- Claude Code and Codex jobs use their native harness permission settings. Pulse migrates its former default templates and identifies obsolete policy placeholders. Native failures preserve required output and offer a recovery action (#255).
- Queue previews no longer reserve unclaimed work. Explicit claims still prevent conflicts between active sessions (#257).
Fixed
- Explicitly named items keep their narrower goal scope when the same text mentions their parent Epic (#226).
- Shared caches reject existing symlinks and non-directory entries before writes while preserving their contents (#224).
- Run reports distinguish published work, failed checks and confirmed integration. Retry and approval waits preserve the current result and its recovery action (#252).
- Native goal usage limits retain the goal and interpretation work, show the reset time and retry when it is due. Explicit native failures and manual pauses keep their own recovery paths (#220).
- Manual goal controls preserve interpretation notes and worktrees while retaining the newer revision (#260).
- Preserved Plans and unfinished work resume through their existing publication and repair paths. Startup and stopped-writer confirmation remain visible (#250, #251, #253).
- Plan scans batch Git tree reads and reuse claim observations (#254).
- Protected push targets follow Git destination precedence and stored upstream mappings (#241).
- Protected pushes account for the working directory selected by native env wrappers, including short options and nested assignments (#263).
- Lever grants bind to the effective origin repository (#200).
Upgrade notes
- Start a new Claude Code or Codex session after updating the plugin. Existing native permission settings remain authoritative.
- Review obsolete custom Pulse policy placeholders reported by the CLI and use the harness's own permission configuration.
Pulse 0.4.1
Fixed
- A handoff that reaches a
pulse gojob while it publishes no longer leaves its stop request open for good: the fenced job acknowledges its stop before it ends, and the next run in the same clone acknowledges the stop of an earlier job that ended without it, so resume continues the preserved work (#249).
Pulse 0.4.0
Added
- Agents of
pulse goand/pulse-buildclose each task of the Plan with a commit that carries the trailerPulse-Task: <n>, and the live map showsPlan k/nwith the next open task under the ladder of each of your jobs, read from the item's branch (#216). - The live map is a command center: Needs you stands on top only when you must act, each entry with its item, the reason and the key; each of your jobs shows a ladder of its stages with the active one's duration; the goal, the runner's next step and what it does about a hook's refusal stand at the Pulse runner row; an action stands at its item until two minutes after it is confirmed, and a conflict offers
redoin the item view; someone else's items show only the item and its branch, plus your own sessions and actions on them. Next, Local actions and the goal above the sections are gone (#215). /pulse-offand/pulse-on(in Codex$pulse:pulse-off,$pulse:pulse-on) andpulse off,pulse onturn Pulse off or on for you in this clone, or with--hoston your computer, without changing your team's configuration. While any switch is off, yours or the team'smode = "off", your sessions there get no rules, guard or presence andpulse gostarts no run;pulse statusand the Map name the switch and the way back. Only you switch: Claude Code asks you in its own dialog, Codex names the command for your terminal, and the Codex rules forbid it to the agent (#231).- Who is doing what in the live map reads as a tree: your row sums up your items and sessions and adds
pulse go: k of n slotsonly while your runner runs; each of your items shows its ladder of stages without repeating you as its holder; its sessions start folded behind a row such as▸ 2 sessionsthatEnter,→or a click unfolds per item and the clone keeps; sessions on a branch without an item fold the same way;pulse statusnames the count on the row instead; an unfolded session shows its place, what it does and for how long, with its running Claude Code or Codex subagents below, each with its type, what it is for and how long it runs. The section of open work in its order is now called Backlog, in the map, its help and the docs (#234). - The live map scrolls as a whole in a low pane:
PgUp,PgDn,HomeandEndmove the window, a line names the lines shown (lines 21 to 40 of 96), and the window follows the selected row. Every section heading can be selected, andEnteror a click folds the section into one line with its count, such asBACKLOG (12); the folds stay with the clone (#214). - Below the backlog, the live map lists what Pulse integrated in the last 7 days, newest first, with who integrated each item and when; the section folds like the others and
Enteropens an item there (#217).
Changed
- Claude workers of
pulse goget the rights you give your own sessions in the project: your permission mode (autoorbypassPermissionswhen your Claude Code settings set thatpermissions.defaultMode, elseacceptEdits), the allow, ask and deny rules of your.claude/settings.local.json, subagents and read tools, and the Pulse guard as a hook of their own, so no worker pulls your levers. A call your mode does not allow without asking is named in the run report with its tool and input.worker_permissions = "narrow"keeps the former list; a branch that changes its Claude Code settings runs narrow on your user settings only. Codex workers keep their sandbox, andpulse gorefuses a Codex template with--approve-for-me(#218). pulse gohands an item to a Claude Code worker as one goal (/goal): one session plans, freezes its spec tests, builds, and closes each Plan task withPulse-Task, with subagents and all its harness allows, bounded to 20 turns and the agent timeout;pulse gothen pushes through your hooks and its own gates decide, and a finding goes back as a new goal within the fix rounds. Codex workers anditem_flow = "phases"keep separate plan, build and fix sessions, and an item for which Claude Code refuses/goal(hooks restricted, an untrusted workspace) or which resumes on Codex after a usage limit falls back to them (#219).- Codex workers of
pulse goget network and the review of approvals as you set them for your own Codex sessions at the top level ofconfig.tomlin$CODEX_HOME(by default~/.codex), always in their workspace sandbox (an escalation Codex's own review approves runs outside it, as in your own session), and the plan, build and fix sessions of an item read the last comments on its issue by people who may push, as data after their instructions (a/goalsession from a file named beside its condition). Workers still get no GitHub login (#230).
Fixed
- The Pulse guard judges every command within 3.5 seconds and refuses one it cannot judge in that time, asking to split it, instead of being cut off at the hook's 5 second limit, which let the call run unchecked.
- The guard's check of your Pulse switches stays fast on very long lines (it grew with the square of the
pulsewords in a line), and it reads the command string ofnpm exec,npxandpnpmin every spelling of their-coption. - A
pulse gosession that commits its Plan and then stops at a usage limit finds that Plan when it resumes; the item no longer fails with its work pushed. - A worker of
pulse gokeeps the Pulse guard: it starts no Claude or Codex agent that drops the guard (a changedPULSE_HOLDER,PULSE_CLONE,CLAUDE_CONFIG_DIR,CLAUDE_CODE_SIMPLE,CODEX_HOMEorHOME,--setting-sourceswithoutuser), skips its permission checks, or leaves Codex's sandbox, judged from the program the line starts, so a line that only names such a flag runs; and it changes neither the running Pulse copy nor the project's.pulse/, with its edit tools or by a shell line that names them and does more than read them. No agent runs a git command that config of its line may turn into an alias (only git's own commands run under such config), pushes without naming the branch, or with a branch that config of its line could redirect, or pushes topulse-state. A phase that runs on your user settings keeps the sandbox block of the project's settings on the base branch (#229). - The live map's header counts as many "need you" as NEEDS YOU shows: an item your own session holds by hand and that has been silent too long, and an item on hold, now stand there with their next step.
- The Pulse guard sees
claudeandcodexagain afterdo,then,else,if,while, a brace group,!,function,coproc, zsh'snoglobandrepeat, and insidenpm exec -c, andexport,unsetandexec -cthere; a named push that the line'spush.default=upstreamortrackingor abranch.<name>.mergekey can send to the base or topulse-stateis refused; a push without a target is refused only under a key that can steer it, sogit -c http.postBuffer=... pushworks again; for a worker,export PATH=...is no write, and git commands such assubmodulecount as no alias (#235). - Every job of
pulse gothat can reach a fix round (refresh and document jobs too) gives its fix session the comments of its issue, and a failure to read or write those comments becomes a note instead of stopping the item or the run. - Your switch for the whole computer lives in
~/.config/pulse-agents/(or$XDG_CONFIG_HOME/pulse-agents/), so work with PulseAudio's~/.config/pulse/passes in every project and resetting PulseAudio no longer drops your switch. The guard also refusespulse onandpulse offamong the words ofscript,unbuffer,setsidorstdbufand in their-clines, counts the filesscriptwrites itself as writes, treatsexport -n,typeset +x,localanddeclareof an agent's marker asunset, and where only the switches count refusesexec -conly when it reaches one (#236). - In the live map, a subagent that another subagent starts shows its own description, and the sessions under an item are drawn as a tree.
Pulse 0.3.8
Changed
- The live map shows every session of a
pulse gorun under its item, also its review and goal sessions in their detached folders, names each item's branch under it, and names a session without an item by its branch ordetachedinstead ofno branch. The Pulse guard refuses an agent'sgit commit,merge,cherry-pick,revert,amand apullof another branch on the base or default branch and points to the item branch; aborting and catching up with the branch's own origin branch stay open (#213). - The goal of
pulse goguides the whole run: every agent that plans, builds or fixes an item reads the goal and its criteria, steering or pausing stops only the jobs whose item leaves the scope, the Map shows the progress while jobs run, and an open goal names the items that hold it (#207).
Fixed
- In a Herdr pane the live map keeps its text signet and no longer prints graphics commands such as
Ga=p,i=...as text every second: Herdr confirms the Kitty graphics question but passes each image placement on as text, so the map no longer asks there (#212). - The live map no longer shows an agent of
pulse goas "needs you" or counts it in the header: nobody can answer a headless agent's permission request, so its row showspermission denied: <tool>instead. An approved permission request of your own session now ends when its call returns, and a session nobody attends stops waiting once it starts its next tool call without an answer (#210). - The live map shows the item
pulse goprepares or runs once, under Who is doing what with its real stage such aspreparing buildortests running, instead of also asstarts nextin the ramp while the board does not show the claim yet. A job that ended no longer keeps its phase, and▲marks only ramp rows that start next and have not failed (#211). pulse gogates check what a push checks: a headless Claude may run every command a chainedverifynames andpulse check; a verify line of a Plan runs only as a command.pulse/config.tomlon the base names too, and the result names the others. A project hook that refuses a commit or push of the result gets a fix round of its own, so a pre-push typecheck that fails after the review's fix round no longer ends the item with a decision (#208).- An item's failure no longer gets lost when Pulse cannot push its state: a push that changes only
pulse-stateruns without the project's pre-push hooks, while a push with an item branch still runs them; a failure origin does not take stays in the local outbox and goes out again; and until the board has it, the map shows the item as failed and "not on the board yet" instead of "the next run checks it again" (#209). pulse gointerprets a goal again: the agent writes its proposal outside.git, where Claude Code lets a headless session write. A failed interpretation pauses the goal with its reason inpulse goand the map instead of working the whole queue, item numbers such as#580in the text limit the run to those items until the interpretation decides whether the rest of the queue goes on, and/pulse-goalways passes your whole text (#206).- A steer never widens a goal's explicit scope:
--itemand--epichold whatever the steer says, an "only" steer on named items only narrows them, and a task the interpretation proposes never adds an item outside an explicit "only #5 and #6" restriction (#222).
Pulse 0.3.7
Fixed
- Two Pulse commands that write the local action outbox at once both go through: a command that only reads no longer writes the outbox and never waits, and a writer waits up to 1 s for another one's transaction instead of exiting with "action outbox unavailable" after 0.15 s (#204).
Pulse 0.3.6
Fixed
pulse newlists a new item under its parent wherepulse checkfinds it: nested under the parent in the grandparent's Items only where that list names the parent, otherwise in the parent's own Items. Before, a fix under an improvement madepulse checkreport C9 (#203).pulse gono longer halts with "Probe cleanup failed" before planning: the commit-gate probe turns off git's background maintenance in its throwaway clone, which still held a lock while the probe removed the clone (#201).
Pulse 0.3.5
Fixed
- Two hooks of a session that come due at once start one writer of its sign of life on Linux too, where the file system gives the fresh stamp the inode number of the old one (#202).
Pulse 0.3.4
Changed
- The Map shows its signet, the P of the light Pulse icon, as an image in terminals that confirm the Kitty graphics protocol (for example Kitty, Ghostty, WezTerm): with the icon's petrol gradient and smooth edges, in the same 8 columns and 4 rows of the header. The Map asks the terminal once; without its confirmation, in a pipe, in
pulse status, on Windows, in tmux and in GNU screen the text signet stays. The image follows resizes and is removed when the Map ends, also afterCtrl-C, a signal or an error. Answers of the terminal never act as keys, and one that arrives after the Map ended does not reach the shell (#166).
Fixed
- A Project-BA works on
docs/<n>-<slug>, n being the number of its draft. The Stop hook andpulse releasenow see its unpushed commits and ask for the push, as on any numbered docs branch (#103). pulse check,pulse migrateand the spec checks read frontmatter the same way: a line of exactly---(trailing blanks aside) opens and closes it,---foodoes neither, and a file may end right after the closing line.pulse migratenow also removesownerandassignee, whichpulse checkreported afterwards, and its preview shows control characters as?like every other command (#92).- The setup guide and
/pulsesuggest a branch named by date and time,chore/pulse-config-<YYYYMMDD-HHMMSS>, so two clones no longer collide onchore/setup-pulse.pulse new --specno longer opens a second record for a spec that an open record already links; it names that record (#80). - A project with its own
spec_branchpattern gets the reminder to push unpushed commits on a spec branch, as one withdocs/<n>-<slug>does: the hook reads the item number with the rule that recognizes spec branches. The query of the auto-approval control issue takes up to 1000 matches instead of 30 (#33).
Pulse 0.3.3
Added
/pulse-go(in Codex$pulse:pulse-go) startspulse gofrom the chat with your whole text as its goal;/pulse-go pause,resume,stopandsteer <direction>control a running runner. A runner that already works is named, never started twice. In Claude Code only you invoke the command (Codex has no such switch for a skill); runner agents and unattended sessions still cannot start a runner (#196).- An item a session holds by hand names its holder, the session, its phase and the age of its last sign of life in the Map, in
pulse status <n>and in the activity of an idlepulse go. The session leaves the sign of life as onepulse:beatcomment on the item's issue when it claims the item or changes phase; its hook renews it at most every ten minutes in a detached process while the session works, also from another clone and without a commit. Only a beat by the claim's own account and session counts. After 30 minutes without one the item saysno sign of lifewith the next step: ask the holder, or take it over withpulse release --take <n>. Runs ofpulse gokeep their own signs of life (#195). - Lever grants for attended Claude Code sessions. A session asks once with
pulse levers allow run,sessionoralways, run on its own; Claude Code shows you its permission dialog, and only your confirmation makes the grant. In the Map,lon a session line opens the settings, where you grant or revoke. Under a grant the session pulls approve, defer, resume, revoke, handoff, retry, discard, delete,pulse auto merge on|offand the takeovers itself, plusgh pr ready|merge, pushes to the base and--force-with-leaseon an item branch; force pushes,--no-verify, disabled hooks and removed markers stay closed. Every use is logged (pulse levers, the Map's settings) and named in a comment on the item;pulse levers offends every grant at once. Unattended sessions, agents ofpulse goand Codex get no grant (#197).
Fixed
- Two Pulse commands that open the local action outbox at once no longer end with "unsafe action outbox ownership, permissions or link". A journal that the other command's transaction removes between open and check counts as missing; foreign owners, loose permissions, symlinks and extra hard links are still refused (#189).
Pulse 0.3.2
Fixed
- A stored result holds only for the head it checked. When the item branch moved after a red result, for example after a correction and
pulse resume,pulse gobuilds and gates the new head instead of waiting on the old verdict for good (#191). - The Map's Herdr pane no longer vanishes with an error. An error while the Map reads the board or draws a view leaves it running; the status line names the error and the Map reads again. The pane closes when the Map ends with exit code 0 (
q,Ctrl-C, SIGTERM, SIGHUP), and otherwise stays open with the Map's last output and the command that starts it again; the nextpulse map --ensurestarts the Map in that pane. An error while the Map builds the item view still ends it, with the pane left open. A switch to a newer Pulse that cannot start names the reason once. pulse map --ensurein Herdr reports "opened beside" only once the Map runs. A Map that does not note its process within 10 seconds is reported as not started, with the last lines of its pane.- A
pulse gorun with nothing it can start no longer reports "supervising work":report.jsonand the Map name each item it waits for, the reason and the next step, and how long it has waited. - A push from Pulse waits for the project's pre-push hook for up to 30 minutes. Before, every push ended after the 60 s network limit, so a hook that runs lint and type checks stopped publication, shared state and claims with "no answer within 60 s" (#194).