Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
Masz rację: nie powinniśmy próbować utrzymywać jednej fizycznej sesji bez końca. Powinniśmy utrzymywać jeden logiczny projekt, który może przechodzić przez wiele mniejszych sesji i zadań. Mój konkretny wybór rozwiązania: - trwały „Project Ledger” w określonym katalogu, - automatyczny zapis po każdym turnie, - osobne segmenty dla zadań, - kontrolowany checkpoint przed kompresją, - wstrzyknięcie małej kapsuły stanu przed kolejnym zapytaniem, - fail-closed: bez poprawnie zapisanego checkpointu nie wolno kompaktować, - proaktywne przechodzenie do świeżej sesji przy granicy zadania zamiast czekania na awarię kontekstu. Plan zapisałem tutaj: /home/hermit/plans/2026-09-01-hermes-project-ledger/IMPLEMENTATION_PLAN.md Dodatkowe ustalenia techniczne: /home/hermit/plans/2026-09-01-hermes-project-ledger/thinking.md 1. Czy Hermes już ma miejsca do wstrzyknięcia? Tak. W obecnej wersji są cztery przydatne punkty. Po każdym zakończonym turnie: python sync_turn(...) Możemy wtedy automatycznie zapisać: - wiadomość użytkownika, - odpowiedź agenta, - użyte narzędzia, - zmienione pliki, - dokładne błędy, - wyniki testów, - nowe zadania wykryte podczas pracy. Przed następnym wywołaniem modelu: python prefetch(query) Możemy wstrzyknąć małą kapsułę aktywnego zadania. Nie do system promptu, tylko do kontekstu bieżącego requestu, żeby nie niszczyć cache. Przed kompresją: python on_pre_compress(messages) Możemy: - zapisać pełny checkpoint, - zaktualizować dokumentację projektu, - zwrócić kompaktorowi ustrukturyzowany handoff, - przekazać ścieżkę i hash checkpointu. Po kompresji: python on_session_switch(..., reason="compression") Ten hook w Twojej wersji działa zarówno przy kompresji in-place, jak i przy zmianie identyfikatora sesji. Możemy wtedy: - potwierdzić, że checkpoint odpowiada wykonanej kompresji, - wyczyścić przetworzone bufory, - oznaczyć checkpoint jako użyty, - przygotować jednorazową kapsułę dla pierwszego turnu po kompresji. Czyli technicznie dokładnie to, o czym mówisz, jest możliwe. 2. Gdzie przechowujemy dokumentację? Proponuję jedno jawnie skonfigurowane miejsce: yaml project_ledger: root: /home/hermit/plans/agent-projects Przykładowa struktura: text /home/hermit/plans/agent-projects/
/ ├── PROJECT.md ├── INDEX.md ├── DECISIONS.md ├── BLOCKERS.md ├── ARTIFACTS.md ├── manifest.json ├── journal/ │ └── events.jsonl └── tasks/ ├── T-0001-authentication/ │ ├── TASK.md │ ├── STATE.md │ ├── TODO.md │ ├── SOURCES.md │ └── checkpoints/ │ ├── C-000001.md │ └── C-000002.md └── T-0002-browser-qa/ └── ... Znaczenie: - PROJECT.md — cel, zakres, ograniczenia i kryteria zakończenia projektu, - INDEX.md — krótki indeks zadań i zależności, - DECISIONS.md — decyzje wraz z uzasadnieniem, - BLOCKERS.md — aktualne i rozwiązane blokery, - ARTIFACTS.md — ścieżki, branche, testy i runtime, - journal/events.jsonl — append-only źródło odzyskiwania, - tasks/T-... — osobne segmenty tematyczne, - checkpoints/ — niezmienne snapshoty przed kompresją. Ważne: nie tworzymy jednego ogromnego pliku dokumentacji. To ponownie zrobiłoby z dokumentacji wielki kontekst. INDEX.md służy tylko jako mapa, a szczegóły są dzielone na zadania. 3. Jak agent rozbija projekt? Hierarchia: text Projekt → obszar prac → zadanie → podzadanie → checkpoint Statusy: text discovered → planned → active → blocked → done Nowe zadanie powstaje, gdy: - ma osobne kryteria akceptacji, - dotyczy innego subsystemu, - można je niezależnie przetestować, - może zostać niezależnie zablokowane, - może być wykonane/delegowane niezależnie, - aktualne STATE.md robi się za duże, - poprzednie zadanie zostało zakończone. Nie rozbijamy projektu per wywołanie narzędzia. Sensowny segment to około 30–90 minut spójnej pracy albo jeden niezależnie weryfikowalny rezultat. Każde zadanie musi mieć: - cel, - zakres i non-goals, - kryteria akceptacji, - zależności, - aktualny stan, - zakończone działania z dowodami, - blokery, - dokładnie jeden następny krok. Nowe tematy wykryte przez agenta dostają status discovered. Nie mogą samodzielnie wyprzeć aktywnego celu użytkownika. 4. Co dzieje się po każdym turnie? Automatycznie, niezależnie od tego, czy model pamięta o dokumentacji: 1. Hermes zapisuje zdarzenie do journal/events.jsonl. 2. Zdarzenie otrzymuje stabilny identyfikator i hash. 3. Zapisywane są dokładne: - ścieżki, - błędy, - wyniki testów, - decyzje, - identyfikatory tasków. 4. Jeżeli pojawił się nowy temat, zostaje dodany do TODO jako discovered. 5. Co określoną liczbę turnów model dokumentacyjny aktualizuje pliki Markdown. Dzięki temu nawet jeśli model dokumentacyjny padnie, mamy surowy journal, z którego można odbudować dokumentację. 5. Co dokładnie dzieje się przed kompresją? To będzie transakcja: 1. Blokada dla (project_id, session_id). 2. Flush wszystkich zdarzeń do journala. 3. Model checkpointujący generuje ustrukturyzowany wynik: - zmiany tasków, - wykonane działania, - decyzje, - blokery, - pliki, - testy, - następny krok, - krótką kapsułę handoff. 4. Kod waliduje wynik. 5. Dokumenty są zapisywane do plików tymczasowych. 6. Następuje fsync i atomowy rename. 7. manifest.json jest aktualizowany jako ostatni. 8. Obliczany jest hash checkpointu. 9. Dopiero wtedy kompaktor może zastąpić starszy kontekst. 10. Kompaktor dostaje kapsułę oraz wskaźnik: text Checkpoint: C-000123 Task: T-0007 Path: .../tasks/T-0007/checkpoints/C-000123.md Digest: sha256:... Next action: ... Jeżeli dokumentacja nie została poprawnie zapisana, kompresja nie może się odbyć. 6. Najważniejsza luka w obecnym Hermesie Twoja lokalna wersja wywołuje on_pre_compress(), ale przechwytuje i ignoruje jego wyjątki: python try: memory_context = memory_manager.on_pre_compress(messages) except Exception: pass Czyli provider może powiedzieć „nie udało się zapisać checkpointu”, a Hermes mimo to może kontynuować. Aktualna dokumentacja upstream opisuje już lepszy kontrakt: yaml memory: checkpoint_required: true Wtedy brak checkpointu powinien kończyć się: text BLOCKED_MISSING_PREREQUISITE i pozostawiać oryginalne wiadomości bez zmian. Tego kontraktu nie ma jeszcze w Twojej zainstalowanej wersji. Pierwsza zmiana implementacyjna musi więc backportować właśnie ten mechanizm. Bez tego Project Ledger byłby wygodną dokumentacją, ale nie gwarancją bezpieczeństwa. 7. Co wstrzykujemy do modelu? Nie wszystkie dokumenty. Tylko kapsułę około 2–3,5 tysiąca tokenów: text [PROJECT LEDGER CAPSULE] Project: impress-connect Active task: T-0007 Objective: ... Acceptance criteria: ... Verified state: ... Completed: ... Blockers: ... Next action: ... Relevant documents: - tasks/T-0007/STATE.md - tasks/T-0007/SOURCES.md - DECISIONS.md#D-0012 Latest checkpoint: C-000123, sha256:... Recovery: Use ledger_get or session_search. Do not infer omitted details. [/PROJECT LEDGER CAPSULE] Dobór: 1. aktywne zadanie, 2. zadania wskazane bezpośrednio przez ID lub ścieżkę, 3. maksymalnie dwa powiązane zadania/zależności, 4. tylko istotne decyzje i ograniczenia projektowe. Nie wstrzykujemy całego projektu przy każdym wywołaniu. 8. Czy model kompaktujący może sam tworzyć dokumentację? Tak, ale nie powinien samodzielnie wykonywać niekontrolowanych zapisów. Bezpieczny podział: - model generuje ustrukturyzowane zmiany, - kod waliduje wynik, - kod zapisuje pliki atomowo, - kod oblicza hash, - dopiero potem Hermes zezwala na kompresję. Model może więc przygotowywać dokumentację, ale nie jest autorytetem transakcji. W pierwszej wersji proponuję dwa logiczne kroki: 1. checkpoint dokumentacyjny, 2. właściwa kompresja z wykorzystaniem checkpointu. To jest trochę wolniejsze, ale użytkownik wyraźnie woli poświęcić więcej czasu i nie stracić pracy. Później można zoptymalizować to do jednego wywołania zwracającego: json { "ledger_updates": [], "handoff_summary": "...", "active_task": "T-0007", "next_action": "...", "source_digest": "..." } 9. Jak utrzymujemy „długą sesję”? Nie utrzymujemy nieskończenie długiej fizycznej sesji. Utrzymujemy: text jeden projekt + stabilny ledger + wiele krótszych sesji Polityka: - około 35% kontekstu: checkpoint, - po zakończeniu zadania: checkpoint, - około 45% i czysta granica zadania: przejście do świeżej sesji, - kompresja awaryjna pozostaje zabezpieczeniem, a nie podstawowym sposobem prowadzenia projektu. Nowa sesja dostaje: - aktywny task, - kapsułę, - wskazane dokumenty, - aktualny diff/status repozytorium, - ostatni checkpoint, - jeden kolejny krok. Nie potrzebuje pełnych 200 tysięcy tokenów starej historii. 10. Kolejność implementacji Trzy osobne, możliwe do przeglądu etapy: 1. Hermes core: - fail-closed checkpoint contract, - testy, że nie gubi wiadomości i nie zmienia sesji przy awarii. 2. Lokalny provider project-ledger: - journal, - Markdown, - taski, - bounded prefetch, - pre/post compression. 3. Proaktywny rollover i opcjonalny context engine: - automatyczne przechodzenie między krótszymi sesjami, - później topic-aware select_context() zamiast klasycznej historii. Nie zaczynałbym od pełnego zastępowania ContextCompressor. To znacznie większe ryzyko. Memory provider plus mały, testowalny backport daje prawie całą potrzebną funkcjonalność przy mniejszej ingerencji. Repozytorium Hermesa pozostaje obecnie niezmienione i czyste. Utworzyłem wyłącznie dokumentację planu poza repozytorium. Następny konkretny etap to implementacja punktu 1 na branchu agent/hermes-project-ledger, po wykonaniu kopii config.yaml, state.db* i zapisaniu obecnego baseline’u.
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)