Skip to content
Closed
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ Gormes is a **strangler-fig rewrite**. Each phase ships a self-contained surface
| Phase | Status | Shipped |
|-------|--------|---------|
| Phase 1 — The Dashboard | ✅ | 3/3 subphases |
| Phase 2 — The Gateway | 🔨 | 11/19 subphases |
| Phase 2 — The Gateway | 🔨 | 12/19 subphases |
| Phase 3 — The Black Box (Memory) | 🔨 | 11/14 subphases |
| Phase 4 — The Brain Transplant | 🔨 | 0/8 subphases |
| Phase 5 — The Final Purge | 🔨 | 1/18 subphases |
Expand Down
43 changes: 43 additions & 0 deletions cmd/gormes/doctor.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ var doctorCmd = &cobra.Command{
reg := buildDefaultRegistry(context.Background(), cfg.Delegation, cfg.SkillsRoot(), nil, cfg.Hermes.Model)
result := doctor.CheckTools(reg)
fmt.Print(result.Format())
fmt.Print(doctorGonchoConfig(cfg).Format())

if cfg.Telegram.BotToken == "" && !cfg.Discord.Enabled() {
fmt.Println("[WARN] gateway: no channels configured ([telegram] or [discord])")
Expand Down Expand Up @@ -80,3 +81,45 @@ var doctorCmd = &cobra.Command{
return nil
},
}

func doctorGonchoConfig(cfg config.Config) doctor.CheckResult {
g := cfg.Goncho
items := []doctor.ItemInfo{
{
Name: "runtime",
Status: doctor.StatusPass,
Note: fmt.Sprintf("recent_messages=%d max_message_size=%d max_file_size=%d get_context_max_tokens=%d",
g.RecentMessages, g.MaxMessageSize, g.MaxFileSize, g.GetContextMaxTokens),
},
{
Name: "features",
Status: doctor.StatusPass,
Note: fmt.Sprintf("reasoning_enabled=%t peer_card_enabled=%t summary_enabled=%t dream_enabled=%t",
g.ReasoningEnabled, g.PeerCardEnabled, g.SummaryEnabled, g.DreamEnabled),
},
{
Name: "deriver",
Status: doctor.StatusPass,
Note: fmt.Sprintf("deriver_workers=%d representation_batch_max_tokens=%d",
g.DeriverWorkers, g.RepresentationBatchMaxTokens),
},
{
Name: "dialectic",
Status: doctor.StatusPass,
Note: fmt.Sprintf("dialectic_default_level=%s", g.DialecticDefaultLevel),
},
}
if !g.DreamEnabled {
items = append(items, doctor.ItemInfo{
Name: "dream",
Status: doctor.StatusWarn,
Note: "feature_disabled:dream dream_enabled=false reason=dream fixtures are not available yet",
})
}
return doctor.CheckResult{
Name: "Goncho config",
Status: doctor.StatusPass,
Summary: fmt.Sprintf("enabled=%t workspace=%s observer_peer=%s", g.Enabled, g.Workspace, g.ObserverPeer),
Items: items,
}
}
58 changes: 58 additions & 0 deletions cmd/gormes/goncho_doctor_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package main

import (
"strings"
"testing"

"github.com/TrebuchetDynamics/gormes-agent/internal/config"
)

func TestDoctorGonchoConfigOutputIncludesEffectiveSettingsAndRedactsSecrets(t *testing.T) {
cfg := config.Config{
Hermes: config.HermesCfg{APIKey: "sk-do-not-print"},
Goncho: config.GonchoCfg{
Enabled: true,
Workspace: "ops-workspace",
ObserverPeer: "ops-observer",
RecentMessages: 5,
MaxMessageSize: 25_000,
MaxFileSize: 5_242_880,
GetContextMaxTokens: 100_000,
ReasoningEnabled: true,
PeerCardEnabled: true,
SummaryEnabled: true,
DreamEnabled: false,
DeriverWorkers: 1,
RepresentationBatchMaxTokens: 1024,
DialecticDefaultLevel: "low",
},
}

out := doctorGonchoConfig(cfg).Format()

for _, want := range []string{
"Goncho config",
"workspace=ops-workspace",
"observer_peer=ops-observer",
"enabled=true",
"recent_messages=5",
"max_message_size=25000",
"max_file_size=5242880",
"get_context_max_tokens=100000",
"reasoning_enabled=true",
"peer_card_enabled=true",
"summary_enabled=true",
"dream_enabled=false",
"feature_disabled:dream",
"deriver_workers=1",
"representation_batch_max_tokens=1024",
"dialectic_default_level=low",
} {
if !strings.Contains(out, want) {
t.Fatalf("doctor Goncho output missing %q:\n%s", want, out)
}
}
if strings.Contains(out, "sk-do-not-print") {
t.Fatalf("doctor Goncho output leaked secret:\n%s", out)
}
}
10 changes: 4 additions & 6 deletions cmd/gormes/telegram.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ import (
"github.com/TrebuchetDynamics/gormes-agent/internal/cron"
"github.com/TrebuchetDynamics/gormes-agent/internal/gateway"
"github.com/TrebuchetDynamics/gormes-agent/internal/goncho"
"github.com/TrebuchetDynamics/gormes-agent/internal/gonchotools"
"github.com/TrebuchetDynamics/gormes-agent/internal/hermes"
"github.com/TrebuchetDynamics/gormes-agent/internal/kernel"
"github.com/TrebuchetDynamics/gormes-agent/internal/memory"
"github.com/TrebuchetDynamics/gormes-agent/internal/session"
"github.com/TrebuchetDynamics/gormes-agent/internal/telemetry"
"github.com/TrebuchetDynamics/gormes-agent/internal/tools"
)

// telegramCmd runs Gormes as a Telegram bot — the adapter previously
Expand Down Expand Up @@ -115,11 +115,9 @@ func runTelegram(cmd *cobra.Command, _ []string) error {
defer cancel()

reg := buildDefaultRegistry(rootCtx, cfg.Delegation, cfg.SkillsRoot(), hc, cfg.Hermes.Model)
tools.RegisterHonchoTools(reg, goncho.NewService(mstore.DB(), goncho.Config{
WorkspaceID: "default",
ObserverPeerID: "gormes",
RecentMessages: 4,
}, slog.Default()))
gonchoCfg := cfg.Goncho.RuntimeConfig()
gonchoCfg.SessionDirectory = smap
gonchotools.RegisterHonchoTools(reg, goncho.NewService(mstore.DB(), gonchoCfg, slog.Default()))

tm := telemetry.New()
toolAudit := audit.NewJSONLWriter(config.ToolAuditLogPath())
Expand Down
22 changes: 11 additions & 11 deletions docs/content/building-gormes/architecture_plan/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,12 @@ machine-readable queue for developing the full `gormes-agent`.
## Progress

<!-- PROGRESS:START kind=docs-full-checklist -->
**Overall:** 28/73 subphases shipped · 13 in progress · 32 planned
**Overall:** 29/73 subphases shipped · 13 in progress · 31 planned

| Phase | Status | Shipped |
|-------|--------|---------|
| Phase 1 — The Dashboard | ✅ | 3/3 subphases |
| Phase 2 — The Gateway | 🔨 | 11/19 subphases |
| Phase 2 — The Gateway | 🔨 | 12/19 subphases |
| Phase 3 — The Black Box (Memory) | 🔨 | 11/14 subphases |
| Phase 4 — The Brain Transplant | 🔨 | 0/8 subphases |
| Phase 5 — The Final Purge | 🔨 | 1/18 subphases |
Expand Down Expand Up @@ -149,13 +149,13 @@ machine-readable queue for developing the full `gormes-agent`.
- [x] Typed result envelope
- [x] Append-only run log

### 2.E.1 — OS-AI Spine: Delegation Policy + Child Execution 🔨
### 2.E.1 — OS-AI Spine: Delegation Policy + Child Execution

- [x] Runner-enforced tool allowlists + blocked-tool policy
- [x] Tool-call audit in typed child results
- [x] Real child Hermes stream loop
- [x] GBrain minion-orchestrator routing policy
- [ ] Durable subagent/job ledger
- [x] Durable subagent/job ledger

### 2.E.2 — OS-AI Spine: Concurrent-Tool Cancellation ✅

Expand Down Expand Up @@ -284,29 +284,29 @@ machine-readable queue for developing the full `gormes-agent`.
- [x] Opt-in user-scope recall + source filters
- [x] Interrupted-turn memory sync suppression
- [x] Honcho-compatible scope/source tool schema
- [ ] Honcho host integration compatibility fixtures
- [ ] Cross-chat deny-path fixtures
- [x] Honcho host integration compatibility fixtures
- [x] Cross-chat deny-path fixtures
- [ ] Cross-chat operator evidence

### 3.E.8 — Session Lineage + Cross-Source Search 🔨

- [x] parent_session_id lineage for compression splits
- [ ] Gateway resume follows compression continuation
- [x] Gateway resume follows compression continuation
- [x] Source-filtered session/message search core
- [x] GONCHO user-scope search/context parameters
- [ ] Lineage-aware source-filtered search hits
- [x] Lineage-aware source-filtered search hits
- [ ] Operator-auditable search evidence

### 3.F — Goncho Honcho Memory Parity
### 3.F — Goncho Honcho Memory Parity 🔨

- [ ] Goncho context representation options
- [x] Goncho context representation options
- [ ] Goncho search filter grammar
- [ ] Directional peer cards and representation scopes
- [ ] Goncho queue status read model
- [ ] Goncho summary context budget
- [ ] Goncho dialectic chat contract
- [ ] Goncho file upload import ingestion
- [ ] Goncho topology design fixtures
- [x] Goncho topology design fixtures
- [ ] Goncho operator diagnostics contract
- [ ] Goncho streaming chat persistence contract
- [ ] Goncho configuration namespace
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ The Phase 3 queue is not one flat backlog. The order matters because later memor
1. **P2 — 3.E.7 interrupted-turn sync gate**
Upstream Hermes now skips external-provider memory sync on interrupted turns. Gormes should pin the same safety rule over the local GONCHO finalization path before widening host-compatible memory surfaces: a cancelled turn can record a skipped-sync reason, but it must not create durable conclusions or cross-chat recall candidates.
2. **P2 — 3.E.7 Honcho-compatible tool-edge closeout**
The `user_id` merge rules, same-chat recall fence, and opt-in user-scope/source-filtered recall are pinned in `internal/session` and `internal/memory`. The internal GONCHO service accepts those scope/source parameters, but `internal/tools/honcho_tools.go` still needs to advertise them in the tool schemas before this is safe to call shipped. The remaining slices are scope/source schema exposure for `honcho_search`/`honcho_context`, then explicit deny-path fixtures, then operator-readable evidence.
The `user_id` merge rules, same-chat recall fence, and opt-in user-scope/source-filtered recall are pinned in `internal/session` and `internal/memory`. The internal GONCHO service accepts those scope/source parameters, but `internal/gonchotools/honcho_tools.go` still needs to advertise them in the tool schemas before this is safe to call shipped. The remaining slices are scope/source schema exposure for `honcho_search`/`honcho_context`, then explicit deny-path fixtures, then operator-readable evidence.
3. **P3 — Honcho host integration compatibility fixtures**
Honcho upstream added OpenCode and SillyTavern integration docs. Gormes should not port their Node/Bun plugins, but it should fixture-lock the shared concepts they depend on: workspace, peer, host-scoped config, session strategy, context/tool/hybrid recall modes, and durable conclusion/search tools while keeping the internal package named `goncho`.
4. **P4 — 3.E.8 `parent_session_id` lineage closeout**
Expand Down
Loading