pantheon-opencode 1.6.0-beta.7 → 1.6.0-beta.9

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 (66) hide show
  1. package/AGENTS.md +58 -15
  2. package/CHANGELOG.md +61 -94
  3. package/README.md +81 -103
  4. package/README.pt-BR.md +19 -37
  5. package/commands/pantheon-audit.md +7 -1
  6. package/commands/pantheon-consolidate.md +1 -1
  7. package/commands/pantheon-focus.md +17 -0
  8. package/package.json +1 -2
  9. package/plugin.json +2 -2
  10. package/pyproject.toml +1 -1
  11. package/scripts/build-agents-md.mjs +2 -3
  12. package/scripts/doctor.mjs +22 -104
  13. package/scripts/hooks/scan-secrets.sh +97 -0
  14. package/scripts/install/config-migration.mjs +9 -42
  15. package/scripts/install/interactive.mjs +1 -1
  16. package/scripts/install/opencode.mjs +174 -77
  17. package/scripts/install/plugin.mjs +43 -9
  18. package/scripts/install/strings.mjs +0 -8
  19. package/scripts/probe-pantheon-cost.mjs +3 -16
  20. package/scripts/sync-artifacts.mjs +1 -0
  21. package/scripts/sync-tui.mjs +24 -3
  22. package/scripts/test-opencode-v2-sandbox.sh +203 -786
  23. package/scripts/validate-sandbox-install.mjs +138 -0
  24. package/skills-lock.json +4 -5
  25. package/src/agents/aphrodite.md +2 -9
  26. package/src/agents/demeter.md +0 -9
  27. package/src/agents/gaia.md +1 -0
  28. package/src/agents/hephaestus.md +0 -9
  29. package/src/agents/hermes.md +2 -9
  30. package/src/agents/mnemosyne.md +18 -53
  31. package/src/agents/prometheus.md +0 -9
  32. package/src/agents/themis.md +0 -1
  33. package/src/agents/zeus.md +180 -19
  34. package/src/instructions/agent-return-format.instructions.md +48 -3
  35. package/src/instructions/memory-protocol.instructions.md +8 -9
  36. package/src/instructions/zeus-anti-stall.instructions.md +54 -6
  37. package/src/instructions/zeus-council-synthesis.instructions.md +71 -0
  38. package/src/instructions/zeus-memory-operations.instructions.md +4 -4
  39. package/src/instructions/zeus-timeout-retry.instructions.md +81 -7
  40. package/src/pantheon/v2-delegation-enforce.ts +2 -1
  41. package/src/plugin-v2.ts +251 -168
  42. package/src/plugins/pantheon-hooks.ts +35 -82
  43. package/src/plugins/tui/dist/tui-v2.d.ts +9 -0
  44. package/src/plugins/tui/dist/tui-v2.d.ts.map +1 -0
  45. package/src/plugins/tui/dist/tui-v2.js +151 -0
  46. package/src/plugins/tui/dist/tui-v2.js.map +1 -0
  47. package/src/plugins/tui/dist/tui.d.ts.map +1 -1
  48. package/src/plugins/tui/dist/tui.js +29 -53
  49. package/src/plugins/tui/index-v2.ts +6 -0
  50. package/src/plugins/tui/package-lock.json +5411 -1292
  51. package/src/plugins/tui/package.json +10 -7
  52. package/src/plugins/tui/src/index-v2.tsx +108 -0
  53. package/src/plugins/tui/src/index.tsx +28 -63
  54. package/src/plugins/tui/src/opencode-v2.d.ts +13 -0
  55. package/src/plugins/tui/tsdown.config.ts +2 -2
  56. package/src/plugins/tui/tui-v2.ts +2 -0
  57. package/src/plugins/tui/tui.ts +3 -0
  58. package/src/routing.yml +4 -2
  59. package/src/skills/README.md +7 -12
  60. package/src/skills/agent-coordination/SKILL.md +83 -13
  61. package/src/skills/auto-continue/SKILL.md +13 -14
  62. package/src/skills/context-compression/SKILL.md +26 -879
  63. package/src/skills/session-goal/SKILL.md +14 -5
  64. package/src/pantheon/secret-scanner.ts +0 -489
  65. package/src/plugins/tui/README.md +0 -14
  66. package/src/skills/council-synthesis/SKILL.md +0 -29
