From cf73360cb4d2c3ee8ce1c048c0b5dfac177a15c1 Mon Sep 17 00:00:00 2001
From: mayor
Date: Sun, 10 May 2026 15:17:46 -0500
Subject: [PATCH] =?UTF-8?q?release:=20v1.0.6=20=E2=80=94=20cross-town=20fr?=
=?UTF-8?q?iction-sweep=20cycle=20(8=20beads=20+=20cadence=20codified)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Three independent dogfoods on v1.0.4 → v1.0.5 (jotunheim, midgard,
yggdrasil) surfaced a tight cluster of orchestrator-dispatch and
ergonomics bugs. Fix scope:
P1: hq-fjdx (linear v3 multi-round termination); hq-ilke (v1+bank-ref
silent attachment drop)
P2: hq-hjq8 (ensemble --blend no synthesis); hq-xq36 (OR cost-table
99% drift); hq-83ye (CI integration test for MCP v3 multi-round)
P3: hq-lux3 (README response-shape docs); hq-h5j2 (with-attachments
example); hq-pmi1 (pack export auto-mkdir)
Cross-rig pattern: orchestrator dispatch paths silently degrade when a
feature isn't wired into every entrypoint. v1 single-round path skipped
the attachment resolver; MCP v3 multi-round path terminated after round
1. Same smell, different surface.
Cadence codified in docs/release-dogfood-protocol.md (PR #449); future
releases lock in the property.
No API break.
Co-Authored-By: yggdrasil mayor
Co-Authored-By: midgard mayor
Co-Authored-By: Claude Opus 4.7 (1M context)
---
CHANGELOG.md | 115 ++++++++++++++++++++++++++
site/.well-known/mcp/server-card.json | 6 +-
site/index.html | 6 +-
site/index.md | 2 +-
src/synth_panel/__version__.py | 2 +-
5 files changed, 123 insertions(+), 8 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ccd1b63..899f553 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,121 @@ For auto-generated release notes, see [GitHub Releases](https://github.com/DataV
(Empty — next-cycle work lands here.)
+## [1.0.6] - 2026-05-10
+
+Cross-town friction-sweep cycle. Three independent dogfoods (jotunheim,
+midgard, yggdrasil) on v1.0.4 → v1.0.5 surfaced a tight cluster of
+orchestrator-dispatch and ergonomics bugs that this release closes.
+Plus the cadence itself is now codified in
+`docs/release-dogfood-protocol.md` so future releases lock in the
+property: three towns sweeping independently catch three different
+classes of friction.
+
+No API break — every v1.0.5 caller works unchanged.
+
+### Fixed
+
+- **Linear v3 multi-round panels now fall through positionally**
+ (hq-fjdx). Previously, v3 instruments without explicit `route_when`
+ clauses terminated after round 1 — `path` returned a single entry
+ with `next: __end__`, `question_count: 1`, and rounds 2-N were
+ silently skipped. The synthesis layer masked the bug by going broad
+ in its single response, so callers saw a successful-looking run that
+ had executed 1/N of their instrument. Now a v3 round with no
+ explicit routing falls through to the next round in declaration
+ order. CI integration test (hq-83ye) pins the contract.
+
+- **Legacy single-round path resolves bank-ref attachments**
+ (hq-ilke). v1 instruments with bank-ref attachment shape
+ (`attachments: [synthbench_site]` referencing a `bank.attachments[]`
+ entry) silently dropped the attachment payload —
+ `_resolve_question_attachment_refs` was wired into
+ `run_multi_round_panel` but not into the legacy single-round path
+ that v1 instruments use. Bank-refs fell out of the
+ `dict_attachments` filter, attachments arrived empty, and synthesis
+ ran on a hallucinated empty page. Now both dispatch paths resolve
+ bank-refs identically. Plus parse-time rejection of the failure
+ mode so authors fail fast.
+
+- **Ensemble panel runs with `--blend` emit synthesis**
+ (hq-hjq8). Previously, ensemble mode (multiple `--models a,b` with
+ no per-model weights) returned `synthesis: None`,
+ `total_cost: None`, `model: None` while single-model and
+ weighted-split (`a:0.5,b:0.5`) emitted the full synthesis block.
+ Asymmetry hurt dashboard builders. Now `--blend` properly composes
+ the per-model results into a top-level synthesis with weighted
+ agreement scoring; cost rolls up; per-model `cost` field also now
+ populated.
+
+- **OpenRouter cost-table refreshed** (hq-xq36). v1.0.4 reported
+ `openrouter/anthropic/claude-haiku-4.5` (the README headline model)
+ at 99.4% drift from provider-reported cost — local table was
+ ~180× too high. Same drift on `openrouter/google/gemini-2.5-flash`
+ (~55% off). Refreshed against OR's `/v1/models` endpoint; added
+ `scripts/refresh_or_cost_table.py` + a CI freshness gate so the
+ table fails build if >30 days stale.
+
+- **`pack export -o /path` auto-creates missing parent directories**
+ (hq-pmi1). Previously errored deep in pathlib; now walks the path
+ and `mkdir -p`s the parent before writing.
+
+### Added
+
+- **CI integration test for MCP-routed v3 multi-round panels**
+ (hq-83ye). Asserts `path` length, `question_count`, per-round
+ result shape, and cost rollup match instrument structure. Mock-LLM
+ responses; runs across the full Python matrix. Catches the hq-fjdx
+ class of regression at the boundary that surfaced it (MCP wrapper).
+
+- **`docs/known-patterns/openrouter-byok-visual-review.md`** —
+ midgard mayor's cross-town docs lift, merged earlier this cycle
+ (PR #447, still REVIEW_REQUIRED at v1.0.6 cut). Documents the
+ inline-HTML pattern for visual review of UI/HTML content via
+ OpenRouter.
+
+- **`docs/release-dogfood-protocol.md`** (PR #449, merged). Codifies
+ the cross-town wave-style friction-sweep cadence that produced
+ this release. Three independent dogfoods caught three different
+ classes of friction; the protocol locks the property in. Authored
+ by yggdrasil mayor.
+
+- **`examples/instruments/with-attachments.yaml`** + cookbook page
+ (hq-h5j2). Concrete starter for the `image / url / html`
+ attachment shapes — first-contact friction was that there was no
+ copy-pasteable example in the repo despite the README pitching
+ attachments as a primary affordance.
+
+### Changed
+
+- **README response-shape docs** (hq-lux3). README now clearly
+ separates the MCP `run_panel` verdict envelope (with `convergence`
+ scalar) from the CLI `panel run --output-format json` shape (with
+ `synthesis` block). Previously read like the same contract. Flags
+ `panel_verdict` as a future feature for parity if/when it ships.
+
+### Notes
+
+- The cross-rig pattern note for this cycle: orchestrator dispatch
+ paths silently degrade when a feature isn't wired into every
+ entrypoint. v1 single-round path skipped the attachment resolver;
+ MCP v3 multi-round path terminated after round 1. Same smell,
+ different surface. The v1.0.6 fix scope deliberately covers BOTH
+ paths in the new CI integration test (hq-83ye), and v1.0.7 will
+ continue auditing dispatch-path symmetry.
+
+- Bun 1.3.14 segfault that affected polecat productivity during this
+ cycle is upstream (anthropics/claude-code#22632). Mitigation
+ remains: pin Claude Code to 2.1.110 (Bun 1.3.13) +
+ `DISABLE_AUTOUPDATER=1`. See jotunheim hq-dpm1 for the watch-item
+ tracking when 1.3.15+ ships.
+
+### Friction-sweep contributors (this release)
+
+`yggdrasil`, `midgard`, `jotunheim`. Bead IDs: `hq-fjdx`, `hq-ilke`,
+`hq-hjq8`, `hq-xq36`, `hq-83ye`, `hq-lux3`, `hq-h5j2`, `hq-pmi1`.
+Sister-bug pattern callout: orchestrator dispatch silently degrades
+when features aren't wired into every entrypoint.
+
## [1.0.5] - 2026-05-10
OpenRouter multimodal transport fix (the big one) + caller-API hardening
diff --git a/site/.well-known/mcp/server-card.json b/site/.well-known/mcp/server-card.json
index 96bf272..0d887f9 100644
--- a/site/.well-known/mcp/server-card.json
+++ b/site/.well-known/mcp/server-card.json
@@ -3,7 +3,7 @@
"name": "io.github.DataViking-Tech/synthpanel",
"title": "SynthPanel",
"description": "Run synthetic focus groups using AI personas. 12 MCP tools for single prompts, full panel runs, and v3 branching (adaptive) instruments across any LLM provider (Claude, OpenAI, Gemini, xAI).",
- "version": "1.0.5",
+ "version": "1.0.6",
"websiteUrl": "https://synthpanel.dev",
"repository": {
"url": "https://github.com/DataViking-Tech/SynthPanel",
@@ -11,7 +11,7 @@
},
"serverInfo": {
"name": "synthpanel",
- "version": "1.0.5"
+ "version": "1.0.6"
},
"capabilities": {
"tools": { "listChanged": false },
@@ -23,7 +23,7 @@
"registryType": "pypi",
"registryBaseUrl": "https://pypi.org",
"identifier": "synthpanel",
- "version": "1.0.5",
+ "version": "1.0.6",
"runtimeHint": "uvx",
"runtimeArguments": [
{ "type": "positional", "value": "synthpanel[mcp]" },
diff --git a/site/index.html b/site/index.html
index ba72ba9..69704c9 100644
--- a/site/index.html
+++ b/site/index.html
@@ -45,7 +45,7 @@
"applicationCategory": "DeveloperApplication",
"applicationSubCategory": "Research Tool",
"operatingSystem": "Cross-platform",
- "softwareVersion": "1.0.5",
+ "softwareVersion": "1.0.6",
"dateModified": "2026-05-10",
"license": "https://opensource.org/licenses/MIT",
"codeRepository": "https://github.com/DataViking-Tech/SynthPanel",
@@ -140,7 +140,7 @@
class="mb-4 inline-flex items-center gap-2 rounded-full border border-emerald-400/30 bg-emerald-400/5 px-3 py-1 text-xs font-medium text-emerald-300"
>
- v1.0.5 — public beta
+ v1.0.6 — public beta
class="mt-4 flex flex-wrap items-center justify-between gap-3 border-t border-slate-800 py-6 text-xs text-slate-500"
>
- © 2026 DataViking · MIT-licensed · v1.0.5 ·
+ © 2026 DataViking · MIT-licensed · v1.0.6 ·