@agentikos/omega-os 0.19.38 → 0.19.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/bootstrap/lib/common.sh +19 -10
  2. package/bootstrap/templates/aisb/architect.md +27 -1
  3. package/bootstrap/templates/aisb/construct.md +27 -1
  4. package/bootstrap/templates/aisb/keymaker.md +27 -1
  5. package/bootstrap/templates/aisb/link.md +27 -1
  6. package/bootstrap/templates/aisb/lmc-protocol.md +27 -1
  7. package/bootstrap/templates/aisb/merovingian.md +27 -1
  8. package/bootstrap/templates/aisb/morpheus.md +27 -1
  9. package/bootstrap/templates/aisb/neo.md +27 -1
  10. package/bootstrap/templates/aisb/niobe.md +27 -1
  11. package/bootstrap/templates/aisb/oracle.md +27 -1
  12. package/bootstrap/templates/aisb/pythia.md +36 -0
  13. package/bootstrap/templates/aisb/seraph.md +27 -1
  14. package/bootstrap/templates/aisb/smith.md +27 -1
  15. package/bootstrap/templates/aisb/zion.md +27 -1
  16. package/omega/Agentik_Engine/omega_engine/__init__.py +1 -1
  17. package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  18. package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
  19. package/omega/Agentik_Engine/omega_engine/__pycache__/paperclip_bridge.cpython-313.pyc +0 -0
  20. package/omega/Agentik_Engine/omega_engine/__pycache__/prompt_audit.cpython-313.pyc +0 -0
  21. package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
  22. package/omega/Agentik_Engine/omega_engine/__pycache__/tui.cpython-313.pyc +0 -0
  23. package/omega/Agentik_Engine/omega_engine/cli.py +39 -0
  24. package/omega/Agentik_Engine/omega_engine/paperclip_bridge.py +110 -0
  25. package/omega/Agentik_Engine/omega_engine/prompt_audit.py +395 -0
  26. package/omega/Agentik_Engine/omega_engine/tmux.py +61 -26
  27. package/omega/Agentik_Engine/omega_engine/tui.py +293 -86
  28. package/omega/Agentik_Engine/pyproject.toml +1 -1
  29. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
  30. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
  31. package/omega/Agentik_Engine/tests/__pycache__/test_paperclip_status.cpython-313-pytest-8.4.2.pyc +0 -0
  32. package/omega/Agentik_Engine/tests/__pycache__/test_paperclip_status.cpython-313.pyc +0 -0
  33. package/omega/Agentik_Engine/tests/__pycache__/test_prompt_audit.cpython-313-pytest-8.4.2.pyc +0 -0
  34. package/omega/Agentik_Engine/tests/__pycache__/test_prompt_audit.cpython-313.pyc +0 -0
  35. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_palette.cpython-313-pytest-8.4.2.pyc +0 -0
  36. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_palette.cpython-313.pyc +0 -0
  37. package/omega/Agentik_Engine/tests/__pycache__/test_tui_runtime.cpython-313-pytest-8.4.2.pyc +0 -0
  38. package/omega/Agentik_Engine/tests/__pycache__/test_tui_runtime.cpython-313.pyc +0 -0
  39. package/omega/Agentik_Engine/tests/test_install_ux.py +87 -2
  40. package/omega/Agentik_Engine/tests/test_paperclip_status.py +142 -0
  41. package/omega/Agentik_Engine/tests/test_prompt_audit.py +281 -0
  42. package/omega/Agentik_Engine/tests/test_tmux_palette.py +94 -0
  43. package/omega/Agentik_Engine/tests/test_tui_runtime.py +156 -0
  44. package/omega/Agentik_SSOT/VERSION +1 -1
  45. package/omega/Agentik_SSOT/docs/AUDIT-V0.19.39.md +161 -0
  46. package/omega/Agentik_SSOT/docs/AUDIT-V0.19.40.md +163 -0
  47. package/omega/Agentik_SSOT/rules/audit-gates.md +189 -0
  48. package/omega/Agentik_SSOT/rules/constitution.md +7 -0
  49. package/omega/Agentik_SSOT/rules/orchestration.md +215 -0
  50. package/omega/Agentik_SSOT/rules/prompt-protocols.md +219 -0
  51. package/omega/Agentik_SSOT/rules/scope-safety.md +197 -0
  52. package/omega/Agentik_SSOT/rules/three-laws.md +214 -0
  53. package/omega/Agentik_SSOT/rules/verified-completion.md +216 -0
  54. package/package.json +1 -1
