fix(report): explain how to synthesize a flat-saved result (#537)#543
Merged
Conversation
A flat result saved via `panel run --save` that carries no synthesis rendered `## Synthesis — _Not run._` with no path forward, which surprised dogfooders: the synthesis block is the headline value of a run, and `analyze` is descriptive-only. Note on scope: the single-model `--save` path already persists synthesis when it runs (threaded through save_panel_result; verified end-to-end). The remaining "Not run" cases are legitimate — `--no-synthesis`, a halted/invalid run, or the bare ensemble path which intentionally produces a per-model comparison rather than a synthesized narrative. Rather than force synthesis onto those paths (a behavior change), the report now tells the user how to produce it for an already-saved result: `synthpanel panel synthesize <id>` (the existing re-synthesis command), and notes that `panel run` synthesizes by default at run time. The hint is scoped to flat saves (not rounds-shaped payloads) and uses the result's id when present, falling back to a `<result-id>` placeholder. Closes #537 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploying synthpanel with
|
| Latest commit: |
ea76be1
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://1dd578d5.synthpanel.pages.dev |
| Branch Preview URL: | https://fix-save-persists-synthesis.synthpanel.pages.dev |
the-data-viking
added a commit
that referenced
this pull request
Jun 3, 2026
Cuts the patch release containing the four bug fixes merged today (#540 cost hint, #541 mcp-install path, #542 dry-run vision guard, #543 report synthesize hint) plus the attachments docs (#535). Pre-bumps __version__.py and re-renders the version artifacts (render_site.py, render_site_markdown.py, render_server_card.py) so auto-tag.yml hits its "nothing to commit" path and only tags v1.5.6 — its direct version-bump push to main is currently rejected by branch protection (GH013), which is why applying semver:patch to a regular fix PR (#543) failed to release. Filing that pipeline issue separately. Co-authored-by: Wesley Johnson <wesley@dataviking.tech> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
synthpanel report <id>on a flat result saved viapanel run --savethat has no synthesis rendered## Synthesis — _Not run._with no path forward. Dogfooders were surprised: the synthesis block (summary/themes/agreements/recommendation) is the headline value of a run, andanalyzeis descriptive-only/non-LLM.Investigation / scope (conservative, per the issue's alternative ask)
I traced the
--saveflow before changing behavior:panel run --savepath already computes synthesis (on by default) and persists it —save_panel_result(..., synthesis=synthesis_dict)(cli/commands.py), threaded in commitf2803c6. I verified end-to-end (mocked run) that the saved JSON carries top-levelsynthesisandreportrendersStatus: ran. So the originally-reported single-model gap is already fixed onmain.Not runcases are legitimate, not bugs:--no-synthesis, a halted/invalid run (synthesis is intentionally skipped on truncated panels), and the bare ensemble path (--models a,b), which by design produces a per-model comparison rather than a synthesized narrative (and the bare-ensemble save does not pass synthesis because none is computed).Forcing synthesis onto those paths would be an invasive behavior change with real cost/latency implications. Instead I took the issue's explicit alternative: have
reportexplain how to generate synthesis for a flat-saved result. The report now points the user at the existingsynthpanel panel synthesize <id>re-synthesis command and notes thatpanel runsynthesizes by default at run time.The hint is scoped to flat saves (not rounds-shaped payloads), and uses the result's
idwhen present, falling back to a<result-id>placeholder.Why not auto-persist on the ensemble path
The bare ensemble path doesn't compute synthesis at all (documented design: blend mode synthesizes, bare ensemble compares). Wiring synthesis into it is a feature, not a bug fix, and out of scope for a conservative single-purpose change. Flagging here per instructions.
Tests (in
tests/test_reporting_markdown.py)test_render_flat_no_synthesis_points_at_synthesize_command(uses theflat_shape.jsonfixture — the panel run --save persists raw Q&A but no synthesis; report shows 'Synthesis: Not run' #537 scenario)test_render_flat_no_synthesis_uses_result_id_when_presenttest_render_rounds_shape_no_synthesis_omits_flat_hint(no false hint on rounds-shaped payloads)Gates
ruff check ./ruff format --check .: passpytest tests/test_reporting_markdown.py tests/test_cli_report.py tests/test_reporting_loader.py tests/test_inspect.py: 37 passedCloses #537
🤖 Generated with Claude Code