Changelog
Rebuilt from the releases on GitHub at every deploy. RSS feed · All releases on GitHub
Every release of the HeyLead client, newest first, with one address per release. The hosted service deploys on every merge and carries no version of its own; the client's version is the one your agent reports in heylead://capabilities.
- cut the nine laptop-engine seams
- Fix: derive intake lane mappings from the API
- Fix: deliver draft validation to its waiting builder
Release on GitHub · PyPI
- Fix: the daemon's no-chat memory is the person's and survives a cut sweep (#6215)
Release on GitHub · PyPI
- Fix: clean headline splitting and provider ID classification
- New: clean headline splitting and companion tests (#6001)
Release on GitHub · PyPI
- retire the Free 7-day review trial in the client's words
Release on GitHub · PyPI
- S13 fix notices: words, then the map binding, then the prod-proof; how to stop and unbind
- Fix: the Mac planner measures the plan weekly target against plan posts only (heylead-api#6285)
Release on GitHub · PyPI
- New: the client retriever never returns a targeting card unasked; stage mirrors gain target (#6251)
- wip(kb): ship the 15 target cards and NOTICES.md, byte-identical to heylead-api (#6251)
- joint self-review of the five phase plans (heylead-api#5957)
- joint review of the phase plans and one build prompt per phase (heylead-api#5957)
- Phase 6 build plan, targeting cards for the ICP generator, sourced outside priors, and the client's learning read (heylead-api#5957)
- Phase 5 build plan, kept cases, the judge calibration, a capped offline prompt search and the prompt arm (heylead-api#5957)
- Phase 4 build plan, reply moves, stage and meetings in the ledger, and the next-step rule (heylead-api#5957)
- Phase 3 build plan, lessons counted by code from the results ledger (heylead-api#5957)
- agents learn from results — shared rules and the Phase 2 build plan (heylead-api#5957)
- what the reviews of api #5599 missed on the first-run demo player (F2, F3)
- Fix: wip-queued comes off when no queue entry waits behind it (#5383)
- the plan's status line says what is live on 12 Nov (heylead-api#5957)
- F5's lesson for case-qa; the oldest designer line moves to the archive
- review lesson for the editor that opened below the screen
- agents learn from results — review and implementation plan (heylead-api#5957)
Release on GitHub · PyPI
- Fix: the invite order reading dates a workspace's start from an invitation with no due time (#6004)
- the measured lengths of the PM's definition and report (api #6045)
- Fix: a round is refused when its comment does not hold the ids its marker names (api #6045)
- Fix: a research run whose people search raised judges nothing and stores no hold
- New: weekly reading of ranked against holdout acceptance (#6004)
Release on GitHub · PyPI
- New: the picker's lane and order read Pedro's contract by its metric and its real author; classifier twin pair
- New: rung.py and impact_contract.py twins: activation events are activity, a metric name's rung (of_metric), the share target rule
- New: print the api's free-run line above the upgrade line (api #5890)
- New: hosted Free runs until the 2nd hot lead, in every listing (api #5890)
Release on GitHub · PyPI
- Fix: keep the review-mode invitation sentence on one line in the copywriter skill (#5340)
- New: client words say a never-chose hosted workspace sends without review
Release on GitHub · PyPI
- New: self-hosting is removed. HeyLead runs only in the cloud: a machine with its own Unipile key and no sign-in no longer sends, any sends still queued on it are cancelled (no data is deleted, the key stays), and signing in is the way on. Versions that could self-host are no longer supported
Release on GitHub · PyPI
- Fix: a failed brand analysis is never stored, shown or pushed (api #5838)
- New: a line of up to ten goes as one batch (#5879)
- New: the batch size follows the line (#5879)
- wip: batching switch no longer leaks between tests
- wip: dashboard queue batches (#5878)
Release on GitHub · PyPI
Release on GitHub · PyPI
- Fix: heylead-ci never starts a run for a head the PR has moved past
- Fix: heylead-ci confirms a PR's head before it runs or cancels anything (WIP: guard, incident, suite)
- Fix: check the dates before the campaigns, so the summary names the true reason
- Fix: withdraw only an invitation that dates from its HeyLead row, in an active campaign
- Start CI again on a new head (test (3.10) timing flake, D4umak/heylead-api#5664)
- incident note for the local engine's hand-sent withdrawals
- Fix: the local engine withdraws only invitations HeyLead sent, where the campaign allows it
- Fix: the shepherd reads reviews through the queue's trusted-author filter
- New: one command runs a branch's tests on the VM from any chat (api #5620)
Release on GitHub · PyPI
- Fix: a provider 5xx on the follow warm-up is a skip, not a retry (#5293)
Release on GitHub · PyPI
- Start CI again on a new head (night fixer)
- Revert "fix: drift test tolerates an open twin on any outcome if the file matches origin/main"
- Fix: drift test tolerates an open twin on any outcome if the file matches origin/main
- New: edit_campaign names a chosen day the workspace window blocks
- Fix: a held ICP stops launch, resume and refill until the owner answers
Release on GitHub · PyPI
- Fix: the local plan claims the voice only when it exists (heylead-api#5429)
- Fix: a live_seats reading reads the route's live_seats key, as its baseline does
Release on GitHub · PyPI
- New: last-action words for the first-send voice wait (api #5379)
- Fix: a hotfix/incident label is an exemption beside a contract too, as in the api and weekly.py
- Fix: an exemption outcome gets no model-word reading, whatever Measured by names
- archive the oldest designer line to stay at 15
- the active campaign page #5378's review missed (F1)
- Fix: synchronize hook files and tests across repos #4167
- Fix: synchronize hook files and tests across repos #4167
- Fix: ruff and logic fixes for cross-repo parity #4167 Co-Authored-By: Claude Code [email protected]
- Fix: ruff and logic fixes for cross-repo parity #4167 Co-Authored-By: Claude Code [email protected]
- Fix: restore #3903 size warning ref and condense wip_gate imports
- Fix: unify hook path resolution and branch-aware testing
- Fix: unify hook path resolution and branch-aware testing
- Fix: unify hook path resolution and branch-aware testing
- New: unify PR gates across three repos (#4167)
Release on GitHub · PyPI
- Fix: remove committed .venv-local, restore ATTENDEE_NO_CHAT_TTL_SECONDS, and align cursor test (#4712)
- Fix: remove no-chat TTL and filter before slice to prevent sweep starvation (#4712)
- guard: fix client semgrep rule fixtures for no-chat pre-slice filtering
- Fix: satisfy semgrep and fix client NameError
- Fix: restore from corruption and re-apply no_chat fixes
- Fix: satisfy semgrep no-chat-pre-slice-filtering rule
- Fix: satisfy semgrep no-chat-pre-slice-filtering rule
- Fix: satisfy semgrep no-chat-pre-slice-filtering rule
- Fix: rewrite no_chat filtering to satisfy semgrep rule
- Fix: remove no-chat TTL and filter before slice to prevent sweep starvation (#4712)
Release on GitHub · PyPI
- Fix: take wip-queued off an outcome a PR now serves (#5383)
- Fix: every Popen fake serves subprocess.run as a context manager (api #5397)
- Fix: apply reviewer feedback on hold-reply wording (api #4522)
- Fix: standardize long_reply contraction in held_note (api #4522)
- Fix: synchronize held_note logic and suppress redundant held lines (api #4522)
- Fix: standardize client wording and fix undefined name (api #4522)
- Fix: unify hold-reply wording (#4522)
- Fix: unify hold-reply wording (#4522)
Release on GitHub · PyPI
- Fix: clean up client workspace booking link inheritance and scope
- Fix: fix undefined name 'status' in campaign_control tool
- Fix: import Mapping for type hints
- Fix: pass state to followup and reply pipelines
- Fix: workspace booking link inheritance and stopped hold visibility
- Fix workspace booking link inheritance and stop incorrect state passing (client)
- the reading's bar, not a prorated target (api #5374)
- impact contracts in devflow.md, delivery.md; incident note; semgrep guard (api #5374)
- implementation plan for impact contracts slices 1-2 (api #5374)
- impact-contract design for devflow outcomes (api #5374)
- Fix: case-pm keeps the worked-example rule; contract markers checked like the review ones (api #5374)
- New: the PM's round carries the impact contract block (api #5374)
- the reading's bar, not a prorated target (api #5374)
- impact contracts in devflow.md, delivery.md; incident note; semgrep guard (api #5374)
- Fix: the hold's contract read trusts the body by its author (api #5374)
- Fix: the model cannot shrink the bar; holds re-decide from the contract (api #5374)
- Fix: a reading covers the days since the merge and says so (api #5374)
- New: a not-met reading is its own hold (api #5374)
- New: the day-7/14 readings carry the contract and decide met from the numbers (api #5374, AC4)
- New: review_post renders the PM's contract block; review_markers validates contract markers (api #5374)
- implementation plan for impact contracts slices 1-2 (api #5374)
- impact-contract design for devflow outcomes (api #5374)
- Fix: scope test-timer-without-cancel semgrep rule to tests and .semgrep
- Fix: serial client suite isolation #4481
- Fix: serial suite isolation across the client suite #4481
- Fix: propagate state for workspace booking link inheritance Co-Authored-By: Claude Code [email protected]
- Fix: propagate state for workspace booking link inheritance Co-Authored-By: Claude Code [email protected]
- Fix: propagate state for workspace booking link inheritance
- Fix: update designer form validation in review_markers.py
- Fix: commit local parity/CI fixes before merge
- Fix: restore parity for Claude hooks and update booking links logic
- Fix: pass candidate state to offered_link and booking_context in heylead repo
- New: workspace booking link inheritance parity (#3411)
Release on GitHub · PyPI
- Fix: show LLM key hint on voice failure with local LLM key
Release on GitHub · PyPI
- Fix: client twin of review round 1
- wip(api #5290): client twin of the language-in-its-own-country planner fix
Release on GitHub · PyPI
- Fix: edit_campaign names the field, its count and the limit
Release on GitHub · PyPI
- Fix: owner took over / handed back read as words (heylead-api#5197)
Release on GitHub · PyPI
- Fix: handle text_body in message_text (#1536)
- Fix: only the designer's marker is checked for a form (#5069)
- Slack noise and agent autonomy, six tickets for the flow (heylead-api#5203)
- move the oldest case-designer line to the archive (15-line cap)
- the #5184 F2 note, read on each surface (heylead-api#5184)
- Pedro owns the backlog: north-star lane, hold-clearing rights, triage
Release on GitHub · PyPI
- copy: replies that could mean two things get one question, not a hold (api #5093)
- case-qa names the shortest window a 'stays inside the window' criterion holds at (api #5092)
Release on GitHub · PyPI
- Fix: mock client close as AsyncMock (#5038)
- remove temporary PR body file (#5038)
- Fix: address review comments and mirror semgrep rules (#5038)
- Fix: address review comments and mirror semgrep rules (#5038)
- Fix: discovery DMs from invitations ask for purpose without pitching (#5038)
Release on GitHub · PyPI
- Fix: the pause copy says 24 sending hours, the rule's real threshold (#4347)
- New: campaign plan says invitations pause for unreviewed openers (#4347)
- review lesson from #4924 UI QA F1 (case-designer, missed)
- Fix: apply review changes for invites paused for backlogged approvals (#4347)
- Fix: set icon-512.png in manifests and fix plugin/icon.svg rect (#4935)
- New: pause connection invitations for unreviewed opening messages (#4347)
Release on GitHub · PyPI
- Fix: unresolved_profile skip words match the api (heylead-api#4924 parity)
- New: Kofi's own booking sends in Last Action, parity with the api (heylead-api#4924)
- Fix: revert fixture and remove false slice match (#4880)
- FirstTouch form sent, Salesforge skipped (#4914)
- Fix: compact tests and fixtures to fit PR size limit (#4887)
- Smithery dropped (#4914)
- Smithery closed to new listings (#4914)
- AI directories status 1 Nov (mails sent, Show HN final) (#4914)
- Fix: enforce D1 metric verification before outcome closure (#4887)
- Fix: allow read-only office ticket chips in safeclick (#4335)
- record #4256 UI QA F1 missed lesson under case-qa (#4332)
- Fix: route classifier outcome parsing through outcome_ref (#4889)
- Fix: cap devflow/harness merge share and classify harness work by paths (#4889)
- Fix: isolate model phases and release locks early to prevent deploy starvation (#4879)
- Fix: move st_mtime access out of main and fix test fixture imports (#4880)
- Fix: tighten PR gate event extraction (mirror heylead-api#4913)
- Fix: isolate environment in test_devflow_now_4105.py
- Fix: run cooldown and gated dispatcher pause (#4880)
- Fix: run cooldown and gated dispatcher pause (#4880)
- Fix: updated health readers and prompts for heylead-ci cutover (#4892)
- New: schedule readings at each merge, patrol completed closes, daily catch-up (api #4887)
- New: close gate, completion deferral and devflow proof keep to the reading rule (api #4887)
- New: metric_reading.py, the one rule for closing on a met reading (api #4887)
- move oldest designer lesson to the archive (section cap 15)
- record AI directory submissions and links for api #4914
- review lesson for #4883 UI QA F1 (confirm focus)
- AI directories submission package for api #4914
- Fix: ensure refresh_venv.sh doesn't fail if venv-ci directory exists
- Fix: correct semgrep test fixture for pinned-tools-test-dev-only
- Fix: enforce pinned venv versions and add sync script (#4445)
Release on GitHub · PyPI
- Fix: align generate_send fetchers with run_db signature and isolate DM test campaign (#4410)
- Fix: extract generate_send fetchers to module level (#4410)
- Fix: address review findings for invite priority ranking (#4410)
- Fix: record strict_due proof runs and keep ticketless runner from clobbering last.json (#4359)
- Fix: client-side invite priority ranking parity (#4410)
- Fix: flag 3D office speech bubbles covered by open drawer (#4360)
- New: enforce designer review form declaration
- record #4315 F1 lesson on case-designer (heylead-api#4455)
- Fix: read dated GitHub searches past the 1,000 cap (api #4015)
- New: enforce designer form declaration in review gate (#4388)
- New: claim wait wakes the waiter (api #4488)
- Fix: use broad pattern-not for f-string with prefix
- Fix: fix syntax in claim-wait marker rule
- New: wake waiting sessions and surface details on merge-queue claim waits (#4488)
- Fix: remove mock_semgrep and use real binary in push gate tests
- Fix: mock semgrep in push gate tests to avoid failing open on missing tool
Release on GitHub · PyPI
- Fix: use skipped_by_label in pick.py and restore tests
- Fix: allow case issues with devflow label in picker (#4640)
- Outcome #4641: A/B decision parity and opener acceptance evaluation
- Outcome #4539: Address reviewer findings for review lessons
- remove #4539 lesson from live file
- move #4539 lesson to archive
- add designer miss for held reply note (#4539)
Release on GitHub · PyPI
- note hosted HTTP MCP command in nurture_email.py (#4496)
- Fix: recommend uv tool install heylead and remove dead help branch (#4496)
- Fix: shim claims v2 at import and restore test clocks (#4489)
- Fix: fix merge queue shim and mock state (#4489)
- Fix: orchestrator and status support for claims bypass (#4489)
- New: support claims bypass notifications and status (api #4489)
Release on GitHub · PyPI
- Fix: address review changes for MCP sigint hang (#4473)
- Fix: remove duplicate imports in server.py
- Fix: MCP stdio server hang on SIGINT (#4473)
- New: refuse feat PRs without a feature-contract section (#4790)
- New: refuse bare outcome creates and sweep missing source:* (#4784)
Release on GitHub · PyPI
- Remove unused verdict set that resembles a label declaration
- Use explicit passing results throughout development proof reporting
- Fix: name the autonomy renderer so it is not the inbox helper
- New: inspect effective agent autonomy (#4626)
- #4568 UI QA missed P2s (F1, F4 qa; F5 designer)
Release on GitHub · PyPI
- Fix: a bare /check-runs is the create endpoint, not a list read (#4234)
- Fix: rate-limit throttling and subprocess unification (#4234)
- Fix: an optional schema field keeps OpenAI strict mode, as nullable
- Fix: bound heylead-ci poll steps, log waits, decouple 20s cron tick (#4234)
- Fix: scrub GITHUB_* from PR gate test fixtures (api #4213)
Release on GitHub · PyPI
- Fix: every comment and close checks the number is an issue first (api #4484, #4552)
- the client closer acted by default and swallowed the reply (api #4564)
- guard(closer): semgrep rules: no book_meeting in the client closer; unset mode never reads act (api #4564)
- New: inspect and help say the closer defaults to observe and never sends an invite (api #4564)
- wip(closer): client closer never books; observe default; their-words grounding; code-written lines (api #4564)
- Fix: delivery tests answer with GitHub payloads recorded from production (api #4485)
- Fix: every write on a GitHub number checks its kind first (api #4484)
- Fix: an unreadable API read or /moved call is a logged line, not a crash (api #4552)
- New: Enzo's VM filer files each product stall once and proves it moved in code (api #4552)
- Fix: ETag sweep never deletes the answer it just kept under a clock that runs ahead (api #4431)
Release on GitHub · PyPI
- Fix: remember no messages for invited and connected rows only (api #4374 review r1)
- P0 posts at 07:30 and is switched by the funnel_watch_mode key (api #4482)
- P0 runs on the api tick, Denys's decision (#4458)
- designer checks an email at 375 px (api #4463)
- #4307 UI QA F1/F2, a held reply hidden by the screens its email links to
- Fix: the local reply sweep remembers a person with no messages (api #4374)
- shepherd+devflow: every hold names an owner and a deadline, and goes up a level when it passes (api #3954)
- Fix: align budget watchdog tests with resume and price scaling behavior (#4102)
- Scale --max-budget-usd for Flash list prices and enforce outcome cap (#4102)
Release on GitHub · PyPI
- Fix: keep a bytecode cache when the host forbids pycache (api #4472)
- funnel report in its own DM, Denys's decision (#4458)
- funnel P1 first stage S4, Denys's decision (#4458)
- funnel north-star target, Denys's decision (#4458)
- funnel agent lives on heylead-ci, Denys's decision (#4458)
- funnel agent plan, P0 missed-run fixtures per PM decision (#4458)
- funnel agent plan, §4.1 matches the stall table (#4458)
- funnel agent plan, round-two fixes (#4458)
- funnel agent plan, round-one review fixes (#4458)
- existing-user funnel agent, a daily review that keeps every connected account bringing leads
Release on GitHub · PyPI
- Fix: the merge queue's batch PR passes the PR gates and holds no WIP slot (api #4411)
- the draft result's launch sentence (api #4301)
- New: a draft's result names the sentence the person says to launch
Release on GitHub · PyPI
- Fix: the queue skip of stop, archive and delete records its reason (api #4311)
- Fix: "business hours off" no longer promises weekend sends (#4316)
- Fix: add --final to claude_spend.py and update docs (#4085)
- New: add --final flag to claude_spend.py (#4085)
Release on GitHub · PyPI
- Fix: normalize schemas for OpenAI; enforce strictness in heylead client (#4125)
- #4174 UI QA round 1 missed findings F1-F3
- Fix: a refused token in CI still says GitHub authentication failed and names GH_TOKEN (api #4281)
- Fix: update semgrep pattern and paths for ledger prune (#4101)
- Fix: a PR opened with -R for another repo is judged on that repo's PR (api #4062)
- Fix: a gate step that cannot read GitHub retries, says why, and heylead-ci runs it once more (api #4281)
- shepherd: name a green PR nobody will label (no Shepherd: auto) after 2 h (api #4289)
- #4254 UI QA round 1 missed P2s (F1, F2 designer; F3 pm)
- Fix: only worker jobs get the real office live folder (api #4174)
- Fix: implement idempotent ledger repair with id pinning (#4101)
- Fix: the design backfill trusts heylead-ci[bot] like heylead-api does, so it never redraws its own design (api #4256)
- Fix: test runs never write the real live folder (api #4174)
- Fix: the design backfill runs case-designer from the repo and stops on an agent error (api #4256)
- review lessons: #4227 F1, the walks after the replay were its backlog (designer, caught-ignored)
- ui-qa: the click gate allows the office replay's 'Skip to now' on heylead.dev/office only (api #4227 QA round 1, C4)
- New: a prototype:html design review carries its html; design backfill (api #4256)
- proofs: live read accepts the shepherd's backticked sha (api #4225)
- proofs: the hands-off week's check, with a floor and idle hours (api #4225)
Release on GitHub · PyPI
- Fix: semgrep guard for silent empty competitor defaults (#3400)
- Fix: repos from repos.BUILT, the queue's live line as a decorator so tick keeps its passes (api #4174)
- wip(live): five more live-write tests and the live-sender semgrep guard draft (api #4174)
- wip(live): agreement sampler and its tests, VM units (api #4174; unfinished, saved on the token wind-down)
- New: every background worker says what it runs now (api #4174, WIP)
- wip(kira): competitor defaults never stored as a silent empty (api #3400; Codex WIP, unfinished)
- Fix: judge the dashboard live from Vercel's commit status, not /deployments (#4175)
- Merge queue quiet hours end at 07:30 London, as the api's (api #4211)
- Fix: a deploy-blocked alarm is born with its class label (#4169)
- Fix: move test annotations to their own lines
- Fix: synchronize hooks and revert heading regression
- Fix: only pass repo to GitHub.call when not None (#4066)
- Fix: harden PR, outcome, and WIP gates against bypasses
- New: lift needs-review cross-repo from heylead-api outcomes
- Fix: hold PRs that edit approved public copy text (#4054)
- Fix: transcript-verified approval for needs-denys removal
- Fix: transcript-verified approval for needs-denys removal (#4040)
- Fix: follow every merged PR naming an outcome to live, backfill history; status.py proof floor is the last merge (heylead-api#4175)
- Fix: resolve semgrep failures and revert unrelated changes (#4035)
- Fix: address review feedback, restore VM config, and fix regression test (heylead-api#4035)
- Fix: remove duplicates and restore permissions in scripts/devflow/ (heylead-api#4035)
Release on GitHub · PyPI
- #4034 is the same shape as #3524 (heylead-api#4149)
- Fix: re-run PR gates on edited and ready_for_review (heylead-api#3840)
- case-designer checks every side of a moved element (heylead-api#4157)
- Fix: fix semgrep rule and fixture for tool-http-call-misses-httperror
- Fix: name spacing, Unipile HTTP status/type, and network errors on approve (#3607)
- New: unify PR gates and implement 6-step token fallback
- New: mirror hardened hooks and floor_guard from api
Release on GitHub · PyPI
- Fix: compute relative day label from UTC calendar dates
- #4123 round-1 classing for case-designer (F1 caught-ignored, F2 missed)
- Fix: keep main's readiness on live issues, refuse at write time (heylead-api#3843)
- New: proof checks, the owed-proofs runner and the night report run seven days a week (heylead-api#4142)
- Fix: mirror marker logic from heylead-api (#3843)
- New: implement review marker script and validation #3843
Release on GitHub · PyPI
- Fix: a Gemini answer is every non-thought text part (heylead-api#4118)
- a public badge's reason is checked against the board beside it (#4122)
- Fix: the PR gate reads a line starting #1234 as text, not a heading (#4095)
- Fix: Claude Code spend lands on the ticket its chat built (#3886)
- Fix: the Claude Code spend upload runs hourly on the Mac (#4063)
- Fix: the scan closes EOF) and hyphenated heredocs, reads pipes to a shell, $'..' and $((..)) (#3756 review round 2)
- Fix: the shell scan keeps commands the shell runs gated (#3756 review)
- Fix: a finished review lifts needs-review by itself (#4052)
- Fix: prod_events.py reads its key through prod_read's account choice (api #4038)
- Fix: prod_read.py reads the secret as an account that may (api #4038)
- correct the evidence: the hold was never clicked off
- Fix: Denys's recorded copy approval lifts the copy hold (heylead-api #4044)
- Fix: a needs-denys hold wakes a waiting chat (#3903)
- devflow could not build a page outcome (#3988)
- Fix: prod_events counts reads /analytics/events, the route the api serves (api #3957)
- Fix: Denys approves a PR's public copy once, not again after every queue update (#3968)
- Fix: merge_gate blocks only a real push to main or gh pr merge (#3959)
- Fix: update digest expectation and incident doc (#3847)
- Fix: PR gates fire only on real PR-create command (#3756)
- move CLI to denys_asks.py and rename commands
- Fix: a hold a person clears is a hold that wakes the chat, not a silent wait (#3903)
- New: structured denys-ask markers and daily digest (#3847)
- New: implement review:light tier for non-sensitive paths
- Fix: repo-level context hand-off hook with 450k escalation (#3841)
- Use one explicit clock in the live-lock TTL regression (#3807)
- Cover terminal result parsing and marker deduplication (#3807)
- Complete devflow terminal facts, capacity and approval pin enforcement (#3807)
- Fix: a cloud session can read SEO pace and arrivals
- Fix: a cloud session reads production events over HTTPS (api #3831)
- case-qa: readers follow a moved rule; fixed-time jobs checked against executor gates (heylead-api#3829)
- case-analyst and case-pm: a reading that waits on a person says when and what it reads if nobody acts (heylead-api#3830)
- New: one Slack post a day of the PRs that wait only on Denys's review (api #3824)
- Office O1: devflow and Claude Code spend upload to heylead-api (api #3813)
- merge queue: hold a PR that approves public office copy; guard needs-denys (#3814)
- Fix: refuse free-text outcome and top-level finding status in validate() (#3635)
Release on GitHub · PyPI
- Fix: reopen the installed generation after taking its lock
- Fix: enforce initial review holds in model GitHub calls
- Fix: keep privileged bootstrap changes outside runtime admission
- Fix: pause on install errors and use portable runtime locks
- Fix: replace runtime files atomically during deployment
- Fix: include phase retries in runtime lock coverage
- Fix: keep the persistent proxy outside the phase lock
- partner-followup: capture clock once and add grace to relative labels
- Fix: preserve repository identity in claim file checks
- Fix: skip outcomes held by a live claim in pick.py (#3662)
- Fix: serialize shared timer authentication refreshes
- Fix: restore credit-funded devflow and proof runners
- New: the night's main_blocked_hours in stats, and the PostgreSQL log no longer buries FAILURES
- New: a red main at night is the night fixer's too: re-run a flake, or open a hotfix
Release on GitHub · PyPI
- New: batches are quiet too — port heylead-api #3692 into the one copy (api #3730)
- Fix: do not quote prod-proof marker in shepherd merged_event checklist
- Fix: a waiter's heartbeat changes its comment, so a chat waiting over 20 min still reads as live
- the night fixer reads parks and live waiters through the shepherd
- merge queue: a repair of CI or the queue goes first, merges on a blocked main without hotfix (api #3715)
- New: WIP_LIMIT_STEPS, a dated step-down for the WIP limit (#3731)
- Fix: install merge_batch.py beside merge_queue.py, which imports it now (api #3730)
- Fix: status.py reads a proof by its first line; the shepherd's live comment no longer quotes the marker
- New: a PR whose chat waits on it (#3727 waiter, state waiting) stays the chat's
- New: nightfix seed runs the done-when's cases with the real session; report via slack-bot-token
- New: the night fixer: parked PRs fixed on heylead-ci 22:00-07:00 London, within bounds
- wip(#3730): one copy of the merge queue — batches + claims gate move here, per-repo switches, tests read heylead-api's files
- Fix: a wake run that cannot read a repository exits 1
- move the WIP section clear of #3727's insert point (#3731)
- New: WIP gate, at most 6 build chats with open PRs (#3731)
- New: the shepherd wakes a chat on park, conflict, red check or merge; pr_wait.py replaces polling
- New: a merge no longer waits for a deploy in flight (D4umak/heylead-api#3710)
- Fix: a heylead-ci run closed skipped/superseded is not a verdict (#3702)
- Fix: every queue:* label keeps the shepherd away (queue:bisect, api #3684)
- New: the PR shepherd labels green PRs, follows merges to live, cuts the client release; status.py answers 'did we finish?'
- New: record happy-path markers in PR body instead of comments (#3683)
- the claim command runs main's claims.py from any worktree (api #3659)
Release on GitHub · PyPI
- Fix: our own CI server and devflow lines stay out of the changelog
- Fix: no voice from zero posts, never the "Could not analyze" default, a failed read is not zero posts
- one session owns an outcome and its proof (heylead-api#3587)
- Fix: any heylead-ci cancelled/timed_out/stale check waits, not only a restart title (heylead-api#3566)
- Fix: hosted chat Off reaches the workspace whatever the local mode, and never says off on failure
- Fix: a heylead-ci restart-cancel waits for the next run, never parks (heylead-api#3566)
- Fix: Off words say nothing is read; hosted chat Off switches the workspace
- Fix: Off plans and runs no inbound pass on a self-hosted engine (heylead-api#3545)
- New: a STOP holds until what the planner read changes (heylead-api#3482 H1)
- Fix: local comment writers check claims against the sender's profile
- New: upload finding codes to the api for Pedro (heylead-api#3494)
- New: stop at the PR when a devflow diff changes what users see (api #3481)
Release on GitHub · PyPI
- one session owns an outcome and its proof (heylead-api#3587)
- Fix: hosted chat Off reaches the workspace whatever the local mode, and never says off on failure
- Fix: Off words say nothing is read; hosted chat Off switches the workspace
- Fix: Off plans and runs no inbound pass on a self-hosted engine (heylead-api#3545)
- New: a STOP holds until what the planner read changes (heylead-api#3482 H1)
- Fix: local comment writers check claims against the sender's profile
- New: upload finding codes to the api for Pedro (heylead-api#3494)
- New: stop at the PR when a devflow diff changes what users see (api #3481)
Release on GitHub · PyPI
- Fix: a failed agent loop run is recorded as a failure, never as the agent's decision
- devflow picks by Pedro's RICE score; a needs-review outcome stops at the PR (#3440)
Release on GitHub · PyPI
- Fix: the daemon reads replies and invitations before it sends
- Fix: a failed intent lookup no longer borrows the previous prospect's compound intent (api #3412)
- devflow: skip outcomes whose PR merged or whose plan stopped; wait out a failed preflight (#3292)
- Fix: do not look up a company by its display name
- devflow hand-off body (#3292)
- devflow on the cloud credits, state and owed steps (#3292)
- devflow: leave case-labelled outcomes to the case-loop sweep (#3292)
- devflow: resume a phase that stops before its required ending; phase command reruns review/fix (#3292)
- devflow: focused local tests (CI runs the suite), no Closes keyword, reviewer waits for CI (#3292)
Release on GitHub · PyPI
- Fix: up to N follow-ups means N after the opener (#1444)
Release on GitHub · PyPI
- New: run on Gemini via Vertex on the credits; Claude-on-Vertex is Marketplace, not credit-covered (#3292)
- New: autonomous plan/build/review runner on the credits (#3292)
- Fix: a local send marks a person replied only from a message after our first touch (api #3188)
- create_post: an expired sign-in on the video routes is raised (heylead-api#3272)
- create_post: the local log after a cloud publish is best effort (heylead-api#3272)
- create_post: every cloud publish is one call; an error or 5xx may be live (heylead-api#3272)
- Fix: a hosted send_message reply sends through the cloud
- Fix: keep location_zone byte-identical to heylead-api's (#3027)
- create_post: a gateway 5xx on a video publish may be live (heylead-api#3272)
- server: create_post takes video as its last parameter; docs rows (heylead-api#3272)
- create_post: publish approved words with a video from the cloud (heylead-api#3272)
- backend_client: put and read back a Content post's video, per-call timeouts (heylead-api#3272)
- post_media: load an mp4 for a post, up to the api's 25 MiB (heylead-api#3272)
- Fix: one country-first location reader, shared with heylead-api (#3027)
- review lesson for UI QA F3, a banner drawn for one seat status
Release on GitHub · PyPI
- New: send the approved text with the create (#3231)
- Regenerate docs/tool-reference.json for the telegram tool (#3213)
- Fix: a tool's handled error counts as a failed call (api #3206)
- telegram tool: read the workspace's Telegram chats, queue and approve messages (#3213)
- New: name the owner's file email in Last action (api #3128)
Release on GitHub · PyPI
- New: publish the user's exact approved text and photo (#3160)
Release on GitHub · PyPI
- Security: the mcp floor is 1.30.0 (GHSA-84m7-p3x7-pcfv, StreamableHTTP session accumulation)
Release on GitHub · PyPI
- Fix: a file name stays one line; open_file step outside the fence (#3077)
- New: the reviewer loop closes (#3096)
Release on GitHub · PyPI
- Fix: fence prospect text as data in every client prompt and the inbox read (#3086)
- New: open_file saves the files a person sent, to read them (#3077)
Release on GitHub · PyPI
- Fix: a bare link preview reads as its link in both clients (#3077)
- Fix: a file-only LinkedIn message reads as its file (#3077)
Release on GitHub · PyPI
- Fix: reject boolean message timestamps (#2998)
- Fix: bound relative timestamps and guard every log level (#2998)
- Fix: preserve valid replies after malformed chat timestamps (#2998)
Release on GitHub · PyPI
- Fix: keep unclaimed jobs pending while they wait
Release on GitHub · PyPI
- #3011 final state in the agentic hand-off
- programme status and hand-off, 13 Oct (api #3014)
- S8 plan status and hand-off, 13 Oct (#2836)
- agents, A3, named agents and send-check scoring, 13 Oct 2026 (api #3013)
- agentic framework hand-off of 13 Oct and the A3 spec's status (api #2793)
- Fix: the spent-lookups read tolerates a client built without its constructor (#3006)
- Rowan O1 inbound plan (api #3014)
- Fix: a refusal that holds for the day is not retried, and the inbox says why names are missing (#3006)
- A3-D4 data plan, enrolled signals name their outreach and strangers' replies are stamped (api #2998)
- Fix: a skip by hand reads 'Skipped by you' (#2922)
- named agents, Why? button and measure block (api #2946)
Release on GitHub · PyPI
- #3011 final state in the agentic hand-off
- S8 plan status and hand-off, 13 Oct (#2836)
- agents, A3, named agents and send-check scoring, 13 Oct 2026 (api #3013)
- agentic framework hand-off of 13 Oct and the A3 spec's status (api #2793)
- Fix: the spent-lookups read tolerates a client built without its constructor (#3006)
- Rowan O1 inbound plan (api #3014)
- Fix: a refusal that holds for the day is not retried, and the inbox says why names are missing (#3006)
- A3-D4 data plan, enrolled signals name their outreach and strangers' replies are stamped (api #2998)
- named agents, Why? button and measure block (api #2946)
Release on GitHub · PyPI
- Fix: client logs and raises carry ids, never a prospect's name or words (#2964)
- A3-D3 data plan, posts keep who drafted them and their day-7 reading (api #2969)
Release on GitHub · PyPI
- Fix: skipped rows, blocked sends and the comment cap in the api's words (#2922 QA r1 F4)
Release on GitHub · PyPI
- Fix: a draft-only workspace is told its draft is ready to launch, not to create one (#2928)
- New: one wording for an invitation and an acceptance (#2918)
Release on GitHub · PyPI
- Fix: Last Action says each code the api's way, and a LinkedIn pause reads in words in the logs (#2922)
- Fix: the QA report's print returns when the PDF is written and leaves no Chrome behind (#2889)
- S3, S4, S5, S7 plan (api #2928, #2929)
- a new production rule is two new files in heylead-api (#2919)
Release on GitHub · PyPI
- Fix: a QA report counts when Chrome wrote the PDF, even if Chrome crashes on exit (#2889)
- A3 spec amendment, internal agents may pool counts across workspaces (api #2879)
- A3-D5 internal agents plan with the verdict revisions (api #2879)
- the three QA roles told apart (api #2883)
- Fix: a PR parked because Vercel was late comes back when Vercel reports (#2875)
- polish: log published-count failures (#2794)
- New: hosted accounts read published-post counts from the API (#2794)
Release on GitHub · PyPI
- S8 campaign health plan (H1, H2) + the CSM spec and O0/O1 plan it builds on (api #2836)
- Fix: the click gate refuses every dashboard write, not a hand list of verbs (#2827)
- New: show_status and suggest_next_action say the CSM's next step (api #2736)
Release on GitHub · PyPI
- Fix: text a person typed reaches HubSpot notes and partner emails escaped (#2825)
- A3-D2 targeting plan with the verdict revisions (api #2815)
- Fix: a run starts through qa_report.py init, one live run per outcome (api #2819)
- Fix: the sweep skips an issue the api labelled case:resolved
Release on GitHub · PyPI
- A3-D1 revisions after the case verdicts (api #2797)
- A3-D1 implementation plan, the message writers read their past results (api #2793)
- A3, every agent reads its own domain's past results (api #2793)
- New: an ICP title matches when the person's title holds its words in order (#2737)
- Fix: a region list is not an identity (#2729)
- Fix: a LinkedIn link wrapper is never stored as a person's title (api #2723)
- A1-a plan corrected from execution review: refusals back off, observe keeps the outage contract (D4umak/heylead-api#2688)
- A1-a implementation plan, a model step that fails refuses (D4umak/heylead-api#2688)
- A1 guardrails evidence pack, 14 sites read at api 4233ec1ce (D4umak/heylead-api#2683)
Release on GitHub · PyPI
- Fix: an answer found on LinkedIn reads 'Answered outside HeyLead' (api #2364 QA F4)
- eval replay switched on; #2682 folded into A1 (D4umak/heylead-api#2673)
- the 10 Oct review of every declaration, and what it changed (D4umak/heylead-api#2673)
- the agentic framework spec records A0 as built (D4umak/heylead-api#2673)
- A0 implementation plan, every agent registered with its audit score
- every agent on the six blocks, and a product team on every task
- Fix: a day key reads the clock once (#2666)
- Fix: a claim binds hot files for 6 hours, not 48 (#2667)
- New: a push to a merged PR's branch is stopped before it is lost (heylead-api#2662)
- a case reads Shipped on a first-line prod-proof after the merge (heylead-api#2653)
- the SEO manager programme as built (D4umak/heylead-api#2613)
- SEO manager on an agent framework, design of 9 Oct 2026
Release on GitHub · PyPI
- Fix: the daily counter and per-account ledger add in one SQL statement (#2612)
- New: the plan names the email the owner gets when a held message waits (#2497)
Release on GitHub · PyPI
- a criterion names where it is measured before merge; small-change track; QA every state (heylead-api#2603)
- New: no greeting opener and no sign-off in any message language (#2560)
- Fix: the sign-in link says it needs the LinkedIn password (#2587)
- render before ship, a dashboard change is measured before its PR
- New: a campaign writes in the language its owner chose — client (#2560)
Release on GitHub · PyPI
- Fix: a held send's row names what became of its draft (api #2364)
Release on GitHub · PyPI
- Fix: 'completed' is stopped for good too — archive_campaign writes it (#2524)
Release on GitHub · PyPI
- Fix: an archived campaign gives back the people it never contacted; the no-fit reply names this campaign (#2524)
- the sweep takes a user's idea first and skips twice-abandoned and finished cases (#2464)
- Fix: the click gate reads 'Send check' as the agent's name, not a send (api #2401 QA r2)
- the token-free sweep takes over a claim older than 6 h
- Fix: the client never sends a reply claiming an invite it did not send (#2453)
Release on GitHub · PyPI
- Fix: a title that names the industry is evidence (api #2415)
Release on GitHub · PyPI
- Fix: a reply sent by chat id says 'Message sent.' when the api names nobody (api #2318)
- Fix: a hosted account's laptop changes nothing on LinkedIn (api #2318)
Release on GitHub · PyPI
- Fix: a failed check on a send path skips, never sends (api #2390)
Release on GitHub · PyPI
- Fix: one word of a campaign's own brief is not evidence (api #2371)
Release on GitHub · PyPI
- New: Free includes one connected account of either kind (api #2372)
Release on GitHub · PyPI
- New: Pro is priced per connected account, a LinkedIn seat or an email mailbox (api #2366)
Release on GitHub · PyPI
- Fix: a property investor is not a venture investor (api #2348)
Release on GitHub · PyPI
- Fix: auto-replies off is described as what it does; a held reply shows what they wrote (api #2330)
- New: hosted tools print the api's upgrade line after the first reply; quota refusals read one facts line (api #2328)
- after the first reply, the two upgrades with the user's own numbers (api #2328)
- Fix: run_weekly.sh sends weekly.py's output, tracebacks included, to the weekly log
- New: the weekly visibility panel runs as a Cloud Run job (api #2290)
Release on GitHub · PyPI
- Fix: an Offer card edit says when it happened, so the server keeps the newer copy (heylead-api#2256)
- Fix: name the invitee through sent_invitations, never the invitation id (api #2257)
- New: brand engagement is off until the user turns it on (api #2221)
- New: a fix PR names its production invariant (#2214)
- the case analyst reads the product-event ledger through the staff routes (#2212)
- New: an outcome names its events, and pr_gate refuses a code PR without ## Events (#2210)
- Fix: investor vocabulary only for a partner brief about investors (#2156)
- what an agent does without asking, and what still needs Denys (#2216)
- New: own-post likes and comments are behavioural signals, as on the api (heylead-api#2203)
Release on GitHub · PyPI
- Fix: client twin of #2171: the first DM after a note waits a day; rewrites see the thread
Release on GitHub · PyPI
- Fix: a search result LinkedIn does not name is never enrolled (D4umak/heylead-api#2164)
Release on GitHub · PyPI
- New: an investor ICP carries investor vocabulary (D4umak/heylead-api#2156)
- Fix: a line that quotes a person's text ends on a whole word, part 1 (#2136)
- Fix: a keyword that names a title is dropped through the shared title matcher
- Fix: a title alone is not a fit — a row needs industry or keyword evidence to clear the floor (#2149)
- Fix: a landed message is recognised whatever line breaks it got (#2142)
- Fix: a line that quotes a person's text ends on a whole word (#2136)
Release on GitHub · PyPI
- Fix: a prospect nobody has written to cannot be closed as won, and close needs an outcome (#2122)
- Fix: a contact's company stops where the headline's self-description begins (#2128)
- Fix: a hosted account never sends, plans, spawns or alerts from the laptop (#2120)
- Fix: a late or skipped run is flagged by the gap between runs (#2108)
- Fix: a failed engine or a missing week is said out loud (#2108)
- Fix: keep the guard's phrase out of the helper's comment
- Fix: strip the withdrawn AI sentence from past sent text before any prompt (heylead-api#1766)
Release on GitHub · PyPI
- Fix: a key or token left in the fallback secrets file is found when the keychain is in use, and moved into the keychain (#2061)
Release on GitHub · PyPI
- Fix: API keys and the login token now live in the OS keychain (or an owner-only file when there is none), never in the plaintext config file. Existing installs move them over on first start, and nothing is removed from the file until the keychain reads it back (#2061)
- New:
heylead config get <setting>, heylead api get /api/v1/... (keys masked), heylead secrets status, heylead secrets set <name> and heylead secrets clean (#2061)
- Fix: a locked or hung keychain never stops sending: one short wait, then the fallback for five minutes (#2061)
- Fix: the login token is only ever sent to heylead.dev (#2061)
Release on GitHub · PyPI
- New: every campaign carries an Offer card: what changes for the person you write to, in plain words, and one question. create_campaign writes it from your paste and shows it; launch confirms it; edit_campaign(offer_outcome=..., offer_ask=..., offer_confirm='on') edits and confirms it (#1993)
- New: first messages on a campaign wait until its Offer card is confirmed; invitations, replies and follow-ups keep going (#1993)
- Fix: a first message no longer says what you build, run or lead, and names no product the reader never used; replies may say it once (#1993)
- Fix: no tool message says HeyLead sends 24/7 (#2025)
Release on GitHub · PyPI
- Fix: stop listing X posting until it works (#1399)
- Fix: a skipped outreach carries a reason, never the bare word "skipped"
Release on GitHub · PyPI
- the copy gate allows 'works in ChatGPT' and 'works in claude.ai' as proven (#1123)
- Fix: the rest of the audit: no closes-deals, full quota lines, six goals in the plugin and create_campaign (#1399)
- Fix: every public file says what HeyLead is: no SDR workflow, no sales rep, no 24/7 (#1399)
- Fix: every OFFSET page sorts by a unique key, so pages never overlap (#1926)
Release on GitHub · PyPI
- Fix: every contact is exported, and statuses read as the dashboard says them (#1926)
Release on GitHub · PyPI
- Fix: the listing links terms, docs and support, and none ends in a full stop (#1514)
Release on GitHub · PyPI
- New: the listing carries an icon and a privacy policy URL (#1514)
Release on GitHub · PyPI
- Fix: a prospect's name links their profile, not the search card's tail (#1898)
- Fix: the waiting people are one list, and a match reads in plain words (#1863)
- Fix: sign-in names the server Claude Code lists, and warns against two HeyLead connections (#1514)
- Fix: no tool line is cut mid-word; a held reason reads whole (#1862)
Release on GitHub · PyPI
- Fix: the hosted status counts hot leads as the Overview tile does (#1831)
- Fix: a count and its noun agree; never '1 prospects' (#1894)
- Fix: every scripted QA click goes through a gate that refuses state changes (#1505)
- Fix: a first-event stamp is the event's time, never the write's
- Fix: a prospect file cannot plant a formula, blow up the reader or read a local file (#1685)
- Fix: seniority and function read as words, not codes
- the verdict sweep closes notes whose check ran, or can never run
- Fix: every CI job has room for a throttled runner, and a cancelled main is re-run
- Fix: the Invite step states a pace a user can plan by (client twin)
Release on GitHub · PyPI