@@ -176,5 +176,161 @@ class TestPaperclipMenuIntegration(unittest.TestCase):
176
176
  f"arrow menu must wire {action} (user asked for it in v0.19.37)")
177
177
 
178
178
 
179
+ class TestChatFirstRedesign(unittest.TestCase):
180
+ """v0.19.39 — the TUI must open on CONVERSATIONS (live tmux sessions),
181
+ not on an action menu. Setup/config/infra/audits/scrape land in
182
+ sub-menus. These tests lock in the new layout so a careless refactor
183
+ doesn't bring back the v0.19.38 action-first menu."""
184
+
185
+ def test_conversations_section_appears_before_menu(self):
186
+ """The 'CONVERSATIONS' section header must appear in the source
187
+ BEFORE the 'MENU' sub-menu list — the redesign's whole point is
188
+ that chats are primary, settings are secondary. Match literal
189
+ ``_section("X")`` calls only (skip comments/docstrings)."""
190
+ import inspect
191
+ from omega_engine.tui import _arrow_menu
192
+ src = inspect.getsource(_arrow_menu)
193
+ conv_pos = src.find('_section("CONVERSATIONS")')
194
+ menu_pos = src.find('_section("MENU")')
195
+ self.assertGreater(conv_pos, 0,
196
+ "TUI must have a _section(\"CONVERSATIONS\") call")
197
+ self.assertGreater(menu_pos, 0,
198
+ "TUI must have a _section(\"MENU\") call for sub-menus")
199
+ self.assertLess(conv_pos, menu_pos,
200
+ "_section(\"CONVERSATIONS\") must render BEFORE _section(\"MENU\") "
201
+ "— the chat-first redesign requires it (v0.19.39)")
202
+
203
+ def test_dot_status_indicators_present(self):
204
+ """Each conversation row must show a status dot ● (alive) / ○
205
+ (off). Without dots the user can't tell which chats are running."""
206
+ import inspect
207
+ from omega_engine.tui import _arrow_menu
208
+ src = inspect.getsource(_arrow_menu)
209
+ for dot in ("●", "○"):
210
+ self.assertIn(dot, src,
211
+ f"menu must use {dot} status dot for live/off chats")
212
+ # The helper that renders dots must exist.
213
+ self.assertIn("_dot(", src,
214
+ "menu must have a _dot() helper for status indicators")
215
+
216
+ def test_submenu_dispatch_present(self):
217
+ """The new sub-menu pattern (`submenu:audits`, `submenu:setup`,
218
+ `submenu:infra`, `submenu:health`, `submenu:paperclip`) must be
219
+ wired AND the dispatch must handle them via _open_submenu()."""
220
+ import inspect
221
+ from omega_engine.tui import _arrow_menu
222
+ src = inspect.getsource(_arrow_menu)
223
+ for sub in ("submenu:audits", "submenu:setup", "submenu:infra",
224
+ "submenu:health", "submenu:paperclip"):
225
+ self.assertIn(sub, src,
226
+ f"menu must declare {sub} as a sub-menu entry")
227
+ # The dispatch must indirect through _open_submenu.
228
+ self.assertIn("_open_submenu(", src,
229
+ "main loop must call _open_submenu() to render sub-menus")
230
+ # Sub-menu items provider exists.
231
+ self.assertIn("_submenu_items(", src,
232
+ "sub-menu rendering must use a _submenu_items() factory")
233
+
234
+ def test_attach_action_handler_present(self):
235
+ """The new `attach:<session>` action lets the user jump into a
236
+ live Oracle or Worker tmux session directly from the menu."""
237
+ import inspect
238
+ from omega_engine.tui import _arrow_menu
239
+ src = inspect.getsource(_arrow_menu)
240
+ self.assertIn('action.startswith("attach:")', src,
241
+ "menu must handle attach:<session> actions to let the user "
242
+ "jump into live Oracle/Worker sessions")
243
+ # Should use tmux select-window OR switch-client.
244
+ self.assertTrue(
245
+ "switch-client" in src or "select-window" in src,
246
+ "attach handler must use tmux select-window / switch-client")
247
+
248
+ def test_omega_window_alive_helper_used(self):
249
+ """The TUI status dots for AISB / Hermès rely on the
250
+ tmux.omega_window_alive() helper added in v0.19.39 — without it
251
+ we have no way to know if those windows are running."""
252
+ import inspect
253
+ from omega_engine.tui import _arrow_menu
254
+ src = inspect.getsource(_arrow_menu)
255
+ self.assertIn("omega_window_alive", src,
256
+ "menu must call tmux.omega_window_alive() to render the "
257
+ "AISB / Hermès status dots")
258
+
259
+ def test_paperclip_status_dot_inline_in_main_menu(self):
260
+ """The Paperclip dashboard row in QUICK ACTIONS must show a
261
+ live status dot — the user must see at-a-glance whether the
262
+ Paperclip daemon is running."""
263
+ import inspect
264
+ from omega_engine.tui import _arrow_menu
265
+ src = inspect.getsource(_arrow_menu)
266
+ self.assertIn("_paperclip_status_quick", src,
267
+ "menu must use the inline Paperclip probe to render its dot")
268
+ # Must integrate the new chantier-4 is_running() probe.
269
+ self.assertIn("paperclip_bridge", src)
270
+
271
+
272
+ class TestPixelPalette(unittest.TestCase):
273
+ """Pixel/CRT amber palette — colour137 family. Locks in the
274
+ replacement of the Claude cream/orange palette with a retro-CRT
275
+ amber accent that inherits the terminal background, matching the
276
+ look-and-feel reference from agentik-os/tmux-claude."""
277
+
278
+ def test_amber_constant_defined(self):
279
+ """`AMBER` must be declared in `_arrow_menu` — it's the new
280
+ primary accent color (xterm 256 colour137 = amber gold)."""
281
+ import inspect
282
+ from omega_engine.tui import _arrow_menu
283
+ src = inspect.getsource(_arrow_menu)
284
+ self.assertIn("AMBER", src,
285
+ "_arrow_menu must declare AMBER (the new colour137 accent)")
286
+
287
+ def test_colour137_in_fzf_args(self):
288
+ """The fzf `--color=` block must use the xterm `colour137`
289
+ named amber — that's the look-and-feel reference."""
290
+ import inspect
291
+ from omega_engine.tui import _arrow_menu
292
+ src = inspect.getsource(_arrow_menu)
293
+ self.assertIn("colour137", src,
294
+ "fzf --color= block must use colour137 (amber gold) — "
295
+ "the pixel/CRT palette references it explicitly")
296
+
297
+ def test_no_claude_cream_orange_in_fzf(self):
298
+ """The old Claude cream `#FAFAF7` background must NOT appear in
299
+ `_arrow_menu` anymore — the new palette inherits the terminal
300
+ background (`bg:-1`) for a transparent retro feel."""
301
+ import inspect
302
+ from omega_engine.tui import _arrow_menu
303
+ src = inspect.getsource(_arrow_menu)
304
+ self.assertNotIn("#FAFAF7", src,
305
+ "_arrow_menu must NOT contain Claude cream #FAFAF7 — "
306
+ "the new palette inherits the terminal background")
307
+
308
+ def test_orange_aliased_to_amber(self):
309
+ """Backward-compat: `ORANGE` must alias `AMBER` so existing
310
+ references (`_section`, `_label`, prompts) keep working with
311
+ only a color change, no logic change."""
312
+ import inspect
313
+ from omega_engine.tui import _arrow_menu
314
+ src = inspect.getsource(_arrow_menu)
315
+ # Tolerate any reasonable spacing around `=`.
316
+ import re
317
+ self.assertRegex(src, r"ORANGE\s*=\s*AMBER",
318
+ "ORANGE must alias AMBER (backward-compat for existing "
319
+ "_section/_label/prompt code)")
320
+
321
+
322
+ class TestOmegaWindowAliveHelper(unittest.TestCase):
323
+ """tmux.omega_window_alive() — the helper the chat-first TUI uses
324
+ to know whether AISB-chat / Hermès-chat are running."""
325
+
326
+ def test_returns_false_when_no_omega_session(self):
327
+ """When the Omega master tmux session is dead, ANY window query
328
+ must return False — never raise."""
329
+ from omega_engine.tmux import omega_window_alive
330
+ # Use a definitely-unique window name to avoid colliding with
331
+ # any real session the developer might have running.
332
+ self.assertIsInstance(omega_window_alive("____nonexistent_xyz"), bool)
333
+
334
+
179
335
  if __name__ == "__main__":
