Skip to content

Releases: pssah4/pulse

Pulse 0.4.2

Choose a tag to compare

@github-actions github-actions released this 06 Oct 08:11

Added

  • pulse done verifies 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

Choose a tag to compare

@github-actions github-actions released this 05 Oct 10:57

Fixed

  • A handoff that reaches a pulse go job 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

Choose a tag to compare

@github-actions github-actions released this 04 Oct 15:22

Added

  • Agents of pulse go and /pulse-build close each task of the Plan with a commit that carries the trailer Pulse-Task: <n>, and the live map shows Plan k/n with 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 redo in 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-off and /pulse-on (in Codex $pulse:pulse-off, $pulse:pulse-on) and pulse off, pulse on turn Pulse off or on for you in this clone, or with --host on your computer, without changing your team's configuration. While any switch is off, yours or the team's mode = "off", your sessions there get no rules, guard or presence and pulse go starts no run; pulse status and 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 slots only 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 sessions that Enter, → or a click unfolds per item and the clone keeps; sessions on a branch without an item fold the same way; pulse status names 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, Home and End move 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, and Enter or a click folds the section into one line with its count, such as BACKLOG (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 Enter opens an item there (#217).

Changed

  • Claude workers of pulse go get the rights you give your own sessions in the project: your permission mode (auto or bypassPermissions when your Claude Code settings set that permissions.defaultMode, else acceptEdits), 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, and pulse go refuses a Codex template with --approve-for-me (#218).
  • pulse go hands an item to a Claude Code worker as one goal (/goal): one session plans, freezes its spec tests, builds, and closes each Plan task with Pulse-Task, with subagents and all its harness allows, bounded to 20 turns and the agent timeout; pulse go then pushes through your hooks and its own gates decide, and a finding goes back as a new goal within the fix rounds. Codex workers and item_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 go get network and the review of approvals as you set them for your own Codex sessions at the top level of config.toml in $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 /goal session 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 pulse words in a line), and it reads the command string of npm exec, npx and pnpm in every spelling of their -c option.
  • A pulse go session 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 go keeps the Pulse guard: it starts no Claude or Codex agent that drops the guard (a changed PULSE_HOLDER, PULSE_CLONE, CLAUDE_CONFIG_DIR, CLAUDE_CODE_SIMPLE, CODEX_HOME or HOME, --setting-sources without user), 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 to pulse-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 claude and codex again after do, then, else, if, while, a brace group, !, function, coproc, zsh's noglob and repeat, and inside npm exec -c, and export, unset and exec -c there; a named push that the line's push.default=upstream or tracking or a branch.<name>.merge key can send to the base or to pulse-state is refused; a push without a target is refused only under a key that can steer it, so git -c http.postBuffer=... push works again; for a worker, export PATH=... is no write, and git commands such as submodule count as no alias (#235).
  • Every job of pulse go that 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 refuses pulse on and pulse off among the words of script, unbuffer, setsid or stdbuf and in their -c lines, counts the files script writes itself as writes, treats export -n, typeset +x, local and declare of an agent's marker as unset, and where only the switches count refuses exec -c only 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

Choose a tag to compare

@github-actions github-actions released this 04 Oct 07:06

Changed

  • The live map shows every session of a pulse go run 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 or detached instead of no branch. The Pulse guard refuses an agent's git commit, merge, cherry-pick, revert, am and a pull of 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 go guides 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 go as "needs you" or counts it in the header: nobody can answer a headless agent's permission request, so its row shows permission 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 go prepares or runs once, under Who is doing what with its real stage such as preparing build or tests running, instead of also as starts next in 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 go gates check what a push checks: a headless Claude may run every command a chained verify names and pulse check; a verify line of a Plan runs only as a command .pulse/config.toml on 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-state runs 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 go interprets 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 in pulse go and the map instead of working the whole queue, item numbers such as #580 in the text limit the run to those items until the interpretation decides whether the rest of the queue goes on, and /pulse-go always passes your whole text (#206).
  • A steer never widens a goal's explicit scope: --item and --epic hold 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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 21:54

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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 20:14

Fixed

  • pulse new lists a new item under its parent where pulse check finds 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 made pulse check report C9 (#203).
  • pulse go no 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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 17:00

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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 16:12

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 after Ctrl-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 and pulse release now see its unpushed commits and ask for the push, as on any numbered docs branch (#103).
  • pulse check, pulse migrate and the spec checks read frontmatter the same way: a line of exactly --- (trailing blanks aside) opens and closes it, ---foo does neither, and a file may end right after the closing line. pulse migrate now also removes owner and assignee, which pulse check reported afterwards, and its preview shows control characters as ? like every other command (#92).
  • The setup guide and /pulse suggest a branch named by date and time, chore/pulse-config-<YYYYMMDD-HHMMSS>, so two clones no longer collide on chore/setup-pulse. pulse new --spec no 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_branch pattern gets the reminder to push unpushed commits on a spec branch, as one with docs/<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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 16:11

Added

  • /pulse-go (in Codex $pulse:pulse-go) starts pulse go from the chat with your whole text as its goal; /pulse-go pause, resume, stop and steer <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 idle pulse go. The session leaves the sign of life as one pulse:beat comment 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 says no sign of life with the next step: ask the holder, or take it over with pulse release --take <n>. Runs of pulse go keep their own signs of life (#195).
  • Lever grants for attended Claude Code sessions. A session asks once with pulse levers allow run, session or always, run on its own; Claude Code shows you its permission dialog, and only your confirmation makes the grant. In the Map, l on 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|off and the takeovers itself, plus gh pr ready|merge, pushes to the base and --force-with-lease on 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 off ends every grant at once. Unattended sessions, agents of pulse go and 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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 11:43

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 go builds 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 next pulse map --ensure starts 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 --ensure in 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 go run with nothing it can start no longer reports "supervising work": report.json and 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).