@onlooker-community/ecosystem 0.15.0 → 0.15.2

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecosystem",
3
- "version": "0.15.0",
3
+ "version": "0.15.2",
4
4
  "description": "Observability substrate for Claude Code. Provides the shared ~/.onlooker/ storage root, canonical schema-validated event emission, session and tool tracking hooks, and prompt rules. Required by all other Onlooker plugins.",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -33,19 +33,23 @@ jobs:
33
33
  # Code marketplace, not npm — a release for a sibling alone must not
34
34
  # trigger `npm publish`, which would attempt to re-publish ecosystem at
35
35
  # its existing version and fail.
36
+ #
37
+ # We check paths_released (a JSON array) rather than the per-path output
38
+ # key `.--release_created` because keys starting with `.` are silently
39
+ # dropped when release-please-action writes them to $GITHUB_OUTPUT.
36
40
  - uses: actions/checkout@v4
37
- if: ${{ steps.release.outputs['.--release_created'] }}
41
+ if: ${{ contains(fromJSON(steps.release.outputs.paths_released || '[]'), '.') }}
38
42
 
39
43
  - uses: actions/setup-node@v4
40
- if: ${{ steps.release.outputs['.--release_created'] }}
44
+ if: ${{ contains(fromJSON(steps.release.outputs.paths_released || '[]'), '.') }}
41
45
  with:
42
46
  node-version: '22'
43
47
  registry-url: 'https://registry.npmjs.org'
44
48
 
45
49
  - run: npm ci
46
- if: ${{ steps.release.outputs['.--release_created'] }}
50
+ if: ${{ contains(fromJSON(steps.release.outputs.paths_released || '[]'), '.') }}
47
51
 
48
52
  - run: npm publish
49
- if: ${{ steps.release.outputs['.--release_created'] }}
53
+ if: ${{ contains(fromJSON(steps.release.outputs.paths_released || '[]'), '.') }}
50
54
  env:
51
55
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -1,7 +1,7 @@
1
1
  {
2
- ".": "0.15.0",
2
+ ".": "0.15.2",
3
3
  "plugins/archivist": "0.1.0",
4
- "plugins/tribunal": "1.0.0",
4
+ "plugins/tribunal": "1.0.1",
5
5
  "plugins/echo": "0.2.0",
6
6
  "plugins/cartographer": "0.2.0"
7
7
  }
package/CHANGELOG.md CHANGED
@@ -1,11 +1,18 @@
1
- # [0.8.0](https://github.com/onlooker-community/ecosystem/compare/v0.7.2...v0.8.0) (2026-05-22)
1
+ # Changelog
2
2
 
3
+ ## [0.15.2](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.15.1...ecosystem-v0.15.2) (2026-05-25)
3
4
 
4
- ### Features
5
5
 
