feat(commentary): refine rafters-critic persona and improve commentary prompt for humor
agharsallah
26bc5b9
feat(commentary): introduce universal rafters-critic for scenario commentary and cadence control
agharsallah
f637227
feat(commentator): update cadence logic to use a fixed count instead of per-speaker quorum
agharsallah
11f4e9a
feat(media): introduce MediaRouter and stubs for image and speech generation
agharsallah
8400d8c
- Implement MediaRouter to resolve media capabilities to providers, supporting both live and offline modes.
- Add StubImageProvider and StubSpeechProvider for deterministic offline media generation.
- Create tools for image rendering and text-to-speech synthesis, integrating with the ToolRegistry.
- Enhance the commentator (rafters-critic) to generate and render media alongside commentary.
- Update UI components to display generated images and audio clips in the feed.
- Ensure tests cover the new media capabilities, including deterministic outputs and capability enforcement.
feat: Enhance Secret Keeper's response logic to confirm correct guesses and improve consistency in answers
agharsallah
3966dc5
feat: Implement early termination for the judge in Twenty Sprouts game and enhance event handling
agharsallah
0460922
feat: Implement audience-only secret badge for Twenty Sprouts game
agharsallah
f6566bb
- Added `_secret_badge` function to render a hidden-word run's secret for the audience.
- Updated `_core` function to include the secret badge in the HTML output.
- Introduced `peek_next_actor_name` method in `FishbowlSession` to provide the next actor's name without advancing the run.
- Modified `ReplaySession` to handle `peek_next_actor_name` appropriately.
- Refactored `build_show` to simplify the show controls, removing unnecessary buttons and adding play/restart functionality.
- Enhanced `view_model_at` to include the secret and its holder for the audience's view.
- Added tests for the new functionality, ensuring the secret is handled correctly and does not leak into agent prompts.
- Created a new test suite for Twenty Sprouts gameplay to validate the secret handling and game mechanics.
feat: implement winner celebration overlay and judging mechanics
agharsallah
6432854
- Added `render_winner` function to create a celebratory overlay for the winning agent or team.
- Integrated winner rendering into the main application flow, allowing for a modular display of victory.
- Introduced `has_judge` and `force_verdict` methods in `FishbowlSession` to manage judging logic.
- Updated session handling to allow for forced verdicts, even when the budget is spent.
- Enhanced CSS styles for the winner celebration, including confetti and trophy animations.
- Created tests for judging mechanics and winner rendering to ensure correct functionality across scenarios.
Merge remote-tracking branch 'origin/main' into worktree-scenarios
feat: make every scenario arena-grade with a competition contract
agharsallah+1: Codex
0d0c561
Add a validated `competition` block (versus|judged|none) to scenarios,
stamped onto run.started so runs are self-describing and winners attribute
to models. Winners become data, not prose: judges emit a `winner` field
that the reusable JudgedCompetition handler validates against the live cast
(repairing deterministically so the offline stub always names a real
player); ground-truth judges (SpyHost, SproutJudge) decide in code.
Audit the five existing scenarios (The Steeped versus+teams with code-scored
winner; Mystery Roots judged; Open Table gains a table-judge; Thousand Token
Wood and Oracle Grove marked none) and add three competitive scenarios:
Debate Duel and Beat Battle (symmetric seats, different models) and Twenty
Sprouts (code-dealt secret word, deterministic win).
Surface a winner ribbon in the verdict banner only when a winner exists, so
none-kind and legacy runs render byte-identically. Enforce the authoring
checklist in tests/test_scenario_contract.py and document the co…
feat: Implement well-known typed fields for verdicts in output models
agharsallah
ce159dc
- Introduced `_well_known_specs` function to define typed fields for `winner` and `scores` in agent output.
- Updated `build_output_model` to handle new field types, allowing `winner` to be optional and `scores` to default to an empty map.
- Enhanced `json_instruction` to provide specific hints for well-known fields in the output format.
- Modified `FishbowlSession` to derive `winner_kind` and `winning_models` based on verdicts, supporting team-based outcomes.
- Added validation tests for new competition configurations and verdict handling, ensuring proper behavior for both agent and team winners.
- Created comprehensive tests for the new verdict validation logic, including re-ask scenarios and score normalization.
feat: update agent personas and scheduling in YAML configurations; enhance event handling and memory deduplication in core logic
agharsallah
27b304e
feat: enhance agent personas and improve model performance tuning
agharsallah
40a30b6
feat(core): add resilient loop and shared blackboard
agharsallah+1: Codex
ba6dd5f
Improve conversation stability and privacy across live scenarios by sharing spoken context, isolating per-agent failures, and hardening structured output parsing.
- Inject a shared WHAT'S BEEN SAID blackboard into agent context
- Continue turns when one agent fails while preserving budget-stop semantics
- Prevent secret leakage in scenario seed/memory rendering
- Harden JSON parsing and salvage logic for reasoning model outputs
- Tune model token budgets and diversify spy cast model tiers
- Add ADR-0023 plus regression tests for context, memory, parsing, and spy flow
Co-authored-by: Codex <codex@openai.com>
Merge branch 'feat/live-open-table' into feat/live-integration
agharsallah
0a10ebd
# Conflicts:
# src/models/provider.py
feat: add Open Table live-chat scenario (curious/skeptic/host)
agharsallah+1: Codex
01bc5cd
A minimal, live-ready 2-3 agent conversation so the back-and-forth is simple
and obvious: a curious voice, a gently skeptical voice, and a host who nudges
the topic forward every few turns. Staggered ticks (1/1/3) read as real
turn-taking. Coherent offline via curated stub lines + private monologues;
genuinely improvised live (per-agent persona, MODAL_WORKSPACE).
Auto-discovered by the registry — appears in the Lab with no app.py edits.
Co-Authored-By: Codex <codex@openai.com>
Wire the prototype's flagship social-deduction scenario into the live engine,
config-only (no engine edits). Four minds get a secret word — the herd shares
COFFEE, a lone spy holds TEA — and bluff with clues while the mind-reader watches
the spy hide; a host unmasks the seam.
- config/agents/spy-{cara,bex,nil,ovo}.yaml: players emit agent.spoke with the
say-vs-think split; the secret word rides each persona so it never leaks.
- config/agents/spy-host.yaml + SpyHost handler: runs the generic judge turn for
the verdict text, then attaches a structured reveal:[{agent,secret,role}] to the
judge.verdict (same "decorate the emitted event" move as FortuneTeller's omen).
- config/scenarios/the-steeped.yaml: auto-discovered by the registry, surfaced in
the Lab; defaults to the DOCUMENTARIAN narrator.
- provider.py: curated offline lines + per-role mood bias so the bluff lands with
no API key (the spy leans bluffing/panicking).
Also make the Show usable as intended:
- Fix transport h…
feat: add Fishbowl UI presenter layer and say-vs-think engine support
agharsallah+1: Codex
ade9df5
Implements the data foundation (Phases 0-1 of the Fishbowl UI plan) the
Gradio frontend will bind to — all additive, engine left untouched, modularity
preserved (the engine never imports the UI).
- src/ui/fishbowl/: derive_cast_state (per-agent {said,thought,mood} ledger
view), adapter (engine -> say/narrate/poke/verdict + hue/tier/voice/mood with
graceful fallbacks), view_model_at (pure prefix-replay snapshot at any scrubbed
step, with real tokens/rounds from the governor)
- DeterministicTinyModel is now schema-aware, gated on output_extra_fields: it
synthesizes thought/mood offline so the mind-reader works with no API key, while
plain agents stay byte-identical
- AgentManifest gains optional hue/archetype; Conductor.inject_user_event gains an
optional label; cast manifests declare output_extra_fields + presentation metadata
- tests/test_fishbowl.py (15 tests, incl. an offline proof the ledger carries
thought+mood); full suite 277 passed, ruff clean
- docs: manifest-spe…
Refactor code structure for improved readability and maintainability