180
336
  unittest.main()
@@ -1 +1 @@
1
- 0.19.38
1
+ 0.19.40
@@ -0,0 +1,161 @@
1
+ # OmegaOS v0.19.39 — chat-first TUI + rules folder + prompt audit + Paperclip live sync
2
+
3
+ > 4 parallel chantiers landed in one ship.
4
+ > The user's invariant: *"l'utilisateur, une fois qu'il a setup tout l'outil
5
+ > OmegaOS, doit être 100% fonctionnel. Il n'a rien à faire à part l'utiliser."*
6
+
7
+ ## 1. What changed
8
+
9
+ | Chantier | Owner | Files touched | Net effect |
10
+ |---|---|---|---|
11
+ | **#1 TUI redesign (chat-first)** | main session | `tui.py` (+200 lines), `tmux.py` (+14 lines), `tests/test_tui_runtime.py` (+87 lines) | The TUI opens on CONVERSATIONS (AISB / Hermès / live Oracles / live Workers with ●/○ status dots) instead of an action menu. Everything else collapses into **MENU** with sub-menus. |
12
+ | **#2 Rules folder** | background agent | `omega/Agentik_SSOT/rules/{three-laws,orchestration,prompt-protocols,audit-gates,scope-safety,verified-completion}.md` (6 new files, 1250 lines), `constitution.md` (+frontmatter only) | The rule set every LLM CLI reads is now COMPLETE. 7 files, YAML-frontmatter envelope, full cross-references, ~1300 lines total. No fabrication — every protocol sourced from existing docs. |
13
+ | **#3 Prompt audit + doctor sections** | background agent | `omega_engine/prompt_audit.py` (395 lines, new), `tests/test_prompt_audit.py` (199 lines, new), `cli.py` (+39 lines) | New `omega doctor` sections `prompts` and `orchestration`. The audit scores each agent role /100 against Three Laws + LMC + `.done.json` references. Surfaces real drift (current suite average 52/100). |
14
+ | **#4 Paperclip live status** | background agent | `omega_engine/paperclip_bridge.py` (+`is_running()` + `PaperclipStatus`), `tests/test_paperclip_status.py` (new) | TUI can show ●/○ next to "Paperclip dashboard" with the live port. 3-tier probe (pidfile → port-scan → none), ≤0.3s worst case, never raises. |
15
+ | **#5 Integration + ship** | main session | `package.json`, `pyproject.toml`, `__init__.py`, `VERSION`, this doc | Version bump, commit, push, npm publish. |
16
+ | **#6 Role-prompt enrichment** | follow-up (NOT in this ship) | — | The doctor surfaces 10 weak role prompts; enriching them to ≥80/100 is intentionally deferred — the audit infrastructure is what we needed. |
17
+
18
+ ## 2. The new TUI (chat-first)
19
+
20
+ ```
21
+ ── CONVERSATIONS ──
22
+ ● AISB master claude (Max OAuth)
23
+ ○ Hermès claude (Anthropic API)
24
+
25
+ — Active Oracles (2) —
26
+ ● Causio-oracle-2 project: Causio
27
+ ● DentistryGPT-oracle project: DentistryGPT
28
+ — Active Workers (1) —
29
+ ● DentistryGPT-worker-3-ux-fix task: ux-fix
30
+
31
+ ── QUICK ACTIONS ──
32
+ + New AISB chat fresh session
33
+ + New Hermès chat fresh session
34
+ + New project Genesis pipeline
35
+ Run a mission verified completion
36
+ ○ Paperclip dashboard not running
37
+
38
+ ── MENU ──
39
+ Quality Arsenal 17 forensic audits
40
+ Setup & config LLM: claude_code
41
+ Infrastructure sessions, scrape
42
+ Health checks doctor, status
43
+ Paperclip governance register, status
44
+
45
+ ── EXIT ──
46
+ Detach session keeps running
47
+ Quit Omega kills the tmux session
48
+ ```
49
+
50
+ **Picking any conversation row** (Oracle / Worker / AISB / Hermès) attaches to
51
+ that tmux session via `tmux select-window` (for Omega windows) or
52
+ `tmux switch-client` (for foreign sessions). One click → in the conversation.
53
+
54
+ **Sub-menus** open in cascaded fzf with `← back` exit rows.
55
+
56
+ ## 3. The rules folder — what an LLM now reads at runtime
57
+
58
+ ```
59
+ omega/Agentik_SSOT/rules/
60
+ ├── constitution.md (frontmatter: priority=1) — the Prime Principle
61
+ ├── three-laws.md (priority=2) — operational discipline per law
62
+ ├── orchestration.md (priority=3) — L0-L5 dispatch hierarchy
63
+ ├── prompt-protocols.md (priority=4) — brief/done/blocked schemas + LMC
64
+ ├── audit-gates.md (priority=5) — 17 Quality Arsenal audits as gates
65
+ ├── scope-safety.md (priority=6) — files_owned + Sacred Scopes
66
+ └── verified-completion.md (priority=7) — done_clean contract + third-party rule
67
+ ```
68
+
69
+ These files are mirrored into every LLM's persona dir at install time
70
+ (via `step_personas` from v0.19.38). So whether the operator runs
71
+ `claude`, `gemini`, `codex`, `qwen`, or `opencode` inside an AISB chat,
72
+ they ALL see the same complete rule set — no per-LLM drift.
73
+
74
+ ## 4. The new `omega doctor` output (sections that didn't exist before)
75
+
76
+ ```
77
+ omega doctor — OMEGA_HOME=…/Omega
78
+
79
+ -- personas -- (NEW in v0.19.38)
80
+ [ok] canonical: Agentik_SSOT/personas/OMEGAOS-CONTEXT.md (3402B)
81
+ [ok] chat-contexts/aisb-master/: 8 persona files
82
+ [ok] chat-contexts/hermes/: 8 persona files
83
+
84
+ -- prompts -- (NEW in v0.19.39)
85
+ [ok] CLAUDE: 90/100
86
+ [warn] morpheus: 75/100 — missing: LMC protocol
87
+ [warn] link: 65/100 — missing: LMC protocol
88
+ [FAIL] oracle: 45/100 — missing: LMC protocol, `.done.json` contract
89
+ [warn] average suite score: 52.0/100
90
+ [warn] weak prompts (<60): architect, construct, keymaker, …
91
+
92
+ -- orchestration -- (NEW in v0.19.39)
93
+ [ok] AISB master prompt
94
+ [ok] Oracle role prompt
95
+ [ok] Worker-class prompts
96
+ [ok] Checker prompts (Seraph/Smith)
97
+ [ok] LMC protocol document
98
+ [warn] shared `.done.json` vocab: 33% of agents
99
+ ```
100
+
101
+ The 52/100 average is **real drift**, not a bug. Most role prompts rely
102
+ on the engine's `load_agent_prompt()` to concatenate `lmc-protocol.md`
103
+ at spawn time, so the on-disk role file is silent. The audit makes that
104
+ drift VISIBLE — an operator editing `oracle.md` now has a clear signal
105
+ that the contract is implicit. Enriching the role files to score ≥80
106
+ is chantier #6, deferred to v0.19.40.
107
+
108
+ ## 5. Paperclip status integration
109
+
110
+ `omega_engine.paperclip_bridge.is_running()` returns a `PaperclipStatus`
111
+ with `running: bool, pid, port, url, detection`. Three detection paths:
112
+
113
+ | # | Method | Latency | Hint emitted in TUI |
114
+ |---|---|---|---|
115
+ | 1 | `~/.paperclip/run/dashboard.pid` + `os.kill(pid, 0)` | ~5ms | `localhost:8080` |
116
+ | 2 | TCP connect 127.0.0.1:8080, 0.2s timeout | ≤200ms | `localhost:8080` |
117
+ | 3 | Neither — fall through | <1ms | `not running` |
118
+
119
+ The TUI's QUICK ACTIONS row renders a ●/○ dot using this probe — the
120
+ user sees at-a-glance whether their Paperclip governance daemon is live.
121
+
122
+ ## 6. Multi-agent integration — the user's question, answered with code
123
+
124
+ | Question (from the user's brief) | Answer | File reference |
125
+ |---|---|---|
126
+ | Multi-agents bien setup? | ✅ 14 agents (Hermès + 13 AISB) — templates landed at install via `step_aisb_suite`; persona context mirrored to all 10 LLM filenames via `step_personas`. | `bootstrap/lib/steps.sh:279-293` + `omega_engine/personas.py` |
127
+ | Tmux orchestration AISB/Oracle/Workers? | ✅ Session naming convention parsed by `tmux.categorize()`; TUI now LISTS them with status dots and one-click attach. | `omega_engine/tmux.py:47-90` + `tui.py:528-557` |
128
+ | Rules respectés pour chaque LLM? | ✅ 7 rule files at `Agentik_SSOT/rules/` are mirrored to every LLM persona dir; doctor's `prompts` section verifies role files reference them. | `Agentik_SSOT/rules/*.md` + `omega doctor prompts` |
129
+ | Dossier maître linké pour le LLM? | ✅ `Agentik_SSOT/personas/OMEGAOS-CONTEXT.md` is the canonical; `Agentik_SSOT/agents/aisb/CLAUDE.md` is the AISB master; both auto-mirrored to per-LLM filenames (CLAUDE.md, GEMINI.md, AGENTS.md, QWEN.md, .opencode/CONTEXT.md, …) at install time. | `step_personas` from v0.19.38 |
130
+ | Tout setup à l'install, rien à faire post-install? | ✅ Install steps 25 (aisb-suite), 37 (hermes-brief), 38 (personas) all eager-seed. `npx -y @agentikos/omega-os@latest --full` is sufficient. | `install.sh STEPS[]` |
131
+ | Visibilité sur ce qui se passe? | ✅ TUI chat-first view + `omega doctor` 23 sections (incl. NEW personas/prompts/orchestration). | `tui.py::_arrow_menu` + `cli.py::cmd_doctor` |
132
+
133
+ ## 7. Tests (regression-locked)
134
+
135
+ | Chantier | New tests | Suite total |
136
+ |---|---|---|
137
+ | Baseline (v0.19.38) | — | 627 passed |
138
+ | #1 TUI chat-first | +7 (TestChatFirstRedesign + TestOmegaWindowAliveHelper) | +7 |
139
+ | #3 Prompt audit | +5 (full-score, missing-laws, banned-phrases, real-suite, real-orchestration) | +5 |
140
+ | #4 Paperclip status | +5 (no-pidfile, stale-pidfile, live-pidfile, port-scan, url-field) | +5 |
141
+ | **v0.19.39 total** | **+17 new** | **644 passed, 0 regressions** |
142
+
143
+ Chantier #2 (rules folder) is documentation-only — no Python code, no tests
144
+ needed; format validated by manual grep + YAML parse.
145
+
146
+ ## 8. Verdict
147
+
148
+ ✅ TUI is now **conversation-first** as the user requested ("L'objectif…
149
+ c'est d'avoir une interface extrêmement simple… cette interface permet de
150
+ voir la conversation avec AISB… ensuite, de voir les conversations avec
151
+ les oracles et les conversations avec les workers").
152
+ ✅ Setup/config/audits/scrape/governance moved to sub-menus reachable via
153
+ **MENU** (one row).
154
+ ✅ Paperclip dashboard has a live status dot and is reachable in one pick.
155
+ ✅ Rules folder is COMPLETE (7 files, 1301 lines, cross-referenced).
156
+ ✅ `omega doctor` now surfaces the orchestration health (prompts + chain).
157
+ ✅ No regression in existing 627 tests.
158
+
159
+ The user's "il n'a rien à faire à part l'utiliser" invariant is preserved:
160
+ one `npx -y @agentikos/omega-os@latest --full` and the new menu, the new
161
+ rules, the new audit, and the live Paperclip indicator are all in place.
@@ -0,0 +1,163 @@
1
+ # OmegaOS v0.19.40 — pixel/tmux-claude design + progress bar fix + AISB roles enriched
2
+
3
+ > Four parallel chantiers + one main-session chantier. Total: 5 deliverables, 660 tests passing.
4
+ > Reference design: github.com/agentik-os/tmux-claude — adopted verbatim where applicable.
5
+
6
+ ## 1. What changed
7
+
8
+ | Chantier | Owner | Effect |
9
+ |---|---|---|
10
+ | **2A — progress bar fix** | agent | `_full_progress` was incrementing `STEP_COUNT` on BOTH `run` AND `ok` phases → counter ran to 2× STEP_TOTAL → bar hit 200% → newline spawned mid-install. Now: only `ok`/`skip` increment. The `\r`-driven single-line overwrite works as designed. |
11
+ | **2B — pixel tmux palette** | agent | Replaced Claude cream/orange (`#FAFAF7` / `#D97757`) with tmux-claude's amber `colour137` palette. Window list HIDDEN (`window-status-format ''`). Status bar with bullets `•`. Popups full-screen (`-w 100% -h 100%`). Paste-deadlock fixes, kill forensics, smart-scroll all preserved. |
12
+ | **2C — pixel fzf palette** | agent | Omega menu's fzf colors swapped to CRT amber: `bg:-1` (inherits terminal), `fg:default`, accents `colour137`/`colour215`. Backward-compat alias `ORANGE = AMBER` keeps existing `_section`/`_label` calls working. |
13
+ | **6 — AISB role enrichment** | main session | 14 AISB role prompts enriched with a uniform "THREE LAWS + Operating Contract" block. Adds LAW 3 (autonomous execution), names LMC protocol path, references `.done.json` + done-marker tooling, requires fresh-context handoff. Per-role tier customization (Manager / Worker / Checker / Watcher). |
14
+
15
+ ## 2. Audit numbers — before / after
16
+
17
+ **Prompt audit suite scores (v0.19.39 → v0.19.40):**
18
+
19
+ | Role | Tier | Before | After |
20
+ |---|---|---:|---:|
21
+ | CLAUDE (master) | Lead | 90 | 90 |
22
+ | morpheus | Worker | 75 | **100** |
23
+ | link | Worker | 65 | **100** |
24
+ | neo | Worker | 65 | **100** |
25
+ | zion | Worker | 65 | **100** |
26
+ | seraph | Checker | 55 | **100** |
27
+ | oracle | Manager | 45 | **100** |
28
+ | architect | Worker | 45 | **100** |
29
+ | construct | Worker | 45 | **100** |
30
+ | keymaker | Worker | 45 | **100** |
31
+ | merovingian | Worker | 45 | **100** |
32
+ | niobe | Worker | 45 | **100** |
33
+ | smith | Worker | 45 | **100** |
34
+ | pythia | Watcher | 5 | **100** |
35
+ | lmc-protocol (doc) | Reference | 45 | **85** |
36
+ | **Average** | | **52.0** | **98.3** |
37
+ | **shared `.done.json` vocab overlap** | | 33% | **100%** |
38
+
39
+ ## 3. The Operating Contract every role now embeds
40
+
41
+ ```markdown
42
+ ## Operating Contract
43
+
44
+ You are a **<TIER>** in the **LMC (Lead-Manager-Checker) protocol** — see
45
+ `Agentik_SSOT/agents/aisb/lmc-protocol.md` for the full spec.
46
+
47
+ **Tier responsibility**: <one-line per-role>
48
+
49
+ **Verified completion** — you NEVER declare your own work done. The engine
50
+ derives completion from a `.done.json` signal you emit via:
51
+
52
+ ~/.aisb/lib/<MARKER> # writes .done.json with status + evidence
53
+
54
+ Status ∈ {done_clean, pending, failed}. If genuinely blocked (Third-Law
55
+ fallback), write worker-blocked-<session>.json + execute the fallback —
56
+ never sit idle.
57
+
58
+ **Fresh-context handoff** — every brief MUST be self-contained:
59
+ Mission / Purpose / Context / Done Criteria / Verify Command.
60
+ ```
61
+
62
+ Per-role tiers:
63
+ - **Manager** (Oracle) — `oracle-mark-done.sh`
64
+ - **Workers** (Morpheus, Construct, Architect, Keymaker, Niobe, Smith, Merovingian, Neo, Link, Zion) — `worker-mark-done.sh`
65
+ - **Checker** (Seraph) — `worker-mark-done.sh`
66
+ - **Watcher** (Pythia, read-only) — `worker-mark-done.sh`, status=`pending` for human review
67
+
68
+ ## 4. The new tmux look (tmux-claude alignment)
69
+
70
+ **Before** (Claude cream/orange):
71
+ ```
72
+ status-style "bg=#FAFAF7,fg=#3D3929"
73
+ status-left "#[fg=#D97757,bold]Ω #S #[fg=#A8A29E]│ "
74
+ status-right "#[fg=#88837A]%H:%M │ <count> sessions"
75
+ ```
76
+
77
+ **After** (tmux-claude amber):
78
+ ```
79
+ status-style "fg=default" # inherits terminal background
80
+ status-left ' #[fg=colour137,bold]Ω #S #[fg=default,nobold]• #[fg=colour137]#(omega tmux count) sess #[fg=default]• #[fg=colour137]%H:%M '
81
+ status-right '#[fg=default]CPU #[fg=colour137]<cpu>% #[fg=default]• #[fg=colour137]Ω v<version> '
82
+
83
+ setw -g window-status-format '' # hide window list
84
+ setw -g window-status-current-format ''
85
+ setw -g window-status-separator ''
86
+
87
+ bind-key Z display-popup -E -w 100% -h 100% "omega tmux menu" # was 80%
88
+ bind-key -n M-/ display-popup -E -w 100% -h 100% "omega tmux switcher"
89
+
90
+ set -g pane-active-border-style "fg=colour137"
91
+ set -g message-style "fg=colour137,bg=default,bold"
92
+ set -g mode-style "fg=default,bg=colour137"
93
+ ```
94
+
95
+ `bind-key -n M-z` keeps spawning the Omega session (unchanged).
96
+
97
+ ## 5. The fzf menu palette (Omega TUI)
98
+
99
+ **ANSI constants in `_arrow_menu`** (with backward-compat alias):
100
+ ```python
101
+ AMBER = "\033[38;5;137m" # xterm 256 colour137 — amber gold
102
+ AMBER_BR = "\033[38;5;215m" # bright amber for highlighted rows
103
+ MUTED = "\033[38;5;240m" # dim gray
104
+ ORANGE = AMBER # alias — keeps existing code working
105
+ ```
106
+
107
+ **fzf `--color=` block:**
108
+ ```
109
+ bg:-1, fg:default, # inherit terminal background (no cream)
110
+ bg+:#1c1c1c, fg+:colour215, # dark highlight bar, bright amber on selection
111
+ hl/hl+/prompt/pointer/marker/header/border/info/spinner: colour137/215,
112
+ gutter:-1
113
+ ```
114
+
115
+ ## 6. Tests (regression-locked)
116
+
117
+ | Chantier | New tests | Suite total |
118
+ |---|---|---|
119
+ | v0.19.39 baseline | — | 644 |
120
+ | 2A progress bar (3 new) | +3 | 647 |
121
+ | 2C fzf palette (4 new) | +4 | 651 |
122
+ | 2B tmux palette (4 new) | +4 | 655 |
123
+ | 6 role enrichment (5 new) | +5 | **660** |
124
+
125
+ **Regression locks for role enrichment:**
126
+ - `test_every_aisb_role_scores_at_least_80` — floor: 80/100 per role
127
+ - `test_average_suite_score_at_least_85` — floor: 85.0 average (current 98.3)
128
+ - `test_done_json_vocab_overlap_at_least_80_percent` — floor: 80% (current 100%)
129
+ - `test_every_role_references_lmc_protocol` — direct grep check
130
+ - `test_every_role_references_three_laws` — LAW 3 mandatory
131
+
132
+ ## 7. Progress bar — before / after (the actual UX)
133
+
134
+ **Before** (`STEP_TOTAL=21` but `STEP_COUNT` reaches 42):
135
+ ```
136
+ Installing… ███████████████████ 21/21 100% step_aisb_suite
137
+ Installing… ███████████████████ 22/21 104% step_audit_skills ← newline mid-install
138
+ Installing… ███████████████████ 23/21 109% step_engine
139
+
140
+ ```
141
+
142
+ **After** (count only on `ok`/`skip`):
143
+ ```
144
+ Installing… ██████████████████░░ 18/21 85% step_clis ← single line, no scroll noise
145
+ ```
146
+
147
+ (then on the very last `ok` of the run, ONE newline so the post-install card prints cleanly)
148
+
149
+ ## 8. Verdict
150
+
151
+ ✅ TUI menu (fzf) — **pixel/CRT amber palette**, terminal bg inherited.
152
+ ✅ Tmux config — **tmux-claude design adopted** (colour137 amber, bullets, hidden window list, full-screen popups).
153
+ ✅ Install progress bar — **stays on one line**, no newline spawn.
154
+ ✅ AISB role prompts — **average 98.3/100** (was 52.0), every role references the LMC protocol + `.done.json` + Three Laws + done-marker + fresh-context.
155
+ ✅ `omega doctor prompts` section — surfaces healthy scores, drift detection live.
156
+ ✅ 660 tests passing, 0 regressions.
157
+
158
+ Next steps (deferred to v0.19.41+, in order):
159
+ - **Convex install step** — bundle Convex CLI, scaffold a starter project with Claude Code SDK + Google SDK + A2A schema
160
+ - **Tmux popup-based menu** — replace inline fzf with `display-popup -E -w 100% -h 100%` like tmux-claude's `session-manager-v2`
161
+ - **Status-bar cache daemon** — match tmux-claude's `/tmp/tmux-status-cache/` pattern to avoid subprocess spawning during paste
162
+
163
+ The user's invariant remains: `npx -y @agentikos/omega-os@latest --full` and the system is 100% functional.