6
- * **hooks:** add TaskCreated and TaskCompleted task lifecycle trackers ([#21](https://github.com/onlooker-community/ecosystem/issues/21)) ([986ffa8](https://github.com/onlooker-community/ecosystem/commit/986ffa84bdd857a464ca0d556671628190ed27bc))
6
+ ### Bug Fixes
7
7
 
8
- # Changelog
8
+ * **tribunal:** persist all artifacts on every iteration including retries :relieved: ([#41](https://github.com/onlooker-community/ecosystem/issues/41)) ([1636105](https://github.com/onlooker-community/ecosystem/commit/163610535a4ce0fa73c8fb82dc5c6296d2d1065a))
9
+
10
+ ## [0.15.1](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.15.0...ecosystem-v0.15.1) (2026-05-25)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **ci:** use paths_released to gate npm publish :rage: ([#37](https://github.com/onlooker-community/ecosystem/issues/37)) ([c62b17f](https://github.com/onlooker-community/ecosystem/commit/c62b17f7e1352cfe260a23c8f48be30f72edbbed))
9
16
 
10
17
  ## [0.15.0](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.14.0...ecosystem-v0.15.0) (2026-05-25)
11
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onlooker-community/ecosystem",
3
- "version": "0.15.0",
3
+ "version": "0.15.2",
4
4
  "description": "Agents, skills, hooks, commands, rules, and MCP configurations that power [Onlooker](https://onlooker.dev)",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tribunal",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Multi-agent execution with LLM-as-a-Judge quality gates. An Actor performs work; a jury of typed Judges scores it against a project-overridable rubric; a Meta-Judge reviews the jury for bias; the gate decides accept, retry, or exhaust. Grounded in LLM-as-a-Judge (Zheng et al. 2023) and LLM-as-a-Meta-Judge (Wu et al. 2024). Builds on the Onlooker ecosystem plugin.",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.0.1](https://github.com/onlooker-community/ecosystem/compare/tribunal-v1.0.0...tribunal-v1.0.1) (2026-05-25)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **tribunal:** persist all artifacts on every iteration including retries :relieved: ([#41](https://github.com/onlooker-community/ecosystem/issues/41)) ([1636105](https://github.com/onlooker-community/ecosystem/commit/163610535a4ce0fa73c8fb82dc5c6296d2d1065a))
9
+
3
10
  ## 1.0.0 (2026-05-24)
4
11
 
5
12
 
@@ -50,14 +50,22 @@ Emit `tribunal.session.start` with the resolved config (`judge_types`, `gate_pol
50
50
 
51
51
  For `iteration_number` from `0` while `iteration_number < max_iterations`:
52
52
 
53
- 1. **Iteration start.** Generate `iteration_id=$(tribunal_ulid)`. `trigger` is `"initial"` for n=0, `"gate_blocked"` for retries. Emit `tribunal.iteration.start`.
53
+ 1. **Iteration start.** Generate `iteration_id=$(tribunal_ulid)`. `trigger` is `"initial"` for n=0, `"gate_blocked"` for retries. Initialize the iteration directory (creates `verdicts/` subdirectory):
54
+ ```bash
55
+ tribunal_init_iteration "$project_key" "$task_id" "$iteration_id"
56
+ ```
57
+ Emit `tribunal.iteration.start`.
54
58
 
55
59
  2. **Actor.** Emit `tribunal.actor.start`. Use the Task tool to spawn `tribunal-actor` with:
56
60
  - The task description.
57
61
  - The rubric criteria (just `name` + `weight` + `min_pass`).
58
62
  - On retries: a digest of the prior iteration's consensus, dissent (if any), and Meta-Judge override.
59
63
 
60
- Capture the Actor's final output. Persist it: `tribunal_write_actor_output "$project_key" "$task_id" "$iteration_id" "$actor_output"`. Emit `tribunal.actor.complete` with `success: true` and the inferred `artifact_kind` (`file` / `patch` / `message` / `command`).
64
+ Capture the Actor's final output. **`$actor_output` must be the verbatim, complete text returned by the Task tool never a summary, paraphrase, or placeholder string.** Persist it:
65
+ ```bash
66
+ tribunal_write_actor_output "$project_key" "$task_id" "$iteration_id" "$actor_output"
67
+ ```
68
+ Emit `tribunal.actor.complete` with `success: true` and the inferred `artifact_kind` (`file` / `patch` / `message` / `command`).
61
69
 
62
70
  3. **Empanel the jury.** Resolve the panel from configured types:
63
71
  ```bash
@@ -67,17 +75,31 @@ For `iteration_number` from `0` while `iteration_number < max_iterations`:
67
75
  [[ -n "$rubric_types" && "$rubric_types" != "null" ]] && types="$rubric_types"
68
76
  jury=$(tribunal_jury_empanel "$types")
69
77
  ```
70
- Persist the jury (`tribunal_write_iteration_artifact ... jury ...`) and emit `tribunal.jury.empaneled` with the schema-shaped `judges[]` (`tribunal_jury_to_schema_judges "$jury"`).
78
+ Persist the jury and emit `tribunal.jury.empaneled`:
79
+ ```bash
80
+ tribunal_write_iteration_artifact "$project_key" "$task_id" "$iteration_id" "jury" "$jury"
81
+ schema_judges=$(tribunal_jury_to_schema_judges "$jury") # pass $schema_judges as judges[] in the event
82
+ ```
71
83
 
72
84
  4. **Run each Judge.** For each entry in the jury panel:
73
85
  - Emit `tribunal.judge.start` with `judge_id`, `judge_type`, `judge_model_id`.
74
86
  - Spawn the judge subagent (`.subagent` field) with the Actor output + rubric.
75
87
  - Parse the JSON object the judge returns. Augment it with `task_id`, `iteration_id`, `judge_id`, `judge_model_id` from the panel entry, and `judge_type` from the panel entry (canonical, overriding what the agent self-reported).
76
88
  - Emit `tribunal.verdict` with that payload.
77
- - Persist with `tribunal_write_judge_verdict`.
89
+ - **Persist the verdict. This call is required for every judge on every iteration — including retries:**
90
+ ```bash
91
+ tribunal_write_judge_verdict "$project_key" "$task_id" "$iteration_id" "$judge_id" "$verdict_json"
92
+ ```
78
93
 
79
94
  Collect the verdicts into a JSON array `verdicts`.
80
95
 
96
+ **Before moving to step 5, verify all artifacts written so far are on disk:**
97
+ - `iteration-<id>/actor.md` — verbatim actor output (written in step 2)
98
+ - `iteration-<id>/jury.json` — jury panel (written in step 3)
99
+ - `iteration-<id>/verdicts/<judge_id>.json` — one file per judge (written in step 4)
100
+
101
+ (`iteration-<id>/gate.json` is written in step 7 — verify it there.)
102
+
81
103
  5. **Aggregate + dissent.**
82
104
  ```bash
83
105
  method=$(printf '%s' "$rubric" | jq -r '.aggregation_method // "weighted_mean"')