Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ remain historical snapshots. Beta does not mean error-free operation.

## [Unreleased]

## [0.20.1] — 2026-11-11

### Changed

- Make expressive Telegram activity show the current phase, code-styled known tool
identifiers, completed/failed counts and an explicit long-wait hint. The header
indicator uses the existing heartbeat and can be disabled with
`TALOS_STATUS_ANIMATION=0`. Approval waits stop cosmetic edits; fatal errors freeze
the existing card as Stopped. Reply receipts and pending worker semantics remain.

## [0.20.0] — 2026-11-11

### Stable release
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ preferences live in `USER.md`. All three are operator-owned prompt state and rel
|---|---|
| Gate path | `policy.py`, **996 lines** — has to stay readable in one sitting |
| Tools | **37**, every one gated |
| Suites | **3492** collected tests · **277** adversarial · 44 end-to-end |
| Suites | **3499** collected tests · **277** adversarial · 44 end-to-end |
| Home | <https://talos-agent.ch> · docs at `/docs/` |
| Repository | `talos-kernel/talos` is the public source tree |

Expand Down Expand Up @@ -321,7 +321,7 @@ repairs; corrections never replay an effect or grant permission. Keep those prop
```bash
python3 -m venv .venv && . .venv/bin/activate && pip install --require-hashes -r requirements.lock -r requirements-dev.lock

python -m pytest tests/ -q # 3492 collected tests; platform-specific skips are explicit
python -m pytest tests/ -q # 3499 collected tests; platform-specific skips are explicit
python redteam.py # 277 adversarial cases — mandatory for any kernel change
python e2e.py # 44 cases against a real model (costs tokens and time)
python -m talos --once # single cycle, for diagnosis
Expand Down
29 changes: 18 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
</p>

<p align="center">
<!-- ⚠️ Bewusst „tests“, nicht „passing“: die Zahl kommt aus dem Einsammeln (3492).
<!-- ⚠️ Bewusst „tests“, nicht „passing“: die Zahl kommt aus dem Einsammeln (3499).
Plattformabhaengige Sandbox- und Repository-Pruefungen koennen uebersprungen werden;
`test_site_claims` prueft deshalb die gesammelte Zahl statt ein Umgebungsresultat. -->
<img src="https://img.shields.io/badge/tests-3492-2e7d32.svg" alt="Tests">
<img src="https://img.shields.io/badge/tests-3499-2e7d32.svg" alt="Tests">
<img src="https://img.shields.io/badge/red%20team-277%2F277-2e7d32.svg" alt="Red team">
<img src="https://img.shields.io/badge/gate%20path-996%20lines-8a4318.svg" alt="Gate path">
<img src="https://img.shields.io/badge/tools-37%20gated-8a4318.svg" alt="Tools">
Expand All @@ -54,7 +54,7 @@ tools — but only after a deterministic permission kernel has ruled on the acti
Choose **Allow once**, **Allow this task**, or an exact-action standing approval;
you do not have to approve every step individually. Sandboxed shell execution and an
append-only audit trail keep actions bounded and reviewable. Talos is MIT-licensed;
model-provider and hosting costs depend on your setup. The **0.20.0 stable** release retains the frozen
model-provider and hosting costs depend on your setup. The **0.20.1 stable** release retains the frozen
[operator contract](docs/beta-contract.md). Stable is not a claim of error-free
operation or a substitute for reviewing permissions and keeping backups.

Expand All @@ -70,12 +70,13 @@ a handover, save and read back a local note, and compare release notes without i
missing facts. Already tried it? [Share your first-run result](https://github.com/talos-kernel/Talos/issues/new?template=first_run.yml),
including installation blockers. No star or positive review required.

**Latest signed release — [0.20.0](https://github.com/talos-kernel/Talos/releases/tag/v0.20.0):**
this stable release carries forward the qualified RC.3 runtime: safe agent migration,
Talos Connections and labelled scheduled results, including the pypdf 6.21.4
security fix. The operator contract and permissions remain unchanged.
**Latest signed release — [0.20.1](https://github.com/talos-kernel/Talos/releases/tag/v0.20.1):**
this stable update adds clearer Telegram live activity: phase headings, code-styled
tool identifiers, measured outcomes and a quiet optional indicator. It retains safe
agent migration, Talos Connections and labelled scheduled results. The operator
contract, permissions and dependency locks remain unchanged.

**Included in 0.20.0:** migration from Hermes or
**Included in 0.20.1:** migration from Hermes or
OpenClaw can now fingerprint and apply an exact redacted plan into inactive staging,
archive that staging for recovery, and activate one validated imported skill at a time.
[Talos Connections](docs/connections.md) adds secret-free disabled connector drafts and
Expand All @@ -94,7 +95,7 @@ See the
**Source versus release:** `main` can contain newer changes. Signed installers and
package managers follow their pinned release; older archives remain immutable.

0.20.0 includes the Beta.8 pip 26.2.2 hash lock and isolates pip from per-user
0.20.1 includes the Beta.8 pip 26.2.2 hash lock and isolates pip from per-user
configuration. When upgrading from Beta.7 or older with custom pip settings, use
`PIP_CONFIG_FILE=/dev/null talos update` once; those older updaters still inherit pip
configuration.
Expand All @@ -107,7 +108,7 @@ configuration.
- **Inspect the evidence:** review tool outcomes and the audit trail; do not mistake a confident answer for a successful action.

Start with the [model, cost and permission FAQ](https://talos-agent.ch/faq/).
Talos is not Talos Linux or Cisco Talos. It is a self-hosted AI agent, with a stable 0.20.0 release.
Talos is not Talos Linux or Cisco Talos. It is a self-hosted AI agent, with a stable 0.20.1 release.
If this approach is useful, **star the repository to bookmark it**, try a small task and
[report a reproducible result](https://github.com/talos-kernel/Talos/issues).
Want to improve it? [Fork Talos](https://github.com/talos-kernel/Talos/fork) and read
Expand Down Expand Up @@ -330,6 +331,12 @@ compact labelled rows. Approval prompts keep the exact command visible.
`/stop` interrupts the run and `/log` opens its receipts. A finished conversation
does not imply that a delegated background job has finished.

Version 0.20.1 adds phase-specific headings, code-styled tool identifiers and
separate completed/failed counts to the expressive card. A quiet activity indicator
uses the existing five-second heartbeat; `TALOS_STATUS_ANIMATION=0` disables it.
Approval waits stay still, and a long wait is labelled without inventing progress
or an ETA. Tool arguments and full commands remain confined to approval prompts.

Operator-defined OpenAI-compatible endpoints can be listed in the JSON file named by
`TALOS_CUSTOM_PROVIDERS` (default: `data/custom-providers.json`). Each entry needs
`name`, `base_url` and `models`; optional `env_key` names that endpoint's own key.
Expand Down Expand Up @@ -423,7 +430,7 @@ come from `stdin` instead of `getUpdates`.
```
$ talos chat

