Files
liqiang b119135836
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
2026-08-20 13:12:50 +00:00

134 lines
8.7 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Query: # Sixth independent review: persisted-row backfill
The third terminal acceptance review rejected the current candidate despite all
focused tests passing. Continue the same self-update and correct this exact
persistence-boundary defect:
- `append_persistent_model_status()` mutates the newest message's in-memory
`api_content` after that message has normally already been persisted. The
turn-start user row is flushed before API-message construction
(`agent/turn_context.py` around 12191235), and assistant/tool rows are
incrementally flushed before tool execution (`agent/conversation_loop.py`
around 61786185). The status is appended later around 16001612.
- `_flush_messages_to_session_db_unlocked()` deliberately skips messages with
`_db_persisted`, and the new path has no update/backfill operation. The
sidecar therefore survives within the current process but disappears after
restart/session reload, changing the provider prefix across process
boundaries.
- Existing `set_latest_user_api_content()` only updates the latest user row, is
not called by the status path, and cannot cover a tool-result target.
Implement the smallest safe durable update at Hermes' existing string-only
database boundary. Do not widen the sidecar type or mutate clean transcript
content. Preserve role/tool ordering and fail closed for unsupported content.
Use stable row identity or another production-supported mechanism; do not rely
on list position if it could update the wrong persisted message.
Add a behavior test that persists a realistic user → assistant tool-call
(`content=None`) → string tool-result sequence, attaches status to the newest
tool evidence, reloads it through the real state/session path, and asserts the
same string sidecar and byte-identical replay after reload. The test must fail
if only the in-memory dictionary was changed.
Run the focused tests, existing sidecar/cache/turn-context regressions,
compilation, and `git diff --check`. Update `BOOK_SELF_EVOLUTION_REPORT.md` with
this sixth review and exact results. Do not edit the book, commit, push, or
claim downstream task improvement.
Initializing agent...
↻ Resumed session 20260802_031522_523cd2 (6 user messages, 162 total messages)
────────────────────────────────────────
┌─ Reasoning ──────────────────────────────────────────────────────────────────┐
**Assessing implementation details**
I need to take action and inspect the relevant aspects closely. Im noticing that
a previous implementation seems to have some issues, so itll be good to address
that. I may need to add a database update method or see if we can use the existing
generic update instead. I'll look into this further to figure out the best approach
moving forward.
└──────────────────────────────────────────────────────────────────────────────┘
┊ 💻 preparing terminal…
┊ 💻 preparing terminal…
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path for f in ['agent/model_status_context.py','hermes_state.py','agent/turn_context.py']: s=Path(f).read_text().splitlines() + 1 command 0.0s
┊ 💻 $ python3 - <<'PY' from pathlib import Path for f,ranges in [('hermes_state.py',[(6000,6130),(6170,6240)]),('run_agent.py',[(6150,6200),(2080,2220)]),('agent/model_status_context.py',[(1,160)]),('tests/agent/test_model_status_context.py',[(1,240)])]: p=Path(f) + 2 commands 0.1s
┊ 💻 $ git status --short + 1 command 0.0s
┌─ Reasoning ──────────────────────────────────────────────────────────────────┐
**Fixing persistence issues**
I need to address the persistence backfill problem thats come up. My first step will
be to inspect the database methods and the agent session row ID metadata. I should
search for "_row_id" in the messages and also look into flushing the update methods
to resolve this. It sounds a bit technical, but I think I can sort it out with some
focused effort. Lets get started!
└──────────────────────────────────────────────────────────────────────────────┘
┊ 💻 preparing terminal…
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path for f in ['hermes_state.py','run_agent.py']: s=Path(f).read_text().splitlines() + 1 command 0.0s
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('hermes_state.py') + 4 commands 0.0s
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('hermes_state.py') + 4 commands 0.0s
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path for p in Path('tests').rglob('*.py'): s=p.read_text() if 'SessionDB(' in s and 'append_message' in s: print(p) PY 0.1s
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('run_agent.py') + 2 commands 0.1s
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('hermes_state.py') + 1 command 0.1s
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('agent/model_status_context.py') + 3 commands 0.4s [exit 1]
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('agent/model_status_context.py') + 3 commands 0.4s
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('run_agent.py') + 3 commands 0.8s
┊ 💻 preparing terminal…
┊ 💻 preparing terminal…
┊ 💻 preparing terminal…
┊ 💻 $ uv run --with pytest pytest tests/agent/test_api_content_sidecar.py tests/run_agent/test_background_review_cache_parity.py tests/agent/test_turn_context.py -q 10.2s
┊ 💻 $ python3 -m py_compile agent/model_status_context.py agent/conversation_loop.py agent/agent_init.py run_agent.py hermes_state.py + 1 command 0.1s
┊ 💻 $ git diff --stat + 1 command 0.0s
┊ 💻 preparing terminal…
┊ 💻 $ python3 - <<'PY' from pathlib import Path p=Path('BOOK_SELF_EVOLUTION_REPORT.md') + 5 commands 0.1s
╭─ ⚕ Hermes ───────────────────────────────────────────────────────────────────╮
Addressed the sixth-review persistence-boundary defect.
Changes:
- Added SessionDB.update_message_api_content(session_id, message_row_id, api_content) for durable string-sidecar updates by stable row ID.
- Flush now records the database row ID returned by append_message().
- Persisted rows with later status backfills are updated by row ID even when _db_persisted would otherwise skip them.
- The status sidecar remains string-only; unsupported values still fail closed.
- Clean transcript content and role/tool ordering are unchanged.
- Added a real SessionDB persistence/reload test for:
- user message;
- assistant tool call with content=None;
- string tool result;
- status attachment;
- database close/reopen;
- byte-identical replay after reload.
- Updated BOOK_SELF_EVOLUTION_REPORT.md with the sixth review and exact results.
Verification:
- uv run --with pytest pytest tests/agent/test_model_status_context.py -q
- Passed: 6 passed in 0.50s
- uv run --with pytest pytest tests/agent/test_api_content_sidecar.py tests/run_agent/test_background_review_cache_parity.py tests/agent/test_turn_context.py -q
- Passed: 36 passed in 9.43s
- python3 -m py_compile agent/model_status_context.py agent/conversation_loop.py agent/agent_init.py run_agent.py hermes_state.py
- Passed.
- git diff --check
- Passed.
No book changes, commit, push, or downstream task-improvement claim was made.
╰──────────────────────────────────────────────────────────────────────────────╯
Resume this session with:
hermes --resume 20260802_031522_523cd2
Session: 20260802_031522_523cd2
Duration: 1m 28s
Messages: 191 (7 user, 177 tool calls)