pantheon-opencode 1.5.0-beta.15 → 1.5.0-beta.16

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.
package/AGENTS.md CHANGED
@@ -301,7 +301,9 @@ memory_store({
301
301
  agreements: ["point1", "point2"],
302
302
  divergences: [{"issue": "...", "resolution": "..."}],
303
303
  response_rate: "X of Y",
304
- themis_audit: "approved|issues"
304
+ themis_audit: "approved|issues",
305
+ precedent_used: false,
306
+ timestamp: "<ISO-8601>"
305
307
  },
306
308
  metadata: {
307
309
  type: "council_decision",
@@ -310,6 +312,7 @@ memory_store({
310
312
  }
311
313
  })
312
314
  ```
315
+ `value` is JSON-serialized before storing (the MCP `memory_store.value` argument is a string).
313
316
 
314
317
  ### Read Path (Precedent Fast-Path)
315
318
  Before dispatching a new council, Zeus runs:
@@ -320,8 +323,8 @@ memory_search(question, top_k=2, namespace="council_decisions")
320
323
  Result interpretation:
321
324
  | Score | Age | Action |
322
325
  |-------|-----|--------|
323
- | > 0.85 | < 30 days | Return precedent as fast-path answer. Skip council dispatch entirely. |
324
- | > 0.85 | >= 30 days | Return with warning "Reavaliar se contexto mudou" + proceed with council |
326
+ | > 0.85 | < 30 days | Return precedent verbatim (note "⚠️ Decisão de [data] — reavaliar se contexto mudou") as fast-path answer. Skip council dispatch entirely. |
327
+ | > 0.85 | >= 30 days | Return with warning "Reavaliar se contexto mudou — decisão tem mais de 30 dias" + proceed with council |
325
328
  | 0.5 - 0.85 | Any | Include as context for specialists but still dispatch council |
326
329
  | < 0.5 | Any | Ignore, proceed with fresh council |
327
330
 
@@ -371,7 +374,7 @@ You MUST self-monitor for these stall conditions:
371
374
  | Symptom | Detection Rule | Recovery Action |
372
375
  |---------|---------------|-----------------|
373
376
  | Silent loop | 3+ consecutive turns with no tool call AND no visible progress | Output `[STALL_DETECTED]` and re-read your task definition. If still stuck, escalate to user with: "I appear to be stuck on [task]. Options: (1) retry with different approach, (2) delegate to specialist, (3) simplify scope." |
374
- | Delegation black hole | Agent dispatched but no response after 2x the timeout from routing.yml | Log the hang, cancel via `cancel_task`, dispatch to fallback agent, report to user |
377
+ | Delegation black hole | Agent dispatched but no response after 2x the timeout from routing.yml | Log the hang, cancel via `cancel_task`, then follow the fallback chain in `## ⏱️ Timeout & Retry Enforcement` |
375
378
  | Circular delegation | Same specialist re-dispatched for same task 2+ times without progress | Break cycle: dispatch to different specialist OR escalate to user |
376
379
  | Idle after completion | All background tasks completed but no synthesis/next step for 2+ turns | Force synthesis: summarize all completed results and propose next action |
377
380
  | Context thrash | Re-reading same files repeatedly without new action | Stop re-reading. State: "Already have context on [file]. Proceeding with [action]." |
@@ -397,9 +400,7 @@ When a delegation fails (timeout, empty response, error):
397
400
 
398
401
  2. **Retry ONCE** with rephrased prompt — add: "Previous attempt failed with: [error]. Adjusted approach: [what changed]."
399
402
 
400
- 3. **If retry also fails** → DO NOT retry a third time blindly. Instead:
401
- - Dispatch to fallback agent (from routing.yml)
402
- - If no fallback, escalate to user with: "Task [X] failed after retry. Options: (a) simplify, (b) different agent, (c) manual intervention."
403
+ 3. **If retry also fails** → do NOT retry blindly; follow the fallback chain and escalation protocol in `## ⏱️ Timeout & Retry Enforcement`.
403
404
 
404
405
  ## Progress Checkpoint
405
406
 
@@ -564,10 +565,7 @@ sequenceDiagram
564
565
  ## Dispatch Sequence (9-Step Protocol)
565
566
 
566
567
  ### Step 0 — Precedent Fast-Path (Fase 1)
567
- Before any dispatch: `memory_search(query, top_k=2, namespace="council_decisions")`
568
- - Score > 0.85 AND age < 30 days → return precedent verbatim with note "⚠️ Decisão de [data] — reavaliar se contexto mudou". SKIP entire dispatch.
569
- - Score > 0.85 AND age > 30 days → return precedent with ⚠️ "Reavaliar se contexto mudou — decisão tem mais de 30 dias"
570
- - Else → proceed to Step 0b
568
+ Run the precedent read path defined in `## Memory Protocol > Council Decisions Namespace` (`memory_search(query, top_k=2, namespace="council_decisions")`). If no precedent applies, proceed to Step 0b.
571
569
 
572
570
  ### Step 0b — Apollo Pre-Scan (Fase 2, --research flag)
573
571
  If `/pantheon --research <question>`: dispatch @apollo with 30s timeout. Inject findings as `shared_context` into ALL specialist prompts. Skip if flag absent.
@@ -669,33 +667,11 @@ task(subagent_type: "themis", prompt: "Audit this council synthesis for fidelity
669
667
  - If issues → fix each issue before delivering to user
670
668
 
671
669
  ### Step 9 — Persist & Reconcile (Fase 1)
672
- ```
673
- memory_store({
674
- namespace: "council_decisions",
675
- key: "council:<yyyy-mm-dd>:<slug>",
676
- value: JSON.stringify({
677
- question, specialists, recommendation, confidence,
678
- agreements, divergences, precedent_used, timestamp
679
- }),
680
- metadata: {type: "council_decision", specialist_count: N}
681
- })
682
- board.markReconciled("<task-id>")
683
- ```
670
+ Persist the decision using the write path in `## Memory Protocol > Council Decisions Namespace`, then `board.markReconciled("<task-id>")`.
684
671
 
685
672
  ## Specialist Output Format (Fase 1 — machine-parseable structured fields)
686
673
 
687
- Specialists MUST return these structured fields in their response:
688
-
689
- ```
690
- ## specialist_response
691
- **position:** <clear one-sentence position>
692
- **reasoning:** <2-4 sentences>
693
- **trade_offs:** <what's gained vs lost>
694
- **risks:** <what could go wrong>
695
- **confidence:** High | Medium | Low
696
- **agreement_signals:** agree: @agent1, @agent2 on [issue] | disagree: @agent3 on [issue]
697
- **specific_claims:** <count of specific factual claims in response>
698
- ```
674
+ Specialists MUST return the structured `## specialist_response` format (position, reasoning, trade_offs, risks, confidence, agreement_signals, specific_claims) defined in `## Agent Return Format > Council Specialist Response Format`.
699
675
 
700
676
  ## Domain-to-Specialist Mapping
701
677
 
@@ -928,39 +904,14 @@ ANY NO → full task (IMPL artifact + Themis review mandatory)
928
904
  3. **No Themis dependency** — output doesn't feed into a phase that requires review
929
905
 
930
906
  ## Subtask Return Format
931
- Expect a `subtask_summary` response with:
932
- ```
933
- ## subtask_summary
934
- **files_changed:** [paths]
935
- **summary:** What was done
936
- **tests:** ✅ or N/A
937
- **status:** complete | partial | escalated
938
- ```
907
+ Return the standard `## subtask_summary` defined in `## Agent Return Format` (files_changed, summary, tests, coverage, tokens, status, blockers).
939
908
 
940
909
  ## Timeout Parcial (Partial Results)
941
910
 
942
- Timeout parcial is ONLY for read-only, independent agents:
943
- - ✅ @apollo — can return partial file list ("found 7 of 12 files before timeout")
944
- - ✅ @gaia — can return partial literature findings
945
-
946
- - ✅ @talos — can confirm progress if hotfix times out
947
- - ❌ Never for implementers or reviewers — must complete or fail
948
-
949
- When dispatching with partial-OK, set expectation:
950
- ```
951
- @apollo Search for auth files. Timeout parcial OK — return whatever you have.
952
- ```
911
+ Only agents marked ✅ in the Timeout Behavior table above may return partial results: @apollo (partial file list, e.g. "found 7 of 12 files before timeout"), @gaia (partial literature findings) and @talos (confirm progress if a hotfix times out). Never for implementers or reviewers — they must complete or fail. When dispatching with partial-OK, set the expectation: `@apollo Search for auth files. Timeout parcial OK — return whatever you have.`
953
912
 
954
913
  ---
955
914
 
956
915
  # 📊 TIMEOUT TRACKING
957
916
 
958
- Maintain awareness of in-flight delegations:
959
-
960
- | Agent | Timeout | Status | Partial OK? |
961
- |-------|---------|--------|-------------|
962
- | @apollo | 60s | ✅ complete | ✅ |
963
- | @hermes | 180s | ⏳ in progress | ❌ |
964
- | @themis | 120s | ⏳ in progress | ❌ |
965
-
966
- Log timeouts to `/memories/session/timeout-log.md` for later analysis.
917
+ Track in-flight delegations against the Timeout Behavior table above. Log timeouts to `/memories/session/timeout-log.md` for later analysis.
package/CHANGELOG.md CHANGED
@@ -18,6 +18,33 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
18
18
 
19
19
  ## ✅ Closed Issues
20
20
 
21
+ ## [v1.5.0-beta.16] - 2026-09-15
22
+
23
+ &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
24
+ move this section to a versioned entry and reset the template below. --&gt;
25
+
26
+ ## 🆕 What's New
27
+
28
+ - **Modernização CI/supply-chain:** 22 actions SHA-pinadas; `gitleaks-action` v3
29
+ (fix crítico — a v2 morria com Node 20 em 2026-09-16) com CLI 8.30.1; cache
30
+ npm/pip; Dependabot; CodeQL `+python` e `codeql-config`; permissões reduzidas
31
+ no `docs.yml`; job `version-check` fundido no `validate`; `upload-artifact` v7
32
+ e `download-artifact` v8.
33
+ - **Lean:** ~17 módulos mortos removidos de `src/pantheon/`, docs/scripts
34
+ obsoletos, `teste/`/`testes/`, `Dockerfile`/`docker-compose` (de outro projeto)
35
+ e caches; ~38% dos arquivos de teste removidos/consolidados; testes mínimos
36
+ readicionados para os módulos vivos (tool-ceiling, native-probe).
37
+ - **Instructions:** deduplicação das instruções compartilhadas — contexto menor
38
+ sem perder nenhuma regra.
39
+
40
+ ## 🐞 Fixed
41
+
42
+ - **2 flakes determinísticos eliminados:** TTL do MCP persistence
43
+ (`test_ttl_expiry_real_time`) e `logger.test.mjs` deixaram de depender de
44
+ timing/carga do host.
45
+ - **Refs stale corrigidas:** referências de versão/ambiente atualizadas para
46
+ Node 22+.
47
+
21
48
  ## [v1.5.0-beta.15] - 2026-09-15
22
49
 
23
50
  &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
package/README.md CHANGED
@@ -172,8 +172,7 @@ script's SHA-256 without regenerating it.
172
172
  covering OpenCode V1/V2 side by side — see
173
173
  [Sandbox validation](#sandbox-validation-v1v2).
174
174
  - Beta2 agent-economy policy: direct native delegation, bounded compaction
175
- carry-forward, compact context encoding, and quality floors — see
176
- [Beta2 agent economy policy](docs/ws3-token-opt-measurements.md#beta2-agent-economy-policy).
175
+ carry-forward, compact context encoding, and quality floors.
177
176
  - A `--prompts` installer flag is planned for a future release.
178
177
 
179
178
  ## OpenCode V1/V2 — Dual Version (1.5.0-beta.2)
package/README.pt-BR.md CHANGED
@@ -31,7 +31,7 @@ de planejar o trabalho, avançar, conferir resultados e preservar o contexto
31
31
 
32
32
  ## Comece em 2 minutos
33
33
 
34
- Requisitos: [OpenCode 1.18.4+](https://opencode.ai/docs/) e Node.js 18+.
34
+ Requisitos: [OpenCode 1.18.4+](https://opencode.ai/docs/) e Node.js 22+.
35
35
 
36
36
  No projeto em que você quer usar o Pantheon:
37
37
 
@@ -9,41 +9,7 @@ agent: zeus
9
9
  **When:** Architecture trade-offs, technology selection, security assessments, multi-stakeholder concerns
10
10
  **Returns:** Structured synthesis with recommendation, confidence level, resolved divergences
11
11
 
12
- ## Dispatch Selection
13
-
14
- Choose 2-3 agents based on domain:
15
-
16
- | Domain | Specialists |
17
- |--------|-------------|
18
- | Architecture | hermes, demeter, themis, athena |
19
- | Security | themis, hermes, prometheus, nyx |
20
- | Database | demeter, hermes, prometheus |
21
- | AI/RAG | hephaestus, nyx |
22
- | Infrastructure | prometheus, hermes, themis |
23
- | Frontend/UX | aphrodite, themis, hermes |
24
- | Observability | nyx, hermes |
25
- | General | athena, themis, hermes |
26
-
27
- Send ALL `task()` calls in a single message. Each must return: Recommendation · Reasoning · Trade-offs · Risks · Confidence.
28
-
29
- ## Synthesis Structure
30
-
31
- After ALL responses arrive, produce EXACTLY this structure:
32
-
33
- ### 📋 Individual Assessments
34
- For each specialist: Recommendation, Reasoning, Trade-offs, Risks, Confidence
35
-
36
- ### ✅ Agreements
37
- Where 2+ specialists converge
38
-
39
- ### ⚡ Divergences
40
- Where they disagree — resolve each one with reasoning
41
-
42
- ### 🔥 Total Divergence
43
- If ALL specialists disagree on a point, call this out explicitly
44
-
45
- ### 🏆 Recommendation
46
- Decisive conclusion with confidence level
12
+ Dispatch, specialist selection, and synthesis follow the canonical `## Zeus Council Synthesis` protocol (Steps 0–9: precedent fast-path, dispatch, confidence cross-validation, rebuttal, tie-break, Themis audit, persist). Send ALL `task()` calls in a single message; each specialist returns the `## specialist_response` structure from `## Agent Return Format`.
47
13
 
48
14
  ## Question:
49
15
  $ARGUMENTS
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pantheon-opencode",
3
- "version": "1.5.0-beta.15",
3
+ "version": "1.5.0-beta.16",
4
4
  "description": "Multi-agent orchestration for OpenCode — 14 specialized agents, TDD, Themis review gates.",
5
5
  "type": "module",
6
6
  "publishConfig": {
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pantheon",
3
3
  "publisher": "ils15",
4
- "version": "1.5.0-beta.15",
4
+ "version": "1.5.0-beta.16",
5
5
  "displayName": "Pantheon",
6
6
  "description": "Conductor-Delegate orchestration platform with 14 specialized agents, 21 skills, and OpenCode support.",
7
7
  "agents": "./src/agents",
package/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "setuptools.backends._legacy:_Backend"
4
4
 
5
5
  [project]
6
6
  name = "pantheon"
7
- version = "1.5.0-beta.15"
7
+ version = "1.5.0-beta.16"
8
8
  description = "Multi-agent orchestration framework"
9
9
  requires-python = ">=3.11"
10
10
  dependencies = []
@@ -84,7 +84,9 @@ memory_store({
84
84
  agreements: ["point1", "point2"],
85
85
  divergences: [{"issue": "...", "resolution": "..."}],
86
86
  response_rate: "X of Y",
87
- themis_audit: "approved|issues"
87
+ themis_audit: "approved|issues",
88
+ precedent_used: false,
89
+ timestamp: "<ISO-8601>"
88
90
  },
89
91
  metadata: {
90
92
  type: "council_decision",
@@ -93,6 +95,7 @@ memory_store({
93
95
  }
94
96
  })
95
97
  ```
98
+ `value` is JSON-serialized before storing (the MCP `memory_store.value` argument is a string).
96
99
 
97
100
  ### Read Path (Precedent Fast-Path)
98
101
  Before dispatching a new council, Zeus runs:
@@ -103,8 +106,8 @@ memory_search(question, top_k=2, namespace="council_decisions")
103
106
  Result interpretation:
104
107
  | Score | Age | Action |
105
108
  |-------|-----|--------|
106
- | > 0.85 | < 30 days | Return precedent as fast-path answer. Skip council dispatch entirely. |
107
- | > 0.85 | >= 30 days | Return with warning "Reavaliar se contexto mudou" + proceed with council |
109
+ | > 0.85 | < 30 days | Return precedent verbatim (note "⚠️ Decisão de [data] — reavaliar se contexto mudou") as fast-path answer. Skip council dispatch entirely. |
110
+ | > 0.85 | >= 30 days | Return with warning "Reavaliar se contexto mudou — decisão tem mais de 30 dias" + proceed with council |
108
111
  | 0.5 - 0.85 | Any | Include as context for specialists but still dispatch council |
109
112
  | < 0.5 | Any | Ignore, proceed with fresh council |
110
113
 
@@ -15,7 +15,7 @@ You MUST self-monitor for these stall conditions:
15
15
  | Symptom | Detection Rule | Recovery Action |
16
16
  |---------|---------------|-----------------|
17
17
  | Silent loop | 3+ consecutive turns with no tool call AND no visible progress | Output `[STALL_DETECTED]` and re-read your task definition. If still stuck, escalate to user with: "I appear to be stuck on [task]. Options: (1) retry with different approach, (2) delegate to specialist, (3) simplify scope." |
18
- | Delegation black hole | Agent dispatched but no response after 2x the timeout from routing.yml | Log the hang, cancel via `cancel_task`, dispatch to fallback agent, report to user |
18
+ | Delegation black hole | Agent dispatched but no response after 2x the timeout from routing.yml | Log the hang, cancel via `cancel_task`, then follow the fallback chain in `## ⏱️ Timeout & Retry Enforcement` |
19
19
  | Circular delegation | Same specialist re-dispatched for same task 2+ times without progress | Break cycle: dispatch to different specialist OR escalate to user |
20
20
  | Idle after completion | All background tasks completed but no synthesis/next step for 2+ turns | Force synthesis: summarize all completed results and propose next action |
21
21
  | Context thrash | Re-reading same files repeatedly without new action | Stop re-reading. State: "Already have context on [file]. Proceeding with [action]." |
@@ -41,9 +41,7 @@ When a delegation fails (timeout, empty response, error):
41
41
 
42
42
  2. **Retry ONCE** with rephrased prompt — add: "Previous attempt failed with: [error]. Adjusted approach: [what changed]."
43
43
 
44
- 3. **If retry also fails** → DO NOT retry a third time blindly. Instead:
45
- - Dispatch to fallback agent (from routing.yml)
46
- - If no fallback, escalate to user with: "Task [X] failed after retry. Options: (a) simplify, (b) different agent, (c) manual intervention."
44
+ 3. **If retry also fails** → do NOT retry blindly; follow the fallback chain and escalation protocol in `## ⏱️ Timeout & Retry Enforcement`.
47
45
 
48
46
  ## Progress Checkpoint
49
47
 
@@ -85,10 +85,7 @@ sequenceDiagram
85
85
  ## Dispatch Sequence (9-Step Protocol)
86
86
 
87
87
  ### Step 0 — Precedent Fast-Path (Fase 1)
88
- Before any dispatch: `memory_search(query, top_k=2, namespace="council_decisions")`
89
- - Score > 0.85 AND age < 30 days → return precedent verbatim with note "⚠️ Decisão de [data] — reavaliar se contexto mudou". SKIP entire dispatch.
90
- - Score > 0.85 AND age > 30 days → return precedent with ⚠️ "Reavaliar se contexto mudou — decisão tem mais de 30 dias"
91
- - Else → proceed to Step 0b
88
+ Run the precedent read path defined in `## Memory Protocol > Council Decisions Namespace` (`memory_search(query, top_k=2, namespace="council_decisions")`). If no precedent applies, proceed to Step 0b.
92
89
 
93
90
  ### Step 0b — Apollo Pre-Scan (Fase 2, --research flag)
94
91
  If `/pantheon --research <question>`: dispatch @apollo with 30s timeout. Inject findings as `shared_context` into ALL specialist prompts. Skip if flag absent.
@@ -190,33 +187,11 @@ task(subagent_type: "themis", prompt: "Audit this council synthesis for fidelity
190
187
  - If issues → fix each issue before delivering to user
191
188
 
192
189
  ### Step 9 — Persist & Reconcile (Fase 1)
193
- ```
194
- memory_store({
195
- namespace: "council_decisions",
196
- key: "council:<yyyy-mm-dd>:<slug>",
197
- value: JSON.stringify({
198
- question, specialists, recommendation, confidence,
199
- agreements, divergences, precedent_used, timestamp
200
- }),
201
- metadata: {type: "council_decision", specialist_count: N}
202
- })
203
- board.markReconciled("<task-id>")
204
- ```
190
+ Persist the decision using the write path in `## Memory Protocol > Council Decisions Namespace`, then `board.markReconciled("<task-id>")`.
205
191
 
206
192
  ## Specialist Output Format (Fase 1 — machine-parseable structured fields)
207
193
 
208
- Specialists MUST return these structured fields in their response:
209
-
210
- ```
211
- ## specialist_response
212
- **position:** <clear one-sentence position>
213
- **reasoning:** <2-4 sentences>
214
- **trade_offs:** <what's gained vs lost>
215
- **risks:** <what could go wrong>
216
- **confidence:** High | Medium | Low
217
- **agreement_signals:** agree: @agent1, @agent2 on [issue] | disagree: @agent3 on [issue]
218
- **specific_claims:** <count of specific factual claims in response>
219
- ```
194
+ Specialists MUST return the structured `## specialist_response` format (position, reasoning, trade_offs, risks, confidence, agreement_signals, specific_claims) defined in `## Agent Return Format > Council Specialist Response Format`.
220
195
 
221
196
  ## Domain-to-Specialist Mapping
222
197
 
@@ -126,39 +126,14 @@ ANY NO → full task (IMPL artifact + Themis review mandatory)
126
126
  3. **No Themis dependency** — output doesn't feed into a phase that requires review
127
127
 
128
128
  ## Subtask Return Format
129
- Expect a `subtask_summary` response with:
130
- ```
131
- ## subtask_summary
132
- **files_changed:** [paths]
133
- **summary:** What was done
134
- **tests:** ✅ or N/A
135
- **status:** complete | partial | escalated
136
- ```
129
+ Return the standard `## subtask_summary` defined in `## Agent Return Format` (files_changed, summary, tests, coverage, tokens, status, blockers).
137
130
 
138
131
  ## Timeout Parcial (Partial Results)
139
132
 
140
- Timeout parcial is ONLY for read-only, independent agents:
141
- - ✅ @apollo — can return partial file list ("found 7 of 12 files before timeout")
142
- - ✅ @gaia — can return partial literature findings
143
-
144
- - ✅ @talos — can confirm progress if hotfix times out
145
- - ❌ Never for implementers or reviewers — must complete or fail
146
-
147
- When dispatching with partial-OK, set expectation:
148
- ```
149
- @apollo Search for auth files. Timeout parcial OK — return whatever you have.
150
- ```
133
+ Only agents marked ✅ in the Timeout Behavior table above may return partial results: @apollo (partial file list, e.g. "found 7 of 12 files before timeout"), @gaia (partial literature findings) and @talos (confirm progress if a hotfix times out). Never for implementers or reviewers — they must complete or fail. When dispatching with partial-OK, set the expectation: `@apollo Search for auth files. Timeout parcial OK — return whatever you have.`
151
134
 
152
135
  ---
153
136
 
154
137
  # 📊 TIMEOUT TRACKING
155
138
 
156
- Maintain awareness of in-flight delegations:
157
-
158
- | Agent | Timeout | Status | Partial OK? |
159
- |-------|---------|--------|-------------|
160
- | @apollo | 60s | ✅ complete | ✅ |
161
- | @hermes | 180s | ⏳ in progress | ❌ |
162
- | @themis | 120s | ⏳ in progress | ❌ |
163
-
164
- Log timeouts to `/memories/session/timeout-log.md` for later analysis.
139
+ Track in-flight delegations against the Timeout Behavior table above. Log timeouts to `/memories/session/timeout-log.md` for later analysis.
@@ -9,7 +9,7 @@ absent/fails.
9
9
  Only the standard library (``json`` + ``re``) — prohibited: external
10
10
  gateway, generative embedding.
11
11
 
12
- Encoding rules (mirrored byte-for-byte by ``src/pantheon/toon-codec.ts``):
12
+ Encoding rules:
13
13
 
14
14
  - Scalars: ``None``/``True``/``False`` → ``null``/``true``/``false``;
15
15
  numbers → shortest form; strings bare when unambiguous, else
@@ -20,8 +20,7 @@ Encoding rules (mirrored byte-for-byte by ``src/pantheon/toon-codec.ts``):
20
20
  - Lists of scalars: ``- item`` lines; empty list → ``[]``.
21
21
  - Lists of dicts with uniform keys: ``@table k1|k2`` header + ``v1|v2``
22
22
  rows (savings are per payload class — ~11% on content-dominated board
23
- records up to ~47% on large tabular checkpoints — see
24
- ``docs/ws3-token-opt-measurements.md`` for the reproducible table).
23
+ records up to ~47% on large tabular checkpoints).
25
24
  - Dict values never need quoting for ``:`` (split is on the FIRST colon);
26
25
  list items / top-level scalars that look like ``key: ...`` are quoted.
27
26
  """
@@ -471,7 +470,6 @@ def toon_size_report(value: Any) -> dict[str, Any]:
471
470
  Reports BOTH chars and tokens: token ratios on tiny payloads suffer
472
471
  ceiling bias (``ceil`` rounds 161→41 vs 143→36), so the char columns are
473
472
  the honest basis and the token columns show what metering will debit.
474
- Per-class numbers: see ``docs/ws3-token-opt-measurements.md``.
475
473
  """
476
474
  compact_json = json.dumps(value, ensure_ascii=False, separators=(",", ":"))
477
475
  toon = toon_encode(value)
@@ -165,7 +165,7 @@ async function detectVersion(api) {
165
165
  if (ver) return ver;
166
166
  }
167
167
  } catch {}
168
- return "1.5.0-beta.15";
168
+ return "1.5.0-beta.16";
169
169
  }
170
170
  /**
171
171
  * usage-bar — AI subscription usage gauge for the opencode TUI.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pantheon-tui",
3
- "version": "1.5.0-beta.15",
3
+ "version": "1.5.0-beta.16",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pantheon-tui",
9
- "version": "1.5.0-beta.15",
9
+ "version": "1.5.0-beta.16",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@opencode-ai/plugin": ">=1.14.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pantheon-tui",
3
3
  "type": "module",
4
- "version": "1.5.0-beta.15",
4
+ "version": "1.5.0-beta.16",
5
5
  "description": "Pantheon TUI plugin — sidebar (version, preset, sessions, real-time delegations) + AI subscription usage gauges incl. OpenCode Go/Zen dollar limits (vendored, MIT)",
6
6
  "license": "MIT",
7
7
  "exports": {
@@ -1,48 +0,0 @@
1
- #!/usr/bin/env bash
2
- # dev-tui.sh — load the Pantheon TUI from the repo (src/plugins/tui) WITHOUT publishing.
3
- #
4
- # Flow: build the bundle → register the repo's absolute path in
5
- # .opencode/tui.json (read by the OpenCode TUI loader) → restart hint.
6
- # It deliberately does NOT touch opencode.json: that file is packaged and
7
- # merged into user configs by the installer, so a repo-relative path would
8
- # leak into third-party installs and break the CI package gates.
9
- #
10
- # Usage: scripts/dev-tui.sh [--test]
11
- # --test also run the full repo test suite (npm run test:all) after build.
12
- set -euo pipefail
13
-
14
- ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
15
- TUI_DIR="$ROOT/src/plugins/tui"
16
- TUI_JSON="$ROOT/.opencode/tui.json"
17
-
18
- command -v npm >/dev/null 2>&1 || { echo "error: npm not found in PATH" >&2; exit 1; }
19
- [ -d "$TUI_DIR" ] || { echo "error: TUI source not found: $TUI_DIR" >&2; exit 1; }
20
-
21
- echo "==> TUI dev source: $TUI_DIR"
22
-
23
- # 1. Install pinned deps + build dist/tui.js (the bundle is the only load path).
24
- echo "==> Installing TUI dev dependencies (npm ci)"
25
- npm ci --prefix "$TUI_DIR" --ignore-scripts --no-audit --no-fund
26
-
27
- echo "==> Building TUI plugin"
28
- npm run build --prefix "$TUI_DIR"
29
-
30
- # 2. Optional: full suite to match the CI gate before opening a PR.
31
- if [[ "${1:-}" == "--test" ]]; then
32
- echo "==> Running full test suite (npm run test:all)"
33
- npm run test:all
34
- fi
35
-
36
- # 3. Register the repo path in the project tui.json (absolute, gitignored).
37
- # Reuses the installer's registerPlugin so the array is merged, not clobbered.
38
- echo "==> Registering repo TUI path in $TUI_JSON"
39
- ROOT="$ROOT" TUI_JSON="$TUI_JSON" TUI_DIR="$TUI_DIR" node --input-type=module <<'NODE'
40
- const { registerPlugin } = await import(`${process.env.ROOT}/scripts/install/plugin.mjs`)
41
- const result = registerPlugin(process.env.TUI_JSON, process.env.TUI_DIR)
42
- console.log(`${result}: ${process.env.TUI_DIR}`)
43
- NODE
44
-
45
- # 4. Restart hint + dev-mode caveat.
46
- echo "==> Done. Restart OpenCode to load the rebuilt TUI plugin."
47
- echo " Dev mode caveat: do NOT run 'init' in this repo while iterating — it"
48
- echo " removes repo path refs as stale. If you do, re-run scripts/dev-tui.sh."