Repository navigation
agenttalk 0.100.0
In short: closing a terminal window can no longer stop the gateway: its scheduled task now
starts Python without a console window, and gateway run writes its own messages to a log
file. Each machine that runs the gateway needs a one-time task update, with the steps in
"Closing a terminal window can no longer stop the gateway" below; the ledger, the price policy
and the spend checks are unchanged. Team members now look in the team's lessons once before
building, fixing or reviewing. Leads can release one finished worktree after merging
(agenttalk janitor --release). Team notes work before a domain registry is set up, scratch
cleanup checks its starting folders and their parents, a wrapped seat always replies under its
own name, and documentation-only pull requests can skip the long test queue.
Added
-
Team members now look in the lessons once before real work. Before building, fixing or
reviewing something, a member searches the team's lessons for one concrete word from the task
(for examplejunction), once, with one retry using another word only if the first search found nothing. The word goes last, after--, so a word that looks like an option is still read as the word. The search only reads; it
never touches the inbox. A member names a lesson in its reply only if the lesson changed what it
did, and keeps three cases apart: nothing found, the lookup failed (never written down as
"found nothing"), and read but not useful. A failed lookup never stops the work. The wrapped-turn
instructions, the listen skill (Claude and Codex copies) and the lead skill's brief guidance say
so, anddocs/ops/lessons-lookup.mdnames the rule, its start date and the seats that already
did this by habit, so the lessons-use trial can measure reported use under one fixed rule.
A search that reports a problem with the lesson store counts as incomplete, not as "found
nothing". A hit whose preview is cut off (it ends in...) is read in full, once, before it can
change a decision. For that read,agenttalk knowledge searchhas a new small option,--key
(with--domain), which returns exactly the lesson with that key, so other lessons that only
mention the key cannot push it out of the result. Several lessons are reported in one
comma-separated field. Wrapped members get the rule automatically after the wrapper is restarted on this
version. A member run by hand keeps its older installed skill file, because the installer
leaves a changed file alone: preview withagenttalk install-skills --no-devkit --dry-run,
back up local edits, refresh on purpose withagenttalk install-skills --no-devkit --force,
then start a new session.--no-devkitkeeps the update to the bus skills; without it the
installer would also overwrite the development skills, which sit in other folders. The steps
are in the policy page. -
Release one finished worktree after merging. Leads can use
agenttalk janitor --release <path>to remove a clean, unused checkout while
keeping its branch and commits. The command fetches the remote default branch
and refuses when exact ancestry, files, links or activity records cannot be
checked safely. Squash merges stay in place.--release-reportlists eligible
checkouts and sizes without deleting them; both lead skills now include it in
the daily routine. Hidden Git edits and ambiguous launch folders prevent release;
both supervisor state locations are checked. The guidance explains the need to
stop other users and the limits of deletion checks on each platform.
Stale file monitors cannot hide edits, nested repositories with capitalised
metadata names are kept, and unrelated older lane records no longer block release.
Bare repositories inside caches are kept too. Tracked files are compared by
content, so matching file sizes and times cannot hide unfinished edits. -
Permanent checks for mistakes that kept returning in usage readings (#301).
Contributors can now run a small set of checks across publication and display paths,
including deliberate faults that prove the checks detect a wrong account or an expired
figure. A new danger-area page names other fragile areas and their existing guards.
The checks include recorded events and the command and web displays. They also
document an open checkpoint problem (#408), whose fix remains separate.
This changes contributor checks and guidance, not runtime behavior. Nothing needs to
be changed in an existing team.
Changed
- Documentation-only pull requests can avoid the long test queue. Before
this, every PR push ran the full test matrix and the extra Windows timing
trial. Now changes to prose that tests do not use run the documentation and
safety checks, and the trial runs only after pushes to master. Documents used
by tests, including README and CHANGELOG, still take the full path. Code PRs
keep the full test matrix; master keeps every check. Contributors do not need
to change how they submit a PR. Technical details: the file rule and the
result reported bydev-gate aggregateare documented indocs/DEV-GATE.md.
Fixed
-
Closing a terminal window can no longer stop the gateway. The gateway's
Scheduled Task used to start Python in a console window. On 2026-10-08 a Windows
Terminal update closed its windows, the gateway ended with it, its automatic
restart did not bring it back, and the gateway stayed down for 16 hours.What you will notice: before this, the task started
python.exe, which opens a
console window. Now it startspythonw.exe, the same Python from the same folder
without a window, and LiteLLM starts without one too. With no window there is also
nowhere to print, sogateway runnow writes its own messages to a log file next to
the LiteLLM log, set up before the gateway code loads. Without that, an error message
would itself crash the run, and a failure while loading would leave no trace.
task-installrefuses, naming the folder, whenpythonw.exeis missing, and
task-install,gateway startandgateway statusall refuse or report a launcher
with no windowless twin, such aspython3.exe. A task installed before this change
shows up ingateway statusas out of date, with the steps to update it; status only
reports and changes nothing.gateway startandtask-installrefuse the old task
with the same steps.task-installnever overwrites a registered task: Task Scheduler
cannot replace a task only while it is still the one agenttalk checked, so you end and
remove the old task yourself.gateway stopaccepts the old and the new task from
eitherpython.exeorpythonw.exe.What you need to do: once, on each machine that runs the gateway, run
agenttalk gateway stop --timeout 30, thenschtasks /End /TN <task>andschtasks /Delete /TN <task> /F(the task namegateway statusshows), thenagenttalk gateway task-install, thenagenttalk gateway start, and checkagenttalk gateway status.
Run the agenttalk commands with the Python runtime that installed the task, after
updating agenttalk in it: the old task is recognised only in that runtime's folder. On
Linux nothing changes.Technical details:
src/agenttalk/ovh_gateway_service.py(windowless_task_identity
and_backend_identityfor the Windows backend only,_registered_with_consoleand
_task_update_stepsfor the refusals, the two-formstop_task,CREATE_NO_WINDOWfor
LiteLLM),
src/agenttalk/gateway_run_log.py(route_missing_output_to_log, called from
src/agenttalk/__main__.pyforgateway run); status reports the errors
task_console_launchandtask_launcher_unsupportedand the fieldtask_update; the
run log is%LOCALAPPDATA%\agenttalk-ovh\gateway\gateway.log. The ledger, the price policy,
the spend checks and the binding are unchanged. See "The task runs without a console
window" indocs/QWEN-OVH-TRIAL.md. -
Team notes work before a domain registry is set up. Pointers, gotchas,
seams and decisions can now use--domain processon a bus without
.agenttalk/domains.json, with the same review rules as process lessons.
Non-lesson notes still need an explicit domain. Buses with a registry keep
their existing rules and note format. Unknown-domain errors now list the
available domains and explain how to add one. -
Four wording fixes in the shipped documentation and the lead skills (#362, #363, #355,
#312). No behavior changed; the text now says what the code already does. The lead
skills' "check before an irreversible action" example now shows--gates, so a lead
following it word for word gets warned when a gate says HOLD instead of only when a
request was rescinded (#362). The README'sackrow now separates its two forms: without
--to-requestit moves a cursor, with--for <seat> --to-request <id>it closes that
request's thread for that seat (a work order, a review, a proposal or a question), records the closure permanently, and does not move the cursor (#363). The lead skills no
longer say a lead may never start a teammate; a lead can set up the team and start the
supervisor when asked, but still never starts a teammate's own assistant directly,
outside the supervisor or the wrapper (#355). And the gateway guide now states that its
amounts are in EUR excluding VAT (#312). The policy data itself carries no tax label yet,
so #312 stays open. -
A wrapped seat that follows its reply instructions now always replies under its own
name (#354, #178). The instructions the wrapper printed gaveagenttalk replywith no
--from, and the wrapper did not tell the seat's own process who it was. A seat whose
settings did not happen to carry its name could stop with "no agent identity" (the work then
looked unanswered and was handed out again), or answer through a fallback under another
seat's name.What you will notice: every
agenttalk replycommand in a seat's instructions now reads
agenttalk reply --from <seat> ..., and the wrapper setsAGENTTALK_SELFto the seat it
serves for Claude and Codex seats alike, replacing whatever the launching shell left there
(nothing, an empty value or another seat's name), so progress notes, "composing" markers, ordinary
sends and the quiet housekeeping turns also go out under the seat's own name. What you need to do: nothing. -
A review reply may name the commit it read when the task named none (#299). Before, such
a reply was refused with "reply work_head contradicts opener", the typed verdict was lost
and the task was closed without it. Now the commit is accepted and recorded. A task that
did name a commit still refuses a different one, and the refusal now says what to do: reply
with the pinned commit, leave it out, or ask the lead to resend the task for the commit you
read. The work board now takes the candidate commit from the reviewers' replies when the task
named none, so such a GO lands as a normal one instead of "candidate missing". It never
guesses: reviewers who name different commits make the item "unknown" until a replacement review that names one commit takes over (both old verdicts stay filed under the commits they reviewed), and a reply without a
commit next to one with a commit leaves the candidate unset; a reviewer's request for more information keeps the commit it named and counts in that agreement, but approves nothing. -
Scratch cleanup checks its starting folders and their parents (#399).
janitor --applykeeps the candidates and reportsFAILEDif a starting or parent folder
was replaced after the scan, became a link, or cannot be checked. A parent
that was already a link is refused too, including a linked profile folder.
This prevents a renamed parent from sending cleanup into another folder.
Cleanup also leaves the main checkout and worktrees outside its removal
candidates uncommitted. Worktrees holding ignored work beyond known caches,
including a message store or.env, are kept with a reason. A failed scan
or removal now returns a failure exit code for scheduled runs.
Paths containing..use the physical repository's sibling for default scratch.
doctorreports linked ancestors as "could not be listed or trusted";
this is an intentional cleanup refusal, not a doctor failure.
After installing this fix, cleanup can resume on paths with plain, unchanged
roots and parents while no other process is rearranging those folders; the existing
limitation on changes made during the delete itself still applies.