◉ Talos / 0.20.0
◉ Talos / 0.20.1
Your terminal. Your rules.
──────────────────────────────────────────────────────────────────────────
model claude-cli/claude-opus-4-1
Expand Down
4 changes: 2 additions & 2 deletions assets/demo/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ DEMO_PROVIDER=claude-cli DEMO_MODEL=… assets/demo/build_gif.sh
```

`../talos-telegram-demo.gif` shows the same control model in Telegram: the live
work trail, an approval card, a reply-only receipt that names a pending worker,
work trail with phase headings, code identifiers and wait feedback, an approval card, a reply-only receipt that names a pending worker,
the worker result arriving separately, and a scheduled run arriving as its own
labelled notification. Rebuild it with:

Expand Down Expand Up @@ -50,6 +50,6 @@ pauses over two seconds are capped, so model latency does not inflate the GIF.

**Provenance of the shipped GIFs:** the terminal recording was rebuilt 2026-11-04
from Talos 0.20.0-rc.2 with `ollama/qwen3.8:latest` (local, no account). The
Telegram animation was generated the same day from the current source UI strings;
Telegram animation was regenerated 2026-11-11 for the 0.20.1 activity update;
its transport is intentionally offline and synthetic. Rebuild either asset with
the commands above.
43 changes: 27 additions & 16 deletions assets/demo/build_telegram_gif.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def plain(text: str) -> str:
return html.unescape(re.sub(r"<[^>]+>", "", text))


def talos_states() -> tuple[str, str, str, str, str]:
def talos_states() -> tuple[str, ...]:
client = DemoClient()
activity = TelegramActivity(
client,
Expand All @@ -109,16 +109,22 @@ def talos_states() -> tuple[str, str, str, str, str]:
activity.progress(progress("read_file", "running", step=2, summary="read — notes.md"))
client.now[0] = 3
reading = plain(client.messages[client.sent_order[0]])
client.now[0] = 5
activity.tick()
heartbeat = plain(client.messages[client.sent_order[0]])
client.now[0] = 35
activity.tick()
waiting = plain(client.messages[client.sent_order[0]])
activity.progress(progress("read_file", "done", step=2))
activity.progress(
progress("write_file", "running", step=3, summary="write — summary.md")
)
client.now[0] = 7
client.now[0] = 37
activity.progress(progress("write_file", "needs_human", step=3))
approval = plain(client.messages[client.sent_order[0]])
activity.progress(progress("write_file", "done", step=3))
activity.progress(progress("delegate_codex", "running", step=4))
client.now[0] = 15
client.now[0] = 45
activity.progress(progress("delegate_codex", "done", step=4))
activity.succeed()
trail = plain(client.messages[client.sent_order[0]])
Expand All @@ -132,7 +138,7 @@ def talos_states() -> tuple[str, str, str, str, str]:
scheduled = ScheduledRun("41c226d2", "Daily project status").wrap(
"The project is healthy. The dependency scan found no known vulnerabilities."
)
return reading, approval, trail + "\n\n" + receipt, worker, scheduled
return reading, heartbeat, waiting, approval, trail, receipt, worker, scheduled


def font(size: int) -> ImageFont.FreeTypeFont:
Expand Down Expand Up @@ -220,14 +226,16 @@ def frame(messages: list[tuple[str, bool]], *, approval: bool = False,
if approval:
y = buttons(draw, y, selected=selected)
draw.rectangle((0, HEIGHT - 72, WIDTH, HEIGHT), fill="#17212b")
draw.text((26, HEIGHT - 55), caption, font=SMALL, fill="#9fb3c8")
draw.text((WIDTH - 26, HEIGHT - 55), "simulated transport · real Talos text",
if y > HEIGHT - 84:
raise RuntimeError(f"Demo frame overflows: {caption}")
draw.text((26, HEIGHT - 65), caption, font=SMALL, fill="#9fb3c8")
draw.text((WIDTH - 26, HEIGHT - 32), "simulated transport · real Talos text",
font=SMALL, fill="#6e8296", anchor="ra")
return image


def main() -> None:
reading, approval_text, finished, worker, scheduled = talos_states()
reading, heartbeat, waiting, approval_text, trail, receipt, worker, scheduled = talos_states()
user = "Summarise notes.md, save the result, then have a worker verify it."
approval_card = (
"Approval required\nwrite_file · workspace/summary.md\n"
Expand All @@ -236,18 +244,21 @@ def main() -> None:
frames = [
frame([(user, True)], caption="1 · request received"),
frame([(user, True), (reading, False)], caption="2 · live measured work trail"),
frame([(user, True), (approval_text, False), (approval_card, False)],
approval=True, caption="3 · protected action waits for the operator"),
frame([(user, True), (approval_text, False), (approval_card, False)],
approval=True, selected=True, caption="4 · task-scoped approval selected"),
frame([(user, True), (heartbeat, False)], caption="3 · one card, current phase"),
frame([(waiting, False)], caption="4 · elapsed time is not progress"),
frame([(approval_text, False), (approval_card, False)],
approval=True, caption="5 · approval pauses the indicator"),
frame([(approval_text, False), (approval_card, False)],
approval=True, selected=True, caption="6 · task-scoped approval selected"),
frame([(trail, False)], caption="7 · completed work remains visible"),
frame([("Saved the summary. The verification worker is still running.", False),
(finished, False)], caption="5 · reply receipt separates pending work"),
frame([(finished, False), (worker, False)],
caption="6 · the background result arrives separately"),
(receipt, False)], caption="8 · reply and pending work are separate"),
frame([(receipt, False), (worker, False)],
caption="9 · the worker result follows separately"),
frame([(scheduled, False)],
caption="7 · a scheduled result is one labelled notification"),
caption="10 · scheduled results keep their own label"),
]
durations = [1400, 1800, 2200, 1100, 2600, 2800, 3200]
durations = [1400, 1800, 1800, 2400, 2200, 1100, 2200, 2600, 2800, 3200]
frames[0].save(
OUT,
save_all=True,
Expand Down
Binary file modified assets/talos-telegram-demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 11 additions & 1 deletion docs/stable-readiness.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,4 +95,14 @@ installation or restart its service.
| `0.20.0-rc.1` | Published, superseded candidate | Original signed assets remain available. Its observation days do not qualify RC.3. |
| `0.20.0-rc.2` | Published, superseded candidate | Original signed security release remains available. |
| `0.20.0-rc.3` | Published upgrade baseline | Signed candidate, with seven deployed daily records dated 5–11 November 2026. Transient channel/provider errors were reviewed; no unresolved security or data-loss regression was identified. |
| `0.20.0` | Stable source | Release publication requires the final-artifact gates above; matching signed assets and hosted CI establish delivery. No new runtime feature is included. |
| `0.20.0` | Published stable baseline | Signed artifacts and [main CI](https://github.com/talos-kernel/Talos/actions/runs/42986282432) qualify the first stable release. Seven RC.3 calendar dates and final-artifact install/upgrade/rollback checks passed. |


## Subsequent stable update: 0.20.1

Version 0.20.1 adds the separately qualified Telegram activity update after the first
stable release. It retains the operator contract, permissions and dependency locks.
Qualify its exact source and signed bytes with the source, platform, real-model,
installation/recovery and delivery gates above. Use `--previous 0.20.0 --current
0.20.1`; do not relabel the historical RC.3 observations as observations of this update.
Publication is established by matching signed assets and CI, not this source label.
10 changes: 5 additions & 5 deletions site/console.html
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@

<header class="hero" id="top">
<div class="wrap">
<p class="sys">talos 0.20.0 · operator console · MIT</p>
<p class="sys">talos 0.20.1 · operator console · MIT</p>
<span class="rec-chip">recorded · unfurled · no live wire</span>
<h1 id="main-content" tabindex="-1">Witness one deed from door to ledger.</h1>
<p class="lede">This hall unfurls one true session, recorded on the working machine
Expand All @@ -378,7 +378,7 @@ <h1 id="main-content" tabindex="-1">Witness one deed from door to ledger.</h1>
<a class="btn ghost" href="#measured">This candidate, measured</a>
</div>
<div class="meter-row">
<span><b>3492</b>automated tests</span>
<span><b>3499</b>automated tests</span>
<span><b>277/277</b>adversarial</span>
<span><b>996</b>lines · gate</span>
<span><b>37</b>gated tools</span>
Expand Down Expand Up @@ -553,12 +553,12 @@ <h2 class="rv">Numbers this candidate must ship.</h2>
embedded below. Either way the digits come from a count, not from memory.</p>

<div class="stats" id="releaseStats">
<div class="stat rv"><div class="n" data-f="version">0.20.0</div><div class="l">stable release</div><div class="sub-l" data-f="installer_version">public installer v0.20.0</div></div>
<div class="stat rv"><div class="n" data-f="tests">3492</div><div class="l">automated tests, collected by pytest</div></div>
<div class="stat rv"><div class="n" data-f="version">0.20.1</div><div class="l">stable release</div><div class="sub-l" data-f="installer_version">public installer v0.20.1</div></div>
<div class="stat rv"><div class="n" data-f="tests">3499</div><div class="l">automated tests, collected by pytest</div></div>
<div class="stat rv"><div class="n" data-f="redteam_faelle">277</div><div class="l">adversarial cases, all behaving</div></div>
<div class="stat rv"><div class="n" data-f="kernel_zeilen">996</div><div class="l">lines in policy.py, readable in one sitting</div></div>
<div class="stat rv"><div class="n" data-f="werkzeuge">37</div><div class="l">tools, every one through the gate</div></div>
<div class="stat rv"><div class="n" data-f="release_ref">v0.20.0</div><div class="l">release tag</div></div>
<div class="stat rv"><div class="n" data-f="release_ref">v0.20.1</div><div class="l">release tag</div></div>
</div>

<div class="measure-note rv">
Expand Down
12 changes: 6 additions & 6 deletions site/docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ <h1 id="main-content" tabindex="-1">Talos AI agent: the field manual</h1>
<p class="lede">That one decision shapes the rest of this manual. It is why the
command list is short, and why a few obvious conveniences are missing on purpose.</p>
<div class="spec-row">
<div class="spec"><b>3492</b>automated tests</div>
<div class="spec"><b>3499</b>automated tests</div>
<div class="spec"><b>277/277</b>adversarial</div>
<div class="spec"><b>996</b>gate lines</div>
<div class="spec"><b>37</b>gated tools</div>
Expand Down Expand Up @@ -378,10 +378,10 @@ <h2><span class="n">Section 03</span>Give it a mind</h2>
</section>

<section id="migration" class="rv">
<h2><span class="n">0.20.0</span>Move from Hermes or OpenClaw</h2>
<h2><span class="n">0.20.1</span>Move from Hermes or OpenClaw</h2>
<div class="note warn">
<b>Included in the signed 0.20.0 installer</b>
<p>Upgrade to 0.20.0 to use these commands. Preview the fingerprinted plan before
<b>Included in the signed 0.20.1 installer</b>
<p>Upgrade to 0.20.1 to use these commands. Preview the fingerprinted plan before
applying it; staged content grants no permissions.</p>
</div>
<p>Preview first. Talos inventories only portable profile text, memory documents
Expand Down Expand Up @@ -436,7 +436,7 @@ <h2><span class="n">Section 04</span>Run it</h2>
<section id="session" class="rv">
<h2><span class="n">Section 05</span>The terminal session</h2>
<pre>$ talos chat
Talos 0.20.0 · anthropic-api/claude-opus-4-8 · autonomy 3
Talos 0.20.1 · anthropic-api/claude-opus-4-8 · autonomy 3
speaking as cli:1000 · approvals possible · you are at a terminal
/help for commands, `exit` to leave

Expand Down Expand Up @@ -688,7 +688,7 @@ <h2><span class="n">Section 11</span>Channels</h2>
<div class="tw"><table>
<thead><tr><th>Channel</th><th>Trust</th><th>Notes</th></tr></thead>
<tbody>
<tr><td>telegram</td><td class="d">FULL</td><td class="d">Buttons for approvals, live status, images in.</td></tr>
<tr><td>telegram</td><td class="d">FULL</td><td class="d">Approval buttons, phase headings, tool outcomes and images. Set TALOS_STATUS_STYLE=expressive for the live work card; TALOS_STATUS_ANIMATION=0 disables its indicator.</td></tr>
<tr><td>cli</td><td class="d">FULL</td><td class="d"><code>chat</code> and <code>ask</code>. Approvals only at a terminal.</td></tr>
<tr><td>mail</td><td class="d">ASK</td><td class="d">Sender proven from the receiving server's <code>Authentication-Results</code>, fail-closed.</td></tr>
<tr><td>whatsapp</td><td class="d">FULL · NOTIFY</td><td class="d">Broker over SSH pull (FULL) · or Cloud API, outbound only (NOTIFY).</td></tr>
Expand Down
Loading
Loading