@@ -1,19 +1,23 @@
1
1
  {
2
2
  "name": "pantheon-tui",
3
3
  "type": "module",
4
- "version": "1.6.0-beta.7",
5
- "description": "Pantheon TUI plugin — sidebar (version, preset, sessions, real-time delegations) + AI subscription usage gauges incl. OpenCode Go/Zen dollar limits (vendored, MIT)",
4
+ "version": "1.6.0-beta.9",
5
+ "description": "Pantheon TUI plugin — V1 rich sidebar and usage gauges; native V2 status, session and delegation sidebar",
6
6
  "license": "MIT",
7
7
  "engines": {
8
8
  "node": "^22.22.2 || ^24.15.0 || >=26.0.0"
9
9
  },
10
10
  "exports": {
11
11
  "./tui": "./dist/tui.js",
12
+ "./tui-v2": "./dist/tui-v2.js",
12
13
  "./server": "./dist/server.js"
13
14
  },
14
15
  "files": [
15
16
  "dist",
16
- "src"
17
+ "src",
18
+ "tui.ts",
19
+ "tui-v2.ts",
20
+ "index-v2.ts"
17
21
  ],
18
22
  "scripts": {
19
23
  "build": "tsdown",
@@ -22,8 +26,6 @@
22
26
  "peerDependencies": {
23
27
  "@opencode-ai/plugin": "1.18.33",
24
28
  "@opencode-ai/sdk": "1.18.33",
25
- "@opentui/core": "0.5.10",
26
- "@opentui/solid": "0.5.10",
27
29
  "solid-js": "1.9.12"
28
30
  },
29
31
  "devDependencies": {
@@ -39,8 +41,9 @@
39
41
  "//overrides": "TUI production advisory fixes: Babel >=7.29.6 and Seroval >=1.6.3; Solid stays at 1.9.12 to satisfy OpenTUI's exact peer. Remove only after upstream ranges include fixed versions; Seroval compatibility is covered by the Solid serializer regression test.",
40
42
  "dependencies": {
41
43
  "@opencode-ai/plugin": "1.18.33",
42
- "@opentui/core": "0.5.10",
43
- "@opentui/solid": "0.5.10",
44
+ "@opencode/plugin": "2.0.26",
45
+ "@opentui/core": "0.5.17",
46
+ "@opentui/solid": "0.5.17",
44
47
  "solid-js": "1.9.12"
45
48
  }
46
49
  }
@@ -0,0 +1,108 @@
1
+ // biome-ignore-all lint/suspicious/noExplicitAny: OpenCode V2 exposes its TUI API at runtime.
2
+ /** @jsxImportSource @opentui/solid */
3
+
4
+ import { Plugin } from '@opencode/plugin/tui'
5
+ import { createMemo, createSignal, For, onCleanup, onMount, Show } from 'solid-js'
6
+
7
+ const SINGLETON = Symbol.for('pantheon.tui.v2.loaded')
8
+
9
+ function Sidebar(props: { context: any; sessionID?: string }) {
10
+ const { context } = props
11
+ const [revision, setRevision] = createSignal(0)
12
+ const location = context.location ?? context.data.location.default()
13
+
14
+ const session = createMemo(() => {
15
+ revision()
16
+ return props.sessionID ? context.data.session.get(props.sessionID) : undefined
17
+ })
18
+ const branch = createMemo(() => {
19
+ revision()
20
+ const info = context.data.location.vcs.info(location)
21
+ return info?.branch?.current ?? null
22
+ })
23
+ const delegations = createMemo(() => {
24
+ revision()
25
+ const id = props.sessionID
26
+ if (!id) return []
27
+ const family: string[] = context.data.session.family(id) ?? []
28
+ return family
29
+ .filter((childID) => childID !== id)
30
+ .map((childID) => context.data.session.get(childID))
31
+ .filter((child: any) => child?.parentID === id)
32
+ .slice(0, 6)
33
+ })
34
+
35
+ onMount(() => {
36
+ const stop: Array<() => void> = []
37
+ for (const type of [
38
+ 'session.created',
39
+ 'session.updated',
40
+ 'session.status',
41
+ 'session.deleted',
42
+ ]) {
43
+ try {
44
+ stop.push(context.data.on(type, () => setRevision((value) => value + 1)))
45
+ } catch {
46
+ // Sidebar remains useful with the initial cached state if an event is unavailable.
47
+ }
48
+ }
49
+ if (props.sessionID) {
50
+ void context.data.session.sync(props.sessionID).then(() => setRevision((value) => value + 1))
51
+ }
52
+ void context.data.location.vcs.sync(location).then(() => setRevision((value) => value + 1))
53
+ onCleanup(() => {
54
+ for (const unsubscribe of stop) unsubscribe()
55
+ })
56
+ })
57
+
58
+ const text = () => context.theme.text?.base
59
+ const muted = () => context.theme.text?.muted ?? text()
60
+
61
+ return (
62
+ <box flexDirection="column" width="100%" padding={1}>
63
+ <text fg={text()} attributes={1}>{`Pantheon v${__PANTHEON_VERSION__}`}</text>
64
+ <text fg={muted()}>OpenCode V2 · plugin TUI ativo</text>
65
+ <Show when={branch()}>{(value) => <text fg={muted()}>{`Branch: ${value()}`}</text>}</Show>
66
+ <Show when={session()} fallback={<text fg={muted()}>Nenhuma sessão selecionada</text>}>
67
+ {(current) => (
68
+ <>
69
+ <text fg={text()}>{`Sessão: ${current().title || current().id}`}</text>
70
+ <Show when={current().agent}>
71
+ <text fg={muted()}>{`Agente: ${current().agent}`}</text>
72
+ </Show>
73
+ </>
74
+ )}
75
+ </Show>
76
+ <Show when={delegations().length > 0}>
77
+ <text fg={text()} attributes={1}>
78
+ Delegações
79
+ </text>
80
+ <For each={delegations()}>
81
+ {(child: any) => <text fg={muted()}>{`· ${child.title || child.id}`}</text>}
82
+ </For>
83
+ </Show>
84
+ </box>
85
+ )
86
+ }
87
+
88
+ const plugin = Plugin.define({
89
+ id: 'pantheon.tui',
90
+ setup(context: any) {
91
+ const globalState = globalThis as unknown as Record<PropertyKey, unknown>
92
+ if (globalState[SINGLETON]) return
93
+ globalState[SINGLETON] = true
94
+
95
+ const unregister = context.ui.slot({
96
+ append: 'sidebar.content',
97
+ render: ({ sessionID }: { sessionID?: string }) => (
98
+ <Sidebar context={context} sessionID={sessionID} />
99
+ ),
100
+ })
101
+ return () => {
102
+ if (typeof unregister === 'function') unregister()
103
+ delete globalState[SINGLETON]
104
+ }
105
+ },
106
+ })
107
+
108
+ export default plugin
@@ -5,9 +5,9 @@
5
5
  /**
6
6
  * pantheon-tui — Pantheon TUI plugin for opencode.
7
7
  *
8
- * Bundled entry: `tsdown` emits `dist/tui.js`, and the package `exports`
9
- * (`./tui` → ./dist/tui.js, `./server` → ./dist/server.js) is the ONLY load
10
- * path — no raw TSX copy is shipped. Because the bundle inlines relative
8
+ * V1 bundle: `tsdown` emits `dist/tui.js`, re-exported by root `tui.ts`.
9
+ * OpenCode V2 uses the separate `src/index-v2.tsx` entry and native CLI plugin
10
+ * API. No raw TSX implementation is shipped. Because the bundle inlines relative
11
11
  * imports, this entry may be split into modules without breaking the loader.
12
12
  *
13
13
  * Slots:
@@ -740,27 +740,12 @@ async function loadConfig(configPath: string | undefined): Promise<UsageBarConfi
740
740
  }
741
741
  }
742
742
 
743
- /** Vendored usage-bar plugin init: reads config, seeds the kv cache, registers
744
- * the `app_bottom` slot, then starts the poll loop. Skips everything (and
743
+ /** Vendored usage-bar plugin init: reads config, seeds the kv cache, starts
744
+ * the poll loop and registers the `app_bottom` slot. Skips everything (and
745
745
  * registers nothing) when no provider is enabled — mirrors the standalone
746
746
  * plugin's early return. */
747
747
  async function setupUsageBar(api: TuiPluginApi) {
748
- let disposed = false
749
- let clockInterval: ReturnType<typeof setInterval> | undefined
750
- const pollTimeouts = new Set<ReturnType<typeof setTimeout>>()
751
-
752
- // This optional feature owns timers independently from the sidebar. A slow
753
- // config read may finish after shutdown, so register cleanup before awaiting
754
- // anything and check the disposed flag at every async boundary.
755
- api.lifecycle.onDispose(() => {
756
- disposed = true
757
- if (clockInterval !== undefined) clearInterval(clockInterval)
758
- for (const timeout of pollTimeouts) clearTimeout(timeout)
759
- pollTimeouts.clear()
760
- })
761
-
762
748
  const config = await loadConfig(api.state.path?.config)
763
- if (disposed) return
764
749
  if (api.state.path?.state) opencodeAuthFile = join(api.state.path.state, 'auth.json')
765
750
 
766
751
  const enabled = providers.filter((p) => config.providers[p.id].enabled)
@@ -777,6 +762,28 @@ async function setupUsageBar(api: TuiPluginApi) {
777
762
  const [byStatus, setByStatus] = createSignal<Record<string, StatusIndicator>>({})
778
763
  const [now, setNow] = createSignal(Date.now())
779
764
 
765
+ setInterval(() => setNow(Date.now()), 1_000)
766
+
767
+ for (const p of enabled) {
768
+ const cfg = config.providers[p.id]
769
+ const poll = async () => {
770
+ // Fetch usage and status concurrently; status pages are CDN-backed and
771
+ // never throttle, so we poll them on the same cadence as usage.
772
+ const statusP = config.showStatus && p.statusUrl ? fetchStatus(p.statusUrl) : null
773
+ const [all, status] = await Promise.all([p.fetchUsage(cfg), statusP])
774
+ if (all) {
775
+ const windows = all.filter((w) => cfg.show[w.category] && w.resetsAt > Date.now())
776
+ setByProvider((prev) => ({ ...prev, [p.id]: windows }))
777
+ api.kv.set(`usage-bar.${p.id}.windows`, windows)
778
+ }
779
+ // `null` means the status fetch failed — keep the last known indicator.
780
+ if (status !== null) setByStatus((prev) => ({ ...prev, [p.id]: status }))
781
+ // Back off when the usage fetch failed (e.g. 429 — these endpoints throttle).
782
+ setTimeout(poll, all ? POLL_MS : POLL_MS * 3)
783
+ }
784
+ void poll()
785
+ }
786
+
780
787
  api.slots.register({
781
788
  order: 60,
782
789
  slots: {
@@ -864,46 +871,6 @@ async function setupUsageBar(api: TuiPluginApi) {
864
871
  },
865
872
  },
866
873
  })
867
-
868
- // Start background work only once the optional UI slot was accepted. If
869
- // registration fails, the outer fail-open handler can suppress it without
870
- // leaving a timer or provider request running in the background.
871
- clockInterval = setInterval(() => setNow(Date.now()), 1_000)
872
-
873
- const schedulePoll = (run: () => void, delay: number) => {
874
- if (disposed) return
875
- const timeout = setTimeout(() => {
876
- pollTimeouts.delete(timeout)
877
- if (!disposed) run()
878
- }, delay)
879
- pollTimeouts.add(timeout)
880
- }
881
-
882
- for (const p of enabled) {
883
- const cfg = config.providers[p.id]
884
- const poll = async () => {
885
- if (disposed) return
886
- // Fetch usage and status concurrently; status pages are CDN-backed and
887
- // never throttle, so we poll them on the same cadence as usage.
888
- const statusP = config.showStatus && p.statusUrl ? fetchStatus(p.statusUrl) : null
889
- const [all, status] = await Promise.all([p.fetchUsage(cfg), statusP])
890
- if (disposed) return
891
- if (all) {
892
- const windows = all.filter((w) => cfg.show[w.category] && w.resetsAt > Date.now())
893
- setByProvider((prev) => ({ ...prev, [p.id]: windows }))
894
- api.kv.set(`usage-bar.${p.id}.windows`, windows)
895
- }
896
- // `null` means the status fetch failed — keep the last known indicator.
897
- if (status !== null) setByStatus((prev) => ({ ...prev, [p.id]: status }))
898
- // Back off when the usage fetch failed (e.g. 429 — these endpoints throttle).
899
- schedulePoll(runPoll, all ? POLL_MS : POLL_MS * 3)
900
- }
901
- const runPoll = () => {
902
- if (disposed) return
903
- void poll().catch(() => schedulePoll(runPoll, POLL_MS * 3))
904
- }
905
- runPoll()
906
- }
907
874
  }
908
875
 
909
876
  /* ─── Delegations (real-time panel) ────────────────────────
@@ -3167,9 +3134,7 @@ const tui: TuiPlugin = (api, _options, _meta) => {
3167
3134
  .catch(() => setVersion(null))
3168
3135
 
3169
3136
  // Vendored feature (MIT): AI subscription usage gauges.
3170
- // Usage indicators are optional: a config, storage, or slot failure must
3171
- // never turn an otherwise healthy TUI startup into an unhandled rejection.
3172
- void setupUsageBar(api).catch(() => undefined)
3137
+ void setupUsageBar(api) // async init — never blocks sidebar registration
3173
3138
 
3174
3139
  // ── Live delegation store (tool-part tracker + sidebar invalidation) ──
3175
3140
  // The Delegations panel's PRIMARY source is `api.client.session.children`
@@ -0,0 +1,13 @@
1
+ declare module '@opencode/plugin/tui' {
2
+ export const Plugin: {
3
+ define<T>(plugin: T): T
4
+ }
5
+ }
6
+
7
+ declare module '@opencode/plugin' {
8
+ export const Plugin: {
9
+ define<T>(plugin: T): T
10
+ }
11
+ }
12
+
13
+ declare const __PANTHEON_VERSION__: string
@@ -26,7 +26,7 @@ async function ensureDistArtifactsEndWithNewline(): Promise<void> {
26
26
  }
27
27
 
28
28
  export default defineConfig({
29
- entry: { tui: 'src/index.tsx', server: 'src/server.ts' },
29
+ entry: { tui: 'src/index.tsx', 'tui-v2': 'src/index-v2.tsx', server: 'src/server.ts' },
30
30
  format: ['esm'],
31
31
  platform: 'node',
32
32
  outDir: 'dist',
@@ -47,7 +47,7 @@ export default defineConfig({
47
47
  }),
48
48
  ],
49
49
  deps: {
50
- neverBundle: [/^@opencode-ai\//, /^@opentui\//, /^solid-js/],
50
+ neverBundle: [/^@opencode-ai\//, /^@opencode\//, /^@opentui\//, /^solid-js/],
51
51
  },
52
52
  onSuccess: ensureDistArtifactsEndWithNewline,
53
53
  })
@@ -0,0 +1,2 @@
1
+ // OpenCode V2's CLI loader resolves this root-level TUI entrypoint.
2
+ export { default } from './dist/tui-v2.js'
@@ -0,0 +1,3 @@
1
+ // OpenCode V1 compatibility entrypoint. The V2 installer copies tui-v2.ts as
2
+ // the installed root tui.ts instead.
3
+ export { default } from './dist/tui.js'
package/src/routing.yml CHANGED
@@ -133,7 +133,7 @@ agents:
133
133
  - artifact-management
134
134
  - context-compression
135
135
  - auto-continue
136
- - council-synthesis
136
+ - incremental-implementation
137
137
  athena:
138
138
  role: Strategic planner
139
139
  reasoning_effort: high
@@ -188,6 +188,8 @@ agents:
188
188
  - pantheon_code_mode
189
189
  skills:
190
190
  - tdd-with-agents
191
+ - file-prompts
192
+ - streaming-patterns
191
193
  - git-workflow-and-versioning
192
194
  - incremental-implementation
193
195
  aphrodite:
@@ -209,7 +211,7 @@ agents:
209
211
  skills:
210
212
  - tdd-with-agents
211
213
  - visual-review-pipeline
212
- - incremental-implementation
214
+ - file-prompts
213
215
  demeter:
214
216
  role: Database specialist
215
217
  reasoning_effort: medium
@@ -4,14 +4,14 @@
4
4
 
5
5
  Skills are reference modules loaded on demand by agents. Each skill provides domain-specific knowledge — architecture patterns, security checklists, optimization strategies, and implementation guides. Agents load skills when their task matches the skill's description, keeping context focused and token-efficient.
6
6
 
7
- There are **21 skills** divided into **5 domains**.
7
+ There are **20 skills** divided into **5 domains**.
8
8
 
9
9
  ## Skills by Domain
10
10
 
11
11
  ### Domain 1: Orchestration & Workflow
12
12
 
13
13
  1. **agent-coordination** — `agent-coordination/SKILL.md`
14
- - Lightweight coordination for substantial tasks with multiple independent specialists.
14
+ - Multi-agent orchestration with model routing, category delegation, and sprint management.
15
15
  - Used by: Zeus
16
16
 
17
17
  2. **artifact-management** — `artifact-management/SKILL.md`
@@ -23,8 +23,8 @@ There are **21 skills** divided into **5 domains**.
23
23
  - Used by: Zeus, Apollo, Hephaestus, Nyx, Gaia
24
24
 
25
25
  4. **context-compression** — `context-compression/SKILL.md`
26
- - Level 2 — Pantheon-native context compression with priority scoring, semantic summarization, budget allocation, and cross-references.
27
- - Used by: Zeus, Mnemosyne, Themis
26
+ - Native compaction guidance and explicit checkpoint rules; no automatic compression MCP calls.
27
+ - Used by: Zeus, Mnemosyne
28
28
 
29
29
  5. **memory-bank** — `memory-bank/SKILL.md`
30
30
  - Memory bank rules, structure, and optimization — complete guide to Pantheon memory management.
@@ -34,10 +34,6 @@ There are **21 skills** divided into **5 domains**.
34
34
  - Pin session objectives to prevent scope creep across long multi-agent sessions.
35
35
  - Used by: Zeus, Mnemosyne
36
36
 
37
- - **council-synthesis** — `council-synthesis/SKILL.md`
38
- - Full structured council workflow, loaded only for `/pantheon` or a material multi-perspective decision.
39
- - Used by: Zeus
40
-
41
37
  ### Domain 2: Development Tools
42
38
 
43
39
  7. **clonedeps** — `clonedeps/SKILL.md`
@@ -50,7 +46,7 @@ There are **21 skills** divided into **5 domains**.
50
46
 
51
47
  9. **incremental-implementation** — `incremental-implementation/SKILL.md`
52
48
  - Implement in thin vertical slices — one commit per task, testable, rollback-safe.
53
- - Used by: Hermes, Aphrodite, Demeter, Prometheus, Talos
49
+ - Used by: Zeus, Hermes, Aphrodite, Demeter, Prometheus, Talos
54
50
 
55
51
  10. **loop-engineering** — `loop-engineering/SKILL.md`
56
52
  - Iterative refinement pattern for complex problems — solve, review, improve, repeat in controlled cycles.
@@ -128,12 +124,12 @@ The `SKILL.md` file contains YAML frontmatter with `name`, `description`, and pl
128
124
  | 1 | agent-coordination | Orchestration & Workflow | Zeus |
129
125
  | 2 | artifact-management | Orchestration & Workflow | Zeus, Mnemosyne, Iris |
130
126
  | 3 | auto-continue | Orchestration & Workflow | Zeus, Apollo, Hephaestus, Nyx, Gaia |
131
- | 4 | context-compression | Orchestration & Workflow | Zeus, Mnemosyne, Themis |
127
+ | 4 | context-compression | Orchestration & Workflow | Zeus, Mnemosyne |
132
128
  | 5 | memory-bank | Orchestration & Workflow | Mnemosyne, Athena |
133
129
  | 6 | session-goal | Orchestration & Workflow | Zeus, Mnemosyne |
134
130
  | 7 | clonedeps | Development Tools | Hermes, Hephaestus |
135
131
  | 8 | git-workflow-and-versioning | Development Tools | Hermes, Prometheus, Iris |
136
- | 9 | incremental-implementation | Development Tools | Hermes, Aphrodite, Demeter, Prometheus, Talos |
132
+ | 9 | incremental-implementation | Development Tools | Zeus, Hermes, Aphrodite, Demeter, Prometheus, Talos |
137
133
  | 10 | loop-engineering | Development Tools | All agents |
138
134
  | 11 | reflect | Development Tools | All agents |
139
135
  | 12 | simplify | Development Tools | All agents |
@@ -145,7 +141,6 @@ The `SKILL.md` file contains YAML frontmatter with `name`, `description`, and pl
145
141
  | 18 | spec-driven-development | Planning | Athena |
146
142
  | 19 | verification-planning | Planning | Athena, Zeus |
147
143
  | 20 | visual-review-pipeline | Frontend Development | Aphrodite |
148
- | 21 | council-synthesis | Orchestration & Workflow | Zeus |
149
144
 
150
145
  ---
151
146
 
@@ -1,25 +1,95 @@
1
1
  ---
2
2
  name: agent-coordination
3
- description: "Coordinate two or more specialists for substantial multi-phase work. Skip for questions, bounded fixes, and one-agent tasks."
3
+ description: "Multi-agent orchestration with model routing, category delegation, and sprint management. Use for coordinating Pantheon agents."
4
4
  context: fork
5
5
  globs: []
6
6
  alwaysApply: false
7
7
  ---
8
8
 
9
- # Agent coordination
9
+ # Agent Coordination
10
10
 
11
- Load only when the work genuinely needs multiple specialists or dependent phases. For the default routing, retry, and safety rules, follow Zeus and `pantheon://routing`.
11
+ Master guide to orchestrating the multi-agent system. Includes category routing, model selection, and sprint management for rapid, TDD-driven feature development.
12
12
 
13
- ## Lean coordination
13
+ ---
14
+
15
+ ## Agent Hierarchy
16
+
17
+ See `AGENTS.md` for the full agent table.
18
+
19
+ ---
20
+
21
+ ## Category Routing
22
+
23
+ Route tasks to optimized agents based on category instead of specifying agents manually:
24
+
25
+ | Category | Agent | Use For |
26
+ |----------|-------|---------|
27
+ | **Deep** | Athena, Hephaestus | Complex planning, AI pipelines |
28
+ | **Quick** | Talos, Apollo | Fast fixes, codebase search |
29
+ | **Ultrabrain** | Zeus | Multi-agent orchestration, model routing |
30
+
31
+ ---
32
+
33
+ ## Sprint Workflow
34
+
35
+ ```
36
+ 1. User describes feature
37
+ 2. @athena creates PLAN with phases and agents
38
+ 3. User approves PLAN (GATE 1)
39
+ 4. Zeus dispatches agents to phases (parallel when possible)
40
+ 5. Each agent: TDD cycle → writes IMPL artifact
41
+ 6. @themis reviews all phases (GATE 2)
42
+ 7. User reviews Themis findings
43
+ 8. If approved → user commits (GATE 3)
44
+ 9. @mnemosyne updates memory bank
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Parallel Execution Declaration
14
50
 
15
- 1. State the desired outcome and split only work with distinct ownership or dependencies. Ask @athena to plan only when scope, architecture, or acceptance criteria are materially unclear.
16
- 2. Assign each bounded task to the most specific configured specialist. Include relevant context, expected result, and focused verification; do not make @apollo rediscover context the implementer can inspect directly.
17
- 3. Dispatch independent tasks together only when native background delegation is enabled. Otherwise use normal `task()` calls. Do not create waves for a single task or poll without a returned task ID.
18
- 4. Collect summaries once, resolve dependencies, and report evidence, remaining risk, and blockers. Add @themis, artifacts, or user approval only where the task's risk or requested workflow requires them.
51
+ ```
52
+ 🔀 PARALLEL EXECUTION — Phase 2
53
+ Running simultaneously:
54
+ - @hermes → backend tests → .tmp/IMPL-phase2-hermes.md
55
+ - @aphrodite → frontend → .tmp/IMPL-phase2-aphrodite.md
56
+ - @demeter → migrations → .tmp/IMPL-phase2-demeter.md
57
+ Themis reviews all three after completion.
58
+ ```
59
+
60
+ ---
61
+
62
+ ## Artifact Protocol
63
+
64
+ All phase outputs go to `.pantheon/memory-bank/.tmp/`. See `skill: artifact-management` for the complete protocol (who generates what, templates, lifecycle).
65
+
66
+ ---
67
+
68
+ ## Safety Gates
69
+
70
+ | Gate | When | Why |
71
+ |------|------|-----|
72
+ | **GATE 1** | After PLAN | User confirms scope |
73
+ | **GATE 2** | After Themis review | User sees changes |
74
+ | **GATE 3** | Before git commit | User controls history |
75
+
76
+ ---
77
+
78
+ ## Model Selection
79
+
80
+ Model routing is handled by Prometheus and the platform configuration. Zeus delegates model selection to the tier system (`fast` / `default` / `coding` / `premium`).
81
+
82
+ - **Deep tasks** → High-quality models (Claude, GPT-4)
83
+ - **Quick tasks** → Fast/cheap models (Haiku, 4o-mini)
84
+ - **Visual tasks** → Multimodal models (GPT-4V, Claude Vision)
85
+ - **Cost optimization** → Route to cheapest model that meets quality bar
86
+
87
+ ---
19
88
 
20
- ## Boundaries
89
+ ## Anti-Patterns
21
90
 
22
- - Zeus coordinates; implementation agents inspect, edit, and verify their assigned scope.
23
- - Preserve auth/security, data/schema, destructive-action, production, and permission gates.
24
- - Do not commit, push, merge, deploy, or broaden scope without explicit authorization.
25
- - Model selection comes from the active configured preset; do not invent a model tier or price.
91
+ - ❌ Zeus doing implementation work (orchestrates, doesn't code)
92
+ - ❌ Skipping TDD cycle (RED → GREEN → REFACTOR)
93
+ - ❌ Auto-committing without user approval
94
+ - ❌ Parallel phases with dependencies (order matters)
95
+ - ❌ Ignoring Themis CRITICAL findings
@@ -52,8 +52,6 @@ Full-auto may continue only within a task and scope the user explicitly authoriz
52
52
 
53
53
  ---
54
54
 
55
- ---
56
-
57
55
  ## Implementation Pattern
58
56
 
59
57
  ```
@@ -165,25 +163,26 @@ Should I now run the migration tests? [waiting]
165
163
 
166
164
  ## Session Heartbeat & Checkpoints
167
165
 
168
- Use checkpoints only when `context_save` and `context_get` are explicitly present
169
- in the active session's tool list. Standalone OpenCode V2 agent profiles do not
170
- currently grant these tools; in that case, do not attempt a checkpoint or guess
171
- a session ID. Carry forward the phase and remaining tasks in the normal task
172
- handoff instead.
166
+ Session state is **not** file-based. It lives in **pantheon-persistence** under the
167
+ `checkpoint:<slug>` namespace and is cleaned up automatically by a 4h TTL.
168
+
169
+ Use checkpoints only when `context_save` and `context_get` are explicitly
170
+ present in the active session's tool list. If unavailable, do not attempt a
171
+ checkpoint or guess a session ID; carry the handoff in the normal response.
173
172
 
174
- When the tools are available, write state with `context_save(slug=slug, key=key, content=JSON.stringify(state), session_id=...)` and read it back with
175
- `context_get(slug=slug, key="latest", session_id=...)`. Capture `session_id` from the first `context_save`
176
- of the session and reuse it for the rest of the session, so the `latest` pointer survives
177
- compaction. `state` must be an object — never pass a bare string as `content`: its
173
+ When available, call `context_save` with `content=JSON.stringify(state)` and an
174
+ explicit `session_id`. A successful save needs no immediate `context_get`; read
175
+ only when resuming or when the save result is uncertain. Reuse the same session
176
+ ID so the `latest` pointer survives compaction. `state` must be an object — never pass a bare string as `content`: its
178
177
  `goal`/`phase`/`delegations`/`heartbeat` values are objects and `tail` is an array.
179
178
  `goal` is optional; when unset, omit the key rather than passing a string placeholder.
180
179
 
181
180
  ### Heartbeat Check
182
- - When checkpoint tools are available, an old heartbeat (>300s) is a stall signal; log it before resuming.
183
- - Write a heartbeat after anti-stall recovery only when the current session exposes the checkpoint tools.
181
+ - Check heartbeat only when checkpoint tools are available and the workflow needs a durable resume.
182
+ - Write a heartbeat after anti-stall recovery only when the current session exposes checkpoint tools.
184
183
 
185
184
  ### Checkpoint Rules
186
- 1. Save checkpoints for long-running/multi-phase work, context-loss risk, or substantive parallel work — not a one-off command or bounded fix, and only when the tools are available
185
+ 1. Save checkpoints only for long-running/multi-phase work, context-loss risk, or substantive parallel work — not a one-off command or bounded fix
187
186
  2. Include current phase and remaining tasks when a checkpoint is warranted
188
187
  3. On resume, read the latest checkpoint only with a known session ID; otherwise request the missing handoff context.
189
188