Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
2bdc4bd
fix(agent): the capability table reads the picture switch the loop re…
xfng-sd Sep 17, 2026
3b35e7d
ci(*): charge the idle ceiling for waiting, not for queueing behind a…
0xKT Sep 17, 2026
4b39022
fix(*): ask Windows whether a pid is alive instead of terminating it …
xfng-sd Sep 17, 2026
b58cda3
fix(*): pin line endings to lf so windows checkouts pass the byte gat…
xfng-sd Sep 17, 2026
453e259
fix(skill_hub): a hub skill is removable whichever installer put it t…
Handsome-wzw Sep 17, 2026
c91f76b
fix(session): let every surface find a transcript filed under another…
LivXue Sep 17, 2026
de3870a
feat(installer): the installers end on a running page and rebuild wha…
KevinHuSh Sep 17, 2026
b01534d
feat(*): add trajectory regression scaffold and CI gate (#471)
forrestjgq Sep 18, 2026
f7b2a62
docs: refresh bilingual readmes and agent benchmark figures (#480)
LivXue Sep 18, 2026
869ad78
refactor(agent): read the charter and the window's shrinking through …
ypflll Sep 18, 2026
0859633
docs: sync bilingual README overview (#486)
LivXue Sep 18, 2026
ee9baee
fix(*): close the embedding pin's upgrade paths and its reporting (#453)
gloryfromca Sep 18, 2026
0bcc761
fix(everos-memory): give a recalled case the approach it was solved w…
gloryfromca Sep 18, 2026
c65c205
docs: sync bilingual benchmark copy (#487)
LivXue Sep 18, 2026
ef6afc5
fix(gateway): give a channel started while running its inbound dispat…
Handsome-wzw Sep 18, 2026
6d8c363
refactor(*): let a sub-agent write a conduct instead of six hook phas…
ypflll Sep 18, 2026
210e297
feat(*): dead-end predicates, verbatim tool bodies and envelope failu…
ZuyiZhou Sep 18, 2026
5c5ca25
fix(context_engine): the identity line names the model the turn reach…
Handsome-wzw Sep 18, 2026
027637b
docs: refresh AI4AI benchmark chart (#498)
LivXue Sep 18, 2026
f633127
fix(raven-code): serve the skill route its menu advertises, and remem…
TongLi31 Sep 18, 2026
45203a4
chore: add codeowners entry for raven/agent (#504)
LivXue Sep 18, 2026
c2c5f27
docs: refresh the README hero banner (#508)
LivXue Sep 18, 2026
3dd06f6
feat(docs): add a bilingual documentation site and its deploy pipelin…
LivXue Sep 19, 2026
1d80cd4
docs: state the evolver relationship the architecture section already…
ZuyiZhou Sep 19, 2026
63ab3f4
fix(agent): keep one cause one streak class in the media envelopes (#…
ZuyiZhou Sep 19, 2026
242489d
fix(*): retire every generation's skill watcher before the process ex…
LivXue Sep 19, 2026
4ae4f80
fix(*): the deck lane draws its own pages, and a dropped stream is as…
Tchen-data Sep 19, 2026
32e612d
feat(cli): full conversation preview in the trajectory browser (#510)
forrestjgq Sep 19, 2026
f10ac9f
fix(docs): give each language its own search index and settle the sit…
LivXue Sep 19, 2026
0eb8b41
fix(config): let a borrowed address follow the lender it came from (#…
gloryfromca Sep 19, 2026
b4b0604
docs: add a showcase of six real multi-agent runs (#517)
ZuyiZhou Sep 19, 2026
15cadbd
fix(docs): make the Chinese pages searchable by word (#518)
LivXue Sep 19, 2026
7ab685f
docs(*): send the README's reference sections to the documentation si…
LivXue Sep 19, 2026
900fa38
docs: use the annotated sweep chart in the showcase (#520)
ZuyiZhou Sep 19, 2026
3837fa3
fix(docs): seat the search dialog's clear button on its own centre li…
LivXue Sep 20, 2026
04eb8a3
docs: refresh the README banner (#522)
LivXue Sep 20, 2026
908666d
fix(*): let the web settings timezone control write, and drop the ret…
LivXue Sep 20, 2026
dbe259f
refactor(*): close out the participant contract the five plugins now …
ypflll Sep 20, 2026
a98c941
feat(ui-web): redraw the raven mark the browser tab and the processor…
LivXue Sep 20, 2026
9eb8d58
docs: restyle the README agent sections and add an ecosystem banner (…
LivXue Sep 20, 2026
7faa206
feat(*): raven speaks Agent2Agent 1.0, inbound and outbound (#446)
LivXue Sep 20, 2026
b91abe5
ci(*): keep commit lint off the default branch's history (#531)
gloryfromca Sep 20, 2026
82a51d8
fix(agents): give raven-research the output cap the other lanes have …
ZuyiZhou Sep 20, 2026
e52d1f6
feat(raven-oncall): let the on-call instance add the machine the owne…
silverLXT Sep 20, 2026
0464aa1
docs: refresh the readme overview workflow figures (#546)
LivXue Sep 20, 2026
8d74fb9
docs: add the design-engine runs to the showcase (#547)
ZuyiZhou Sep 20, 2026
76d9d04
refactor(agent): ask a role once with the turn's whole roster (#532)
ypflll Sep 20, 2026
064f8c2
docs: open the showcase with a game run and give the zh readme the se…
LivXue Sep 20, 2026
e708f34
docs: align bilingual documentation with runtime behavior (#551)
userName20260323 Sep 20, 2026
d0ff0ba
feat(*): raise the attachment upload ceiling to 100 MB (#549)
arelchan Sep 20, 2026
c50a1ae
docs: rebuild the showcase layout and refresh the comparison board (#…
ZuyiZhou Sep 20, 2026
0cb8b79
fix(raven-oncall): a campaign bills only its own jobs under a shared …
silverLXT Sep 20, 2026
db7862a
feat(*): a conversation starts in a folder of your choosing, and the …
Handsome-wzw Sep 21, 2026
2f9eeec
docs: add webui screenshots to the launch webui section (#576)
LivXue Sep 21, 2026
72ee555
fix: restore missing overview card icons
userName20260323 Sep 21, 2026
87c7033
docs: round the corners of the webui screenshots and float them (#582)
LivXue Sep 21, 2026
f9db625
docs: refresh the visual design figure with the updated opus-5 scores…
LivXue Sep 21, 2026
a26f5f4
fix(config): keep skill block from writing a second skillForge key (#…
LivXue Sep 21, 2026
317921d
fix(agent): expand shell variables before the workspace fence scans (…
LivXue Sep 21, 2026
2bc761b
fix(*): tell a handed-over memory write from a lost one at shutdown (…
LivXue Sep 21, 2026
b8f6472
docs: replace the sweep chart with the run's dashboard (#579)
ZuyiZhou Sep 21, 2026
96be992
fix(ppt-engine): deliver the deck alone, with no pdf copy beside it (…
Tchen-data Sep 21, 2026
c5d5405
fix(cli): fall back to an os-assigned control-plane port (#454)
LivXue Sep 21, 2026
0ae6880
fix(*): send thought tokens as one frame and name what failed a turn …
ZuyiZhou Sep 21, 2026
cf3c95f
fix(*): stop the connect button promising what it cannot do (#554)
LivXue Sep 21, 2026
010ca4b
fix(*): probe raven web before launch and install plugins from the re…
gloryfromca Sep 21, 2026
2d21c7d
feat(*): open the deck engine route on an attached template, not on a…
Tchen-data Sep 21, 2026
e19b8e0
Merge commit 'dbe259f6' into chore/catch_up_main_20260921
0xKT Sep 21, 2026
350bd5a
fix(*): keep a sub-agent's result when it lands during shutdown (#528)
ZuyiZhou Sep 21, 2026
6ebc2ba
docs: retitle the showcase entries and add two simulation runs (#592)
LivXue Sep 21, 2026
0f8eca3
Merge remote-tracking branch 'origin/main' into chore/catch_up_main_2…
0xKT Sep 21, 2026
1365816
Merge remote-tracking branch 'origin/main' into chore/catch_up_main_2…
0xKT Sep 21, 2026
403ee27
fix(*): name a refused agent in the sheet too, and drop the folder ch…
0xKT Sep 21, 2026
45d90a2
Merge remote-tracking branch 'origin/main' into chore/catch_up_main_2…
0xKT Sep 21, 2026
1e8d925
Merge remote-tracking branch 'origin/refactor/ui_web_architecture' in…
0xKT Sep 21, 2026
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
66 changes: 66 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,72 @@ jobs:
if-no-files-found: ignore
retention-days: 14

installer:
name: installer (${{ matrix.os }}) against the latest release
# The two installers are served from main and install the latest published
# release, so a script that reaches for something that release does not have
# breaks every one-line install the moment it merges -- which is how an
# ending on `raven web` shipped against a wheel that had no `web`. This job
# runs exactly that combination, piped the way users run it so remote mode
# is what gets exercised, and asks the installed raven to answer. Only PRs
# that touch an installer pay for it; every push to main runs it.
runs-on: ${{ matrix.os }}
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Decide whether an installer changed
id: changed
shell: bash
run: |
if [ "${{ github.event_name }}" != "pull_request" ]; then
echo "run=true" >> "$GITHUB_OUTPUT"
elif git diff --name-only "origin/${{ github.base_ref }}...HEAD" -- install.sh install.ps1 | grep -q .; then
echo "run=true" >> "$GITHUB_OUTPUT"
else
echo "run=false" >> "$GITHUB_OUTPUT"
fi

# Node 22 up front: the script would otherwise fetch a private runtime,
# which is its business to get right but not what this job measures.
- uses: actions/setup-node@v6
if: steps.changed.outputs.run == 'true'
with:
node-version: "22"

- name: Install the latest release with install.sh, piped
if: steps.changed.outputs.run == 'true' && runner.os != 'Windows'
env:
RAVEN_MINIMAL: "1"
RAVEN_NO_LAUNCH: "1"
UV_TOOL_DIR: ${{ runner.temp }}/tools
UV_TOOL_BIN_DIR: ${{ runner.temp }}/bin
UV_CACHE_DIR: ${{ runner.temp }}/cache
RAVEN_HOME: ${{ runner.temp }}/home
run: |
cat install.sh | sh
"$UV_TOOL_BIN_DIR/raven" --version

- name: Install the latest release with install.ps1, piped
if: steps.changed.outputs.run == 'true' && runner.os == 'Windows'
shell: pwsh
env:
RAVEN_MINIMAL: "1"
RAVEN_NO_LAUNCH: "1"
UV_TOOL_DIR: ${{ runner.temp }}\tools
UV_TOOL_BIN_DIR: ${{ runner.temp }}\bin
UV_CACHE_DIR: ${{ runner.temp }}\cache
RAVEN_HOME: ${{ runner.temp }}\home
run: |
Get-Content install.ps1 -Raw | Invoke-Expression
& "$env:UV_TOOL_BIN_DIR\raven.exe" --version

windows-upgrade:
name: Windows self-upgrade
runs-on: windows-latest
Expand Down
54 changes: 53 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,58 @@ jobs:
- name: Export locked constraints
run: uv export --locked --all-extras --no-hashes --no-emit-workspace -o dist/raven-constraints.txt

# 4c) The plugin list: the wheels this release ships beside raven, one
# `name @ url` line each. The upgrade helper (and, once it reads it,
# the installer) takes this file from the release directory next to
# the wheel and the constraints and hands it to `uv tool install
# --with-requirements`, so what a complete install is made of is
# written here once, from what this job just built, and nowhere
# else. Direct URLs on purpose: a bare name would be resolved against
# PyPI, where none of these names are ours. The everos line is what
# the helper keeps when the engines cannot build, so its name is a
# contract (tests/test_release_plugin_list.py).
- name: Write the plugin list
run: |
base="https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}"
: > dist/raven-plugins.txt
for whl in dist/everos_memory-*.whl dist/design_engine-*.whl dist/ppt_engine-*.whl; do
[ -f "$whl" ] || { echo "no wheel matches $whl"; exit 1; }
name="$(basename "$whl" | cut -d- -f1 | tr _ -)"
echo "$name @ $base/$(basename "$whl")" >> dist/raven-plugins.txt
done
cat dist/raven-plugins.txt
test "$(wc -l < dist/raven-plugins.txt)" -eq 3

# 4d) The release installs itself before anything is published: the wheel,
# the constraints, the plugin list and the plugin wheels as one whole,
# through install.sh piped the way users run it. The list's public URLs
# resolve only once a human publishes the draft, so the gate installs
# from a copy of the list rewritten to point at the release directory
# here; the rewrite only matches the exact public prefix, so a list
# that named any other place fails the grep below. Then the installed
# raven has to answer, carry the three plugin packages, and have the
# `web` the installer ends on.
- name: Install the release from dist with install.sh
env:
RAVEN_MINIMAL: "1"
RAVEN_NO_LAUNCH: "1"
UV_TOOL_DIR: ${{ runner.temp }}/gate/tools
UV_TOOL_BIN_DIR: ${{ runner.temp }}/gate/bin
UV_CACHE_DIR: ${{ runner.temp }}/gate/cache
RAVEN_HOME: ${{ runner.temp }}/gate/home
run: |
gate="$RUNNER_TEMP/gate/release"
mkdir -p "$gate"
cp dist/*.whl dist/raven-constraints.txt "$gate/"
prefix="https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/"
sed "s#$prefix#file://$gate/#" dist/raven-plugins.txt > "$gate/raven-plugins.txt"
if grep -q "https://" "$gate/raven-plugins.txt"; then echo "plugin list names a URL outside this release"; exit 1; fi
wheel="$(ls dist/raven-*-py3-none-any.whl)"
RAVEN_WHEEL_URL="file://$gate/$(basename "$wheel")" sh -c 'cat install.sh | sh'
"$UV_TOOL_BIN_DIR/raven" --version
"$UV_TOOL_DIR/raven/bin/python" -c "import raven_everos, raven_design, raven_ppt"
"$UV_TOOL_BIN_DIR/raven" web --help >/dev/null

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
Expand Down Expand Up @@ -192,7 +244,7 @@ jobs:
id=""
fi
if [ -z "$id" ]; then
draft_url=$(gh release create "$tag" dist/*.whl dist/*.tar.gz dist/raven-constraints.txt \
draft_url=$(gh release create "$tag" dist/*.whl dist/*.tar.gz dist/raven-constraints.txt dist/raven-plugins.txt \
--title "Raven $ver ($today)" --notes-file "$RUNNER_TEMP/notes.md" --draft $pre)
# A draft lives at releases/tag/untagged-<hash> and keeps serving that
# stale page after publication, with no redirect to the real tag. Print
Expand Down
41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,47 @@ All notable changes to Raven are documented here.

### Fixed

- A sub-agent that finishes while the host is shutting down no longer loses its
result. Its announce submits a turn to a scheduler that is already draining;
the refusal escaped the announcing task, and the only trace was asyncio's
"Task exception was never retrieved" in the log. The undelivered text now
goes to the log in full, with the conversation it was for, and `raven serve`,
the TUI and the gateway's page cancel their sub-agents before sealing the
spine, the order the gateway's own spine already kept. A spawn or
`run_subagent_dag` that arrives once shutdown has begun is refused with a
message that says so, in both DAG modes, rather than started into a process
about to exit -- or, for a blocking DAG call, parked through the shutdown
grace.

- Raven serving ACP sends a run of thought tokens as one
`agent_thought_chunk` instead of one frame per token: consecutive thought
chunks of a session are held for 200ms or 512 characters and go out
together, ahead of anything that has to follow them (a chunk of the
answer, a tool call, the turn's end). One design run wrote 58,675 thought
frames averaging under six characters; each frame is a blocking write on
the client's pipe, and a client that stopped reading held the server on
that write. The same stream replays to 4,333 frames. The first thought
token of a turn therefore reaches an ACP client up to 200ms later than
before; the answer's own chunks are not held.

- A failed turn names what failed. The failure event carried only
`str(exc)`, which is empty for the bare `TimeoutError` a stalled model
stream raises, so an ACP client was told `turn_failed (code -32099)` and
nothing else and the parent of a sub-agent read that as a crash of the
tool call it saw last. The event now carries the exception's class and
message (`ValueError: boom`, `TimeoutError`), and the per-chunk idle
stall raises `StreamIdleTimeoutError`, a `TimeoutError` whose message
says how long the stream was silent and which bound decided it.

- An on-call campaign bills only its own runs. Campaigns of one task usually
keep their rounds in one `remote_dir`, and the spend measure walked that
directory's `jobs/`, so a later campaign was charged for every earlier one's
runs the moment it started: a second-round campaign with a 130-minute budget
read 125.6 spent on its first look, 34.6 of it its own, and stopped with 142
real minutes unspent. The backend now counts the jobs in the campaign's own
ledger (plus what it submitted itself), and `ops_declare` refuses a
`remote_dir` a live sibling campaign is still writing rounds into.

- The web file viewer opens a sub-agent's report again. `/file` anchored the
state-directory fence on the session's working directory whenever the page
named a session, so the fence exempted `~/.raven/tmp/<channel>` and refused
Expand Down
8 changes: 6 additions & 2 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -372,8 +372,12 @@ lines and the entry itself, and any other answer keeps the task on the entry. A
targets (readiness kind `route`): a missing, unready or switched-off target disables the row
with the reason on it. A route is admitted the way everything else at a boundary is
(**Admission**): it declares what its target's pipeline spends (`needs`, from the closed
`ROUTE_REQUIREMENTS` vocabulary) and the lowest tier it may open at (`minTier`), and the
entry checks only what was declared -- a route declaring neither is dispatched as routes
`ROUTE_REQUIREMENTS` vocabulary), a file the dispatch must hand over for the target to have
anything to build on (`needsFile`, a suffix; read off the files the user attached -- a direct
chat's media, or an attachment of the turn that the spawn task names -- and never off the task
text alone, since every deck brief spells the deck's destination like a template), and the
lowest tier it may open at (`minTier`),
and the entry checks only what was declared -- a route declaring none is dispatched as routes
were before the gate, since an empty declaration is verbatim pass-through. The readiness
probe answers for the *routed target's* lane, reading that product folder's own settings
first and falling back to what its launcher would inherit from the host; the host's own
Expand Down
Loading
Loading