ai-consultants 2.25.1 → 2.25.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.
package/CLAUDE.md CHANGED
@@ -6,7 +6,7 @@ AI Consultants is a multi-model AI deliberation system that queries up to 11 AI
6
6
 
7
7
  **Self-Exclusion**: The invoking agent is automatically excluded from the panel to prevent self-consultation. Claude Code won't query Claude, Codex CLI won't query Codex, etc.
8
8
 
9
- **Version**: 2.25.1
9
+ **Version**: 2.25.2
10
10
 
11
11
  ## Distribution
12
12
 
@@ -801,6 +801,10 @@ curl -fsSL https://raw.githubusercontent.com/matteoscurati/ai-consultants/main/s
801
801
 
802
802
  ## Changelog
803
803
 
804
+ ### v2.25.2
805
+ - **`doctor`'s static ✓ was a false all-clear.** `check_cli_consultant` verifies `command -v` (installed) or key-present; neither confirms the consultant answers. So `✓ All systems healthy!` and JSON `status: "healthy"` were printed on installation state alone — a consultant with an expired key or spent quota passes every static check and fails the first real query. Surfaced concretely: static doctor called all 11 healthy; `doctor --live` showed 8/11 (Cursor usage limit, Qwen3 401, Grok bad xAI key returned as HTTP 400). Fix gates the word "healthy" on `LIVE_MODE`: a static-only clean run now prints "Static checks passed: CLIs installed, keys present … verify with doctor --live", and JSON reports `status: "static_ok"` + a new `verified: live|static` field; "healthy" now implies a live check backed it. `test_doctor.sh` asserts the invariant directly (a static-only run must never report `healthy`) rather than pinning a specific status, so it holds regardless of the test host's own consultant health. v2.18.0 added `--live` but left the default over-claiming; this closes that. `npm test` = 22 suites.
806
+ - **Note (not shipped, local only)**: the 3 down consultants were all credentials, not code — Grok/Qwen3 keys refreshed and Cursor disabled in the maintainer's own `~/.config`, taking the local live panel to 10/10 (Cursor off by choice). Qwen locally points at Token Plan `qwen3.8-max-preview`; the shipped default stays `qwen3.7-max`.
807
+
804
808
  ### v2.25.1
805
809
  - **Six defects found by an independent review of the released v2.25.0** (Codex `gpt-5.6-sol`, effort high, read-only via the `sol-reviewer` profile). Five were reproduced locally by executing the shipped functions before accepting them; the bash 3.2 crash was verified by the reviewer against `/bin/bash 3.2.57`.
806
810
  - **`calculate_final_score` scored every consultant as a dissenter.** `calculate_weighted_recommendation` emitted `_map_sanitize_key`'s output (spaces and punctuation stripped) as the winner, while `calculate_final_score` compared the raw `.response.approach` against it. Unanimous multiword panels scored 2/10, single-word panels 10/10. Voting now keeps original strings in bash 3.2-compatible indexed arrays. **The shipped voting tests used single-word approaches, which is exactly why this survived every prior review** — when writing a voting fixture, use a realistic multiword approach.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # AI Consultants v2.25.1
1
+ # AI Consultants v2.25.2
2
2
 
3
3
  > **A harness for every question.** A panel of up to 11 frontier models that writes its own playbook per question — fan out, debate to convergence, cross-examine under adversarial review, or run a tournament — and checks its work before it reaches you.
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.25.1-blue.svg)](https://github.com/matteoscurati/ai-consultants)
5
+ [![Version](https://img.shields.io/badge/version-2.25.2-blue.svg)](https://github.com/matteoscurati/ai-consultants)
6
6
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7
7
  [![Claude Code Skill](https://img.shields.io/badge/Claude%20Code-Skill-orange.svg)](https://docs.anthropic.com/en/docs/claude-code/skills)
8
8
  [![GitHub stars](https://img.shields.io/github/stars/matteoscurati/ai-consultants?style=social)](https://github.com/matteoscurati/ai-consultants)
package/SKILL.md CHANGED
@@ -5,10 +5,10 @@ license: MIT
5
5
  compatibility: Requires bash, jq, and at least 2 AI CLI tools (agy, codex, vibe, etc.). macOS and Linux.
6
6
  metadata:
7
7
  author: matteoscurati
8
- version: 2.25.1
8
+ version: 2.25.2
9
9
  ---
10
10
 
11
- # AI Consultants v2.25.1 - AI Expert Panel
11
+ # AI Consultants v2.25.2 - AI Expert Panel
12
12
 
13
13
  **A harness for every question.** Convene a panel of AI "consultants" for coding questions — and let the engine pick *how* they deliberate: a quick read, a convergence loop, an adversarial refutation gate, a tournament, or an exhaustive sweep. Each consultant has a **configurable persona** that shapes its analysis.
14
14
 
@@ -1,4 +1,4 @@
1
- # Cost Rates - AI Consultants v2.25.1
1
+ # Cost Rates - AI Consultants v2.25.2
2
2
 
3
3
  This page documents the per-token rates used by the cost tracking system.
4
4
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.25.1",
2
+ "version": "2.25.2",
3
3
  "updated": "2026-07-16",
4
4
  "models": {
5
5
  "_comment_units": "All rates are USD per 1,000 tokens (per-1K). lib/costs.sh computes cost as (token_count / 1000) * rate, so every value here MUST be a per-1K rate = (provider $/1M price) / 1000. Do NOT paste $/MTok figures directly.",
@@ -0,0 +1,53 @@
1
+ # Release v2.25.2
2
+
3
+ **Date:** 2026-07-22
4
+ **Type:** Patch — `doctor` stops reporting health it hasn't verified
5
+ **Previous:** v2.25.1
6
+
7
+ ## Highlights
8
+
9
+ - `doctor` no longer prints "All systems healthy!" when it has only checked that CLIs are installed and keys are present.
10
+ - "healthy" is now reserved for `doctor --live`, which sends a real query.
11
+ - `--json` gains a `verified` field and a `static_ok` status so tooling can tell a real all-clear from an unverified one.
12
+
13
+ ## What's New
14
+
15
+ ### The static all-clear was false
16
+
17
+ The default `doctor` confirms a consultant's CLI is installed and its key is present. Neither means the consultant can actually answer — a consultant with an expired key or an exhausted quota passes every static check and fails on the first real query.
18
+
19
+ Measured on a real machine: static `doctor` reported all 11 consultants healthy, while `doctor --live` showed **8 of 11 actually respond** (the other three had a usage limit or a bad key). The static "healthy" gave a false all-clear.
20
+
21
+ Now:
22
+
23
+ - A clean static run prints, instead of "All systems healthy!":
24
+ > `✓ Static checks passed: CLIs installed, keys present.`
25
+ > `This does NOT confirm consultants can answer — verify with: doctor --live`
26
+ - The word **"healthy" is reserved for a `--live` run** that pinged the consultants for real.
27
+ - `--json` reports `status: "static_ok"` for a clean static run and gains a `verified: "live" | "static"` field. `status: "healthy"` now implies a live check backed it.
28
+
29
+ `--live` is unchanged, and a plain `doctor` still makes no billed calls.
30
+
31
+ ## Breaking Changes
32
+
33
+ None in behavior. One output-contract change worth noting for tooling: a clean **static** `doctor --json` now returns `status: "static_ok"` (with `verified: "static"`) instead of `"healthy"`. Consumers that checked for exactly `"healthy"` on a static run should accept `static_ok`, or run `--live` to get `"healthy"`.
34
+
35
+ ## Upgrade Guide
36
+
37
+ ```bash
38
+ # If installed via git clone
39
+ cd ~/.claude/skills/ai-consultants && git pull
40
+
41
+ # If installed via curl | bash
42
+ curl -fsSL https://raw.githubusercontent.com/matteoscurati/ai-consultants/main/scripts/install.sh | bash
43
+ ```
44
+
45
+ No configuration changes required. To verify your consultants actually respond, run `ai-consultants doctor --live`.
46
+
47
+ ## Verification
48
+
49
+ `npm test` = 22 suites. `test_doctor.sh` asserts the invariant that a static-only run never reports `healthy`.
50
+
51
+ ## Contributors
52
+
53
+ - @matteoscurati
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-consultants",
3
- "version": "2.25.1",
3
+ "version": "2.25.2",
4
4
  "description": "A harness for every question - a panel of up to 11 AI models that picks its own deliberation strategy per question (convergence, adversarial verification, tournament) and checks its work before answering",
5
5
  "bin": {
6
6
  "ai-consultants": "bin/ai-consultants"
package/scripts/config.sh CHANGED
@@ -861,4 +861,4 @@ EOF
861
861
  # VERSION
862
862
  # =============================================================================
863
863
 
864
- AI_CONSULTANTS_VERSION="2.25.1"
864
+ AI_CONSULTANTS_VERSION="2.25.2"
package/scripts/doctor.sh CHANGED
@@ -637,10 +637,18 @@ print_summary() {
637
637
  --argjson issues_list "$issues_json" \
638
638
  --argjson warnings_list "$warnings_json" \
639
639
  --arg version "$AI_CONSULTANTS_VERSION" \
640
+ --arg verified "$([[ "$LIVE_MODE" == "true" ]] && echo live || echo static)" \
640
641
  '{
641
642
  doctor: {
642
643
  version: $version,
643
- status: (if $issues > 0 then "unhealthy" elif $warnings > 0 then "degraded" else "healthy" end),
644
+ # "healthy" requires a live check. Static-only cannot see an
645
+ # expired key or exhausted quota, so it reports "static_ok",
646
+ # not "healthy". `verified` says which check backs the status.
647
+ status: (if $issues > 0 then "unhealthy"
648
+ elif $warnings > 0 then "degraded"
649
+ elif $verified == "live" then "healthy"
650
+ else "static_ok" end),
651
+ verified: $verified,
644
652
  checks: {
645
653
  total: $total,
646
654
  passed: $passed,
@@ -686,10 +694,22 @@ print_summary() {
686
694
  fi
687
695
 
688
696
  if [[ ${#ISSUES[@]} -eq 0 && ${#WARNINGS[@]} -eq 0 ]]; then
689
- echo " ✓ All systems healthy!"
697
+ # Do NOT claim "healthy" on static checks alone: they confirm a CLI is
698
+ # installed and a key is present, NOT that a consultant can actually
699
+ # answer. A consultant with an expired key or exhausted quota passes
700
+ # every static check and fails on the first real query. Only --live,
701
+ # which sends a real ping, earns the word "healthy".
702
+ if [[ "$LIVE_MODE" == "true" ]]; then
703
+ echo " ✓ All checks passed — consultants verified responding (live)."
704
+ else
705
+ echo " ✓ Static checks passed: CLIs installed, keys present."
706
+ echo " This does NOT confirm consultants can answer — an expired key or"
707
+ echo " used-up quota passes every static check. Verify with: doctor --live"
708
+ fi
690
709
  echo ""
691
710
  elif [[ ${#ISSUES[@]} -eq 0 ]]; then
692
711
  echo " △ System operational with warnings"
712
+ [[ "$LIVE_MODE" != "true" ]] && echo " (static only — run 'doctor --live' to confirm consultants answer)"
693
713
  echo ""
694
714
  else
695
715
  echo " ✗ Issues found - run with --fix to attempt auto-repair"