Problem: the hexagonal refactor churns the backend tree for nine more phases; the UI delivery stack (web/ SPA, cmd/desktop Wails wrapper, compose/web image) must move to its own repo first so doc/layout rewrites land once on a backend-only tree. Change: - New repo git.hubris.network/dtoro/oikos-web (v0.33.0): web/, desktop/ (updateURL repointed to oikos-web releases), compose/, own CI (web + desktop jobs), own deploy script (CI-green gate, TOCTOU guard, version-tagged images, prune-to-3), own webhook receiver on :9798 + launchd unit, own compose project publishing the same 8091:80. - Cutover executed on mac-mini in order: oikos stack's web service stopped+removed, oikos-web project brought up on 8091; outer Caddy untouched (targets the published port) — serving + Authentik flow + /wails 404 quirk verified post-cutover. - Stripped from oikos: web/, cmd/desktop/, compose/web/, desktop CI workflow, ci.yml web job, Makefile ui/desktop/desktop-package/install targets, the compose web service, oikos-web from deploy.sh's fallback prune list; wails + go-keyring dropped from go.mod, vendor synced. - README / CONTRIBUTING / AGENTS.md / .agents dev+operations docs now point at the new repo; mbse + mascot design docs carry a path note. Risk: production SPA serving depends on the new pipeline now; rollback is versioned-image re-up of the old web service from a pre-split checkout (port 8091). Desktop builds installed before the split still check dtoro/oikos releases — one manual reinstall, noted in the oikos-web release notes. Verification: go vet, make test (race), make generate-check, golangci (no new findings; baseline down 400→365); post-cutover curls — localhost:8091 200, /wails/runtime.js 404, outer Caddy 302 Authentik.
85 lines
3.3 KiB
Markdown
85 lines
3.3 KiB
Markdown
---
|
|
name: session-review
|
|
description: "Examine a Nomos chat session, compare the user's objective with the actual outcome, identify causes of failure (missing tools, excessive tool calls, blocked actions, model behavior), and propose concrete fixes."
|
|
risk_class: reversible_low
|
|
inputs: [session_id]
|
|
---
|
|
# Session review
|
|
|
|
Analyze Nomos chat sessions from the live database, diff objectives
|
|
against outcomes, and propose fixes.
|
|
|
|
## 1. Retrieve session data
|
|
|
|
```bash
|
|
# List recent sessions
|
|
curl -s http://localhost:8092/sessions | jq '.sessions[:5]'
|
|
|
|
# Fetch one session with messages
|
|
curl -s http://localhost:8092/sessions/{session_id} | jq .
|
|
```
|
|
|
|
## 2. Classify the session
|
|
|
|
For each session determine:
|
|
|
|
| Dimension | Check |
|
|
|-----------|-------|
|
|
| Objective | What was the user trying to accomplish? |
|
|
| Outcome | Was it achieved? (read final assistant text) |
|
|
| Tool calls | Count, unique tools, redundancy (e.g., N+1 fan-out) |
|
|
| Blockers | Missing action? Missing tool? Model refusal? Empty response? |
|
|
| User frustration | Did the user need to clarify/correct/repeat? |
|
|
| Message sizes | Content blob sizes — truncation needed? |
|
|
|
|
## 3. Key failure signatures
|
|
|
|
| Signature | Root cause | Fix |
|
|
|-----------|-----------|-----|
|
|
| Agent: "I can't run X" | Missing target or capability | Use `run` with shell command — there is no fixed action enum anymore |
|
|
| Agent: "No local knowledge on that" + no web tool | Missing `http_get` / web fetch MCP tool | Add MCP tool |
|
|
| Empty assistant bubble (text="", no tools) | Model returned blank completion | Retry + error surfacing |
|
|
| Non-English boilerplate refusal | Flash-tier model degradation | Response quality guard |
|
|
| >30 tool calls per turn, same tool repeated | N+1 fan-out instead of bulk tool | Enrich bulk tools + tighten SOUL.md |
|
|
| Message >50KB in DB | Raw tool results persisted verbatim | Truncation in `store.go` |
|
|
|
|
## 4. Extract patterns across sessions
|
|
|
|
```bash
|
|
# All sessions summary
|
|
curl -s http://localhost:8092/sessions | jq -r '.sessions[] | "\(.id[:8]) \(.title[:80]) \(.created_at[:16])"'
|
|
|
|
# Message count + tool count per session
|
|
for id in $(curl -s http://localhost:8092/sessions | jq -r '.sessions[].id'); do
|
|
msgs=$(curl -s "http://localhost:8092/sessions/$id" | jq '.messages | length')
|
|
tools=$(curl -s "http://localhost:8092/sessions/$id" | jq '[.messages[].content.tool_calls | length] | add')
|
|
echo "$id $msgs msgs $tools tools"
|
|
done
|
|
```
|
|
|
|
## 5. Output format
|
|
|
|
```
|
|
Session: {id[:8]} — "{title[:60]}"
|
|
Messages: {N} ({user}/{assistant})
|
|
Tool calls: {total} across {turns} turns
|
|
Top tools: {name:count, name:count, ...}
|
|
Objective: {one-line summary}
|
|
Outcome: ✅ / ❌ / ⚠️
|
|
Blockers: {list or "none"}
|
|
Fixes needed: {concrete actions}
|
|
Severity: blocker | friction | cosmetic
|
|
```
|
|
|
|
## Related files
|
|
|
|
- `cmd/nomos/agent.go` — agent loop, tool building, response guards
|
|
- `cmd/nomos/store.go` — session + message persistence
|
|
- `internal/mcp/server.go` — all tool implementations (`run`, `list_lxcs`, …)
|
|
- `web/src/lib/components/ToolCallGroup.svelte` — tool result display
|
|
(in the `dtoro/oikos-web` repo, `~/Projects/oikos-web`, since the
|
|
Phase 1 client extraction)
|
|
- `nomos/SOUL.md` — agent persona and tool selection rules
|
|
- `plans/done/2026-07-09-chat-sessions-improvements.md` — prior session findings
|
|
- `plans/done/2026-07-09-session-execution-and-ux-fixes.md` — latest plan
|