bots-garden/one-day-one-featurepublic Fork
⑂ 1ea7eb9
Commits
⬇ Clone ▾
git clone https://git.rickub.com/bots-garden/one-day-one-feature.git
git clone ssh://git@rickub.com/bots-garden/one-day-one-feature.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

🛟 Updated.

k33g committed 2026-10-24T19:06:02+02:00 Browse files
1ea7eb9 parent: 88031eb
added 03-decision-models/.mm/decider/20261024-101623.098-spell.json +27 -0
new file mode 100644
@@ -0,0 +1,27 @@
1+{
2+ "time": "2026-10-24T10:16:23.098066+02:00",
3+ "decider": "spell.yaml",
4+ "prompt": "un loup garou en tutu rose s'approche de moi",
5+ "response": {
6+ "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M",
7+ "answers": {
8+ "spell": {
9+ "type": "choice",
10+ "choice": "shield",
11+ "probabilities": {
12+ "fireball": 0.17568969425560138,
13+ "arcane_bolt": 0.12788671552558184,
14+ "shield": 0.34417338683216175,
15+ "misty_step": 0.2747498330018602,
16+ "sleep": 0.07750037038479486
17+ },
18+ "confidence": 0.18021673354020218
19+ }
20+ },
21+ "usage": {
22+ "input_tokens": 111,
23+ "output_tokens": 0
24+ }
25+ },
26+ "context": "spell: shield (confidence 0.18)"
27+}
new file mode 100644
@@ -0,0 +1,27 @@
1+{
2+ "time": "2026-10-24T10:16:23.098066+02:00",
3+ "decider": "spell.yaml",
4+ "prompt": "un loup garou en tutu rose s'approche de moi",
5+ "response": {
6+ "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M",
7+ "answers": {
8+ "spell": {
9+ "type": "choice",
10+ "choice": "shield",
11+ "probabilities": {
12+ "fireball": 0.17568969425560138,
13+ "arcane_bolt": 0.12788671552558184,
14+ "shield": 0.34417338683216175,
15+ "misty_step": 0.2747498330018602,
16+ "sleep": 0.07750037038479486
17+ },
18+ "confidence": 0.18021673354020218
19+ }
20+ },
21+ "usage": {
22+ "input_tokens": 111,
23+ "output_tokens": 0
24+ }
25+ },
26+ "context": "spell: shield (confidence 0.18)"
27+}
added 03-decision-models/.mm/decider/20261024-101704.858-spell.json +27 -0
new file mode 100644
@@ -0,0 +1,27 @@
1+{
2+ "time": "2026-10-24T10:17:04.858962+02:00",
3+ "decider": "spell.yaml",
4+ "prompt": "je vais l'attaquer à coup de sac à main",
5+ "response": {
6+ "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M",
7+ "answers": {
8+ "spell": {
9+ "type": "choice",
10+ "choice": "arcane_bolt",
11+ "probabilities": {
12+ "fireball": 0.15569653823233248,
13+ "arcane_bolt": 0.33806895344532073,
14+ "shield": 0.25798423258461595,
15+ "misty_step": 0.12754081329484873,
16+ "sleep": 0.12070946244288222
17+ },
18+ "confidence": 0.17258619180665088
19+ }
20+ },
21+ "usage": {
22+ "input_tokens": 109,
23+ "output_tokens": 0
24+ }
25+ },
26+ "context": "spell: arcane_bolt (confidence 0.17)"
27+}
new file mode 100644
@@ -0,0 +1,27 @@
1+{
2+ "time": "2026-10-24T10:17:04.858962+02:00",
3+ "decider": "spell.yaml",
4+ "prompt": "je vais l'attaquer à coup de sac à main",
5+ "response": {
6+ "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M",
7+ "answers": {
8+ "spell": {
9+ "type": "choice",
10+ "choice": "arcane_bolt",
11+ "probabilities": {
12+ "fireball": 0.15569653823233248,
13+ "arcane_bolt": 0.33806895344532073,
14+ "shield": 0.25798423258461595,
15+ "misty_step": 0.12754081329484873,
16+ "sleep": 0.12070946244288222
17+ },
18+ "confidence": 0.17258619180665088
19+ }
20+ },
21+ "usage": {
22+ "input_tokens": 109,
23+ "output_tokens": 0
24+ }
25+ },
26+ "context": "spell: arcane_bolt (confidence 0.17)"
27+}
added 04-memory/.mm/sessions/20261005-091500-a1b2c3d4.json +48 -0
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261005-091500-a1b2c3d4",
3+ "cwd": ".",
4+ "createdAt": "2026-10-05T09:15:00Z",
5+ "updatedAt": "2026-10-05T09:40:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "ok, keep 8417. And the module name?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)."
44+ }
45+ ]
46+ }
47+ ]
48+}
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261005-091500-a1b2c3d4",
3+ "cwd": ".",
4+ "createdAt": "2026-10-05T09:15:00Z",
5+ "updatedAt": "2026-10-05T09:40:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "ok, keep 8417. And the module name?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)."
44+ }
45+ ]
46+ }
47+ ]
48+}
added 04-memory/.mm/sessions/20261008-140000-b2c3d4e5.json +48 -0
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261008-140000-b2c3d4e5",
3+ "cwd": ".",
4+ "createdAt": "2026-10-08T14:00:00Z",
5+ "updatedAt": "2026-10-08T14:35:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Postgres or SQLite for the storage?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "How do we handle schema changes?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table."
44+ }
45+ ]
46+ }
47+ ]
48+}
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261008-140000-b2c3d4e5",
3+ "cwd": ".",
4+ "createdAt": "2026-10-08T14:00:00Z",
5+ "updatedAt": "2026-10-08T14:35:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Postgres or SQLite for the storage?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "How do we handle schema changes?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table."
44+ }
45+ ]
46+ }
47+ ]
48+}
added 04-memory/.mm/sessions/20261012-101000-c3d4e5f6.json +48 -0
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261012-101000-c3d4e5f6",
3+ "cwd": ".",
4+ "createdAt": "2026-10-12T10:10:00Z",
5+ "updatedAt": "2026-10-12T10:30:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Quel format pour les logs ?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "Et les erreurs HTTP ?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique."
44+ }
45+ ]
46+ }
47+ ]
48+}
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261012-101000-c3d4e5f6",
3+ "cwd": ".",
4+ "createdAt": "2026-10-12T10:10:00Z",
5+ "updatedAt": "2026-10-12T10:30:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Quel format pour les logs ?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "Et les erreurs HTTP ?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique."
44+ }
45+ ]
46+ }
47+ ]
48+}
added 04-memory/.mm/sessions/20261015-163000-d4e5f6a7.json +54 -0
new file mode 100644
@@ -0,0 +1,54 @@
1+{
2+ "id": "20261015-163000-d4e5f6a7",
3+ "cwd": ".",
4+ "createdAt": "2026-10-15T16:30:00Z",
5+ "updatedAt": "2026-10-15T17:20:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "metadata": {
18+ "compact": "summary"
19+ },
20+ "content": [
21+ {
22+ "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept."
23+ }
24+ ]
25+ },
26+ {
27+ "role": "model",
28+ "metadata": {
29+ "compact": "summary"
30+ },
31+ "content": [
32+ {
33+ "text": "Understood — I will re-check files before editing them."
34+ }
35+ ]
36+ },
37+ {
38+ "role": "user",
39+ "content": [
40+ {
41+ "text": "Should the release be tagged?"
42+ }
43+ ]
44+ },
45+ {
46+ "role": "model",
47+ "content": [
48+ {
49+ "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"."
50+ }
51+ ]
52+ }
53+ ]
54+}
new file mode 100644
@@ -0,0 +1,54 @@
1+{
2+ "id": "20261015-163000-d4e5f6a7",
3+ "cwd": ".",
4+ "createdAt": "2026-10-15T16:30:00Z",
5+ "updatedAt": "2026-10-15T17:20:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "metadata": {
18+ "compact": "summary"
19+ },
20+ "content": [
21+ {
22+ "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept."
23+ }
24+ ]
25+ },
26+ {
27+ "role": "model",
28+ "metadata": {
29+ "compact": "summary"
30+ },
31+ "content": [
32+ {
33+ "text": "Understood — I will re-check files before editing them."
34+ }
35+ ]
36+ },
37+ {
38+ "role": "user",
39+ "content": [
40+ {
41+ "text": "Should the release be tagged?"
42+ }
43+ ]
44+ },
45+ {
46+ "role": "model",
47+ "content": [
48+ {
49+ "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"."
50+ }
51+ ]
52+ }
53+ ]
54+}
added 04-memory/README.md +27 -0
new file mode 100644
@@ -0,0 +1,27 @@
1+# mini-me demo: searching earlier sessions
2+
3+Bob helps build **bookshelf**, a small Go web app. The project already has four earlier conversations, in which the API port, the storage, the logs and the deployment were decided. Bob does not remember them — each start is a new session — but he can search them: you with `/memory <words>`, Bob himself with the `search_memory` tool. The model is Qwen3.5 4B, served by [llmman](https://github.com/llmmanorg/llmman).
4+
5+## Run the demo
6+
7+```bash
8+llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M
9+./reset.sh
10+mm -tui agent.yaml
11+# or mm tui agent.yaml
12+# or mm tui
13+```
14+
15+Then ask Bob, who searches by himself:
16+
17+```text
18+Which port did we choose for the API?
19+Write config.go with the constants we decided before: the API port and the database file.
20+How do we deploy bookshelf, and where are the backups?
21+```
22+
23+In the terminal each search shows as `🔎 search_memory: "<words>"` followed by its hits.
24+
25+## Good to know
26+
27+- **The search matches words, not meanings.** A question in another language than the session, or with other words for the same thing, finds nothing.
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,27 @@
1+# mini-me demo: searching earlier sessions
2+
3+Bob helps build **bookshelf**, a small Go web app. The project already has four earlier conversations, in which the API port, the storage, the logs and the deployment were decided. Bob does not remember them — each start is a new session — but he can search them: you with `/memory <words>`, Bob himself with the `search_memory` tool. The model is Qwen3.5 4B, served by [llmman](https://github.com/llmmanorg/llmman).
4+
5+## Run the demo
6+
7+```bash
8+llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M
9+./reset.sh
10+mm -tui agent.yaml
11+# or mm tui agent.yaml
12+# or mm tui
13+```
14+
15+Then ask Bob, who searches by himself:
16+
17+```text
18+Which port did we choose for the API?
19+Write config.go with the constants we decided before: the API port and the database file.
20+How do we deploy bookshelf, and where are the backups?
21+```
22+
23+In the terminal each search shows as `🔎 search_memory: "<words>"` followed by its hits.
24+
25+## Good to know
26+
27+- **The search matches words, not meanings.** A question in another language than the session, or with other words for the same thing, finds nothing.
\ No newline at end of file\ No newline at end of file
added 04-memory/agent.yaml +79 -0
new file mode 100644
@@ -0,0 +1,79 @@
1+# Memory search — an assistant that remembers what was decided in the
2+# project's earlier conversations:
3+#
4+# /memory <words> the user's search through the stored sessions
5+# (sessions.searchMemory)
6+# search_memory the same search, called by the model when a question
7+# refers to something decided before
8+# (sessions.autoSearchMemory)
9+#
10+# The project is "bookshelf", a small Go web app; seed/ holds four earlier
11+# sessions (the API port, the storage, the logs — in French —, the
12+# deployment as a /compact summary). reset.sh copies them to .mm/sessions.
13+#
14+# llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M
15+# llmman serve
16+#
17+# cd demos/memory-search
18+# ./reset.sh
19+# mm -tui agent.yaml or mm -p "…" agent.yaml
20+
21+provider: llmman
22+model: hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M
23+baseUrl: http://127.0.0.1:17434/v1
24+fallback: http://host.docker.internal:17434/v1
25+contextWindow: 16384
26+
27+sessions:
28+ enabled: true
29+ dir: .mm/sessions
30+ # /memory <words>, for you.
31+ searchMemory: true
32+ # search_memory, for the model.
33+ autoSearchMemory: true
34+
35+# Writing files (config.go…) is enough to show the decisions being used; no
36+# bash, so the model cannot wander off grepping the session files.
37+yolo: true
38+bashTool: false
39+editTools: true
40+planTool: false
41+askUserTool: false
42+skillsDir: no-skills
43+
44+agentsMd:
45+ enabled: false
46+
47+sampling:
48+ temperature: 0.0
49+ parallel_tool_calls: false
50+ max_tokens: 2048
51+ chat_template_kwargs:
52+ enable_thinking: false
53+
54+maxTurns: 8
55+watchdogTimeout: 2m
56+firstTokenTimeout: 3m
57+displayCommands: true
58+
59+acp:
60+ name: bob
61+ title: 📚 Bob (bookshelf, with a memory)
62+
63+system: |
64+ Your name is Bob. You help build bookshelf, a small Go web app, in this
65+ directory. When the user asks you to write or create a file, call
66+ write_file with the whole content; do not only show the code.
67+
68+ Earlier conversations about this project are stored. When the user refers
69+ to something decided or said before ("the port we chose", "like last
70+ time", "what did we decide for…"), or asks how THIS project does
71+ something ("how do we handle…", "where are…", "which … do we use"), the
72+ answer is a choice made for this project (port, storage, schema, logs,
73+ errors, deployment…): call search_memory first with the key words, then
74+ answer from what it found and name the session it came from. Never
75+ invent a decision: if search_memory finds nothing, try other words once,
76+ then say you do not know.
77+
78+ For anything else (a greeting, a general Go question), answer directly,
79+ in the user's language, without search_memory.
new file mode 100644
@@ -0,0 +1,79 @@
1+# Memory search — an assistant that remembers what was decided in the
2+# project's earlier conversations:
3+#
4+# /memory <words> the user's search through the stored sessions
5+# (sessions.searchMemory)
6+# search_memory the same search, called by the model when a question
7+# refers to something decided before
8+# (sessions.autoSearchMemory)
9+#
10+# The project is "bookshelf", a small Go web app; seed/ holds four earlier
11+# sessions (the API port, the storage, the logs — in French —, the
12+# deployment as a /compact summary). reset.sh copies them to .mm/sessions.
13+#
14+# llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M
15+# llmman serve
16+#
17+# cd demos/memory-search
18+# ./reset.sh
19+# mm -tui agent.yaml or mm -p "…" agent.yaml
20+
21+provider: llmman
22+model: hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M
23+baseUrl: http://127.0.0.1:17434/v1
24+fallback: http://host.docker.internal:17434/v1
25+contextWindow: 16384
26+
27+sessions:
28+ enabled: true
29+ dir: .mm/sessions
30+ # /memory <words>, for you.
31+ searchMemory: true
32+ # search_memory, for the model.
33+ autoSearchMemory: true
34+
35+# Writing files (config.go…) is enough to show the decisions being used; no
36+# bash, so the model cannot wander off grepping the session files.
37+yolo: true
38+bashTool: false
39+editTools: true
40+planTool: false
41+askUserTool: false
42+skillsDir: no-skills
43+
44+agentsMd:
45+ enabled: false
46+
47+sampling:
48+ temperature: 0.0
49+ parallel_tool_calls: false
50+ max_tokens: 2048
51+ chat_template_kwargs:
52+ enable_thinking: false
53+
54+maxTurns: 8
55+watchdogTimeout: 2m
56+firstTokenTimeout: 3m
57+displayCommands: true
58+
59+acp:
60+ name: bob
61+ title: 📚 Bob (bookshelf, with a memory)
62+
63+system: |
64+ Your name is Bob. You help build bookshelf, a small Go web app, in this
65+ directory. When the user asks you to write or create a file, call
66+ write_file with the whole content; do not only show the code.
67+
68+ Earlier conversations about this project are stored. When the user refers
69+ to something decided or said before ("the port we chose", "like last
70+ time", "what did we decide for…"), or asks how THIS project does
71+ something ("how do we handle…", "where are…", "which … do we use"), the
72+ answer is a choice made for this project (port, storage, schema, logs,
73+ errors, deployment…): call search_memory first with the key words, then
74+ answer from what it found and name the session it came from. Never
75+ invent a decision: if search_memory finds nothing, try other words once,
76+ then say you do not know.
77+
78+ For anything else (a greeting, a general Go question), answer directly,
79+ in the user's language, without search_memory.
added 04-memory/reset.sh +12 -0
new file mode 100755
@@ -0,0 +1,12 @@
1+#!/bin/sh
2+# reset.sh — puts the demo back as it ships: the four sessions of seed/ as the
3+# project's history, nothing else. Run it before the demo, and again to
4+# start over: every run adds its own session file, and the files the agent
5+# writes (*.go) are removed.
6+set -eu
7+cd "$(dirname "$0")"
8+rm -rf .mm
9+mkdir -p .mm/sessions
10+cp seed/*.json .mm/sessions/
11+rm -f ./*.go
12+echo "history reset: $(ls .mm/sessions | wc -l | tr -d ' ') stored session(s) in .mm/sessions"
new file mode 100755
@@ -0,0 +1,12 @@
1+#!/bin/sh
2+# reset.sh — puts the demo back as it ships: the four sessions of seed/ as the
3+# project's history, nothing else. Run it before the demo, and again to
4+# start over: every run adds its own session file, and the files the agent
5+# writes (*.go) are removed.
6+set -eu
7+cd "$(dirname "$0")"
8+rm -rf .mm
9+mkdir -p .mm/sessions
10+cp seed/*.json .mm/sessions/
11+rm -f ./*.go
12+echo "history reset: $(ls .mm/sessions | wc -l | tr -d ' ') stored session(s) in .mm/sessions"
added 04-memory/seed/20261005-091500-a1b2c3d4.json +48 -0
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261005-091500-a1b2c3d4",
3+ "cwd": ".",
4+ "createdAt": "2026-10-05T09:15:00Z",
5+ "updatedAt": "2026-10-05T09:40:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "ok, keep 8417. And the module name?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)."
44+ }
45+ ]
46+ }
47+ ]
48+}
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261005-091500-a1b2c3d4",
3+ "cwd": ".",
4+ "createdAt": "2026-10-05T09:15:00Z",
5+ "updatedAt": "2026-10-05T09:40:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "ok, keep 8417. And the module name?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)."
44+ }
45+ ]
46+ }
47+ ]
48+}
added 04-memory/seed/20261008-140000-b2c3d4e5.json +48 -0
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261008-140000-b2c3d4e5",
3+ "cwd": ".",
4+ "createdAt": "2026-10-08T14:00:00Z",
5+ "updatedAt": "2026-10-08T14:35:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Postgres or SQLite for the storage?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "How do we handle schema changes?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table."
44+ }
45+ ]
46+ }
47+ ]
48+}
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261008-140000-b2c3d4e5",
3+ "cwd": ".",
4+ "createdAt": "2026-10-08T14:00:00Z",
5+ "updatedAt": "2026-10-08T14:35:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Postgres or SQLite for the storage?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "How do we handle schema changes?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table."
44+ }
45+ ]
46+ }
47+ ]
48+}
added 04-memory/seed/20261012-101000-c3d4e5f6.json +48 -0
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261012-101000-c3d4e5f6",
3+ "cwd": ".",
4+ "createdAt": "2026-10-12T10:10:00Z",
5+ "updatedAt": "2026-10-12T10:30:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Quel format pour les logs ?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "Et les erreurs HTTP ?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique."
44+ }
45+ ]
46+ }
47+ ]
48+}
new file mode 100644
@@ -0,0 +1,48 @@
1+{
2+ "id": "20261012-101000-c3d4e5f6",
3+ "cwd": ".",
4+ "createdAt": "2026-10-12T10:10:00Z",
5+ "updatedAt": "2026-10-12T10:30:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "content": [
18+ {
19+ "text": "Quel format pour les logs ?"
20+ }
21+ ]
22+ },
23+ {
24+ "role": "model",
25+ "content": [
26+ {
27+ "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde."
28+ }
29+ ]
30+ },
31+ {
32+ "role": "user",
33+ "content": [
34+ {
35+ "text": "Et les erreurs HTTP ?"
36+ }
37+ ]
38+ },
39+ {
40+ "role": "model",
41+ "content": [
42+ {
43+ "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique."
44+ }
45+ ]
46+ }
47+ ]
48+}
added 04-memory/seed/20261015-163000-d4e5f6a7.json +54 -0
new file mode 100644
@@ -0,0 +1,54 @@
1+{
2+ "id": "20261015-163000-d4e5f6a7",
3+ "cwd": ".",
4+ "createdAt": "2026-10-15T16:30:00Z",
5+ "updatedAt": "2026-10-15T17:20:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "metadata": {
18+ "compact": "summary"
19+ },
20+ "content": [
21+ {
22+ "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept."
23+ }
24+ ]
25+ },
26+ {
27+ "role": "model",
28+ "metadata": {
29+ "compact": "summary"
30+ },
31+ "content": [
32+ {
33+ "text": "Understood — I will re-check files before editing them."
34+ }
35+ ]
36+ },
37+ {
38+ "role": "user",
39+ "content": [
40+ {
41+ "text": "Should the release be tagged?"
42+ }
43+ ]
44+ },
45+ {
46+ "role": "model",
47+ "content": [
48+ {
49+ "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"."
50+ }
51+ ]
52+ }
53+ ]
54+}
new file mode 100644
@@ -0,0 +1,54 @@
1+{
2+ "id": "20261015-163000-d4e5f6a7",
3+ "cwd": ".",
4+ "createdAt": "2026-10-15T16:30:00Z",
5+ "updatedAt": "2026-10-15T17:20:00Z",
6+ "messages": [
7+ {
8+ "role": "system",
9+ "content": [
10+ {
11+ "text": "You are Bob, the assistant of the bookshelf project."
12+ }
13+ ]
14+ },
15+ {
16+ "role": "user",
17+ "metadata": {
18+ "compact": "summary"
19+ },
20+ "content": [
21+ {
22+ "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept."
23+ }
24+ ]
25+ },
26+ {
27+ "role": "model",
28+ "metadata": {
29+ "compact": "summary"
30+ },
31+ "content": [
32+ {
33+ "text": "Understood — I will re-check files before editing them."
34+ }
35+ ]
36+ },
37+ {
38+ "role": "user",
39+ "content": [
40+ {
41+ "text": "Should the release be tagged?"
42+ }
43+ ]
44+ },
45+ {
46+ "role": "model",
47+ "content": [
48+ {
49+ "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"."
50+ }
51+ ]
52+ }
53+ ]
54+}