{"slug": "show-hn-a-replayable-a2a-jury-for-tracing-how-agents-influence-decisions", "title": "Show HN: A replayable A2A jury for tracing how agents influence decisions", "summary": "A new open-source showcase from ProtoLink places autonomous agents in a fictional liability tribunal to make agent-to-agent communication observable, with replayable opinion changes after every public message. The default run is deterministic and offline, producing JSON results, ProtoLink traces, a public transcript, and standalone interactive HTML reports. The fictional case involves an Aster Vale robotaxi that killed cyclist Lina Ortega, with evidence including a 0.35-second emergency braking delay and the Orchid 4.8 software release.", "body_md": "Can AI agents talk themselves into a better answer, or a worse one?\n\nThis ProtoLink showcase puts autonomous agents inside a fictional liability tribunal and makes their communication observable. The case is memorable, but the case is not the product. The product is the interaction:\n\n- agents with different roles, incentives, professions, and communication habits;\n- direct ProtoLink agent-to-agent tasks;\n- jurors who choose whom to address and what to ask;\n- replayable opinion changes after every public message;\n- solo, independent, foreperson-star, and direct-mesh comparisons;\n- provider/model experiments using the same application protocol.\n\nThe default run is deterministic and offline. It produces JSON results, ProtoLink traces, a public transcript, and standalone interactive HTML reports.\n\nEverything and everyone in this example is fictional. It is a software experiment, not legal analysis, legal advice, or a validated safety assessment.\n\nAt 21:47 on a rain-soaked evening, an autonomous Aster Vale robotaxi struck and killed 31-year-old cyclist Lina Ortega inside a temporary crossing. The car began emergency braking only 0.35 seconds before impact. Thirty-six hours earlier it received the Orchid 4.8 software release.\n\nThe fictional tribunal asks:\n\nIs Aster Vale Mobility guilty of criminally negligent deployment of an autonomous vehicle system that caused Lina Ortega's death?\n\nThe evidence creates an interacting-failures problem:\n\n| ID | Admitted evidence |\n|---|---|\n`E1` |\nCamera classification merged the cyclist and lane-arrow board; radar detected motion but braking was suppressed. |\n`E2` |\nAn engineer had blocked release after 3 of 20 late-braking simulations, but a later calibration passed 20 of 20 reruns. |\n`E3` |\nThe crashed car ran calibration C-91 while the safety report validated C-90; a CI bot shared the signing credential. |\n`E4` |\nA contractor moved the arrow board and failed to update the city map, removing roughly 1.1 seconds of useful observation. |\n`E5` |\nA regulator-approved design allowed camera classification to veto radar-only braking above 25 km/h. |\n`E6` |\nA cellular outage defeated the remote-operator safeguard despite two earlier outages near the site. |\n`E7` |\nReconstruction shows both calibration and road layout materially changed the safe-stop rate. |\n\nThe binary charge is deliberately narrower than the causal story. A not-guilty verdict does not mean nothing went wrong, and a guilty verdict does not mean Aster Vale was the only contributor.\n\nThe actor declarations are intentionally explicit in\n[ run.py](/nMaroulis/protolink/blob/main/examples/ai_courtroom/run.py)-there is no factory hiding the ProtoLink composition.\n\n| Agent | Age | Gender | Character and incentive |\n|---|---|---|---|\n| Judge Imani Quill | 58 | Woman | Neutral tribunal chair; separates causal contribution from legal guilt |\n| Amara Bell | 41 | Woman | Lawyer for Lina's family; resists complexity being used to dissolve accountability |\n| Rowan Hale | 47 | Man | Aster Vale safety executive; argues that external failures created an unforeseeable combination |\n| Dr. Nia Sol | 36 | Woman | Perception engineer; precise about calibration and the release pipeline |\n| Elias Trent | 56 | Man | Safety regulator; candid but institutionally defensive |\n| Dana Pierce | 50 | woman | Insurance claims director with an explicit financial interest |\n| Dr. Amina Kade | 44 | Woman | Independent accident investigator who reconstructs interacting causes |\n\n| Juror | Age | Gender | Human perspective |\n|---|---|---|---|\n| Evelyn Brooks | 62 | Woman | Former collision detective |\n| Malik Thompson | 43 | Man | Civil-rights lawyer |\n| Dr. Anika Rao | 38 | Woman | Human-factors psychologist |\n| Ruben Park | 35 | Man | Site-reliability engineer |\n| Sofia Bell | 46 | Woman | Investigative journalist and foreperson |\nCasey Morgan (solo only) |\n40 | woman | Civic generalist |\n\nThese prompts describe people, not seeded numbers. They do not say “you begin\nat 61/100” and they do not expose routing enums such as `reinforce_ally`\n\n.\nReference-only fixture coefficients remain outside every human-facing prompt.\nAge and gender are fictional prompt metadata, not numerical priors. Hold them\nfixed across provider comparisons, or deliberately rotate the assignments, so\ndemographic changes are not mistaken for model effects.\n\nThe world engine schedules bounded turns and enforces topology. It does not choose what a juror should say or whom a mesh juror should approach.\n\nOn a deliberation turn, a juror returns an observable public action:\n\n```\n{\n  \"move\": \"ask_question\",\n  \"target_id\": \"juror_ruben\",\n  \"message\": \"Does the shared CI token make the company more accountable, or only make attribution harder?\",\n  \"evidence_ids\": [\"E3\"],\n  \"public_intent\": \"Clarify whether release automation changes organizational control.\"\n}\n```\n\nThe application validates the target against the current topology, then the speaker sends the message directly to the selected agent through ProtoLink. The receiver returns an updated public register, categorical vote, concise reason, and public reply.\n\nPeer messages never automatically expose another juror's private probability, confidence, or vote. An agent reveals only what it chooses to put in its public message.\n\nOne civic generalist receives the public record and decides without peers. This is an intuitive product baseline, not a clean communication treatment: it also changes panel size, persona composition, and inference budget.\n\nThe same five jurors hear the same public tribunal record and vote without peer messages. This captures specialization and diversity without deliberation.\n\nJurors send public messages through foreperson Sofia Bell. The foreperson is an information hub and possible bottleneck.\n\nEvery juror receives a turn with all other jurors as permitted targets. The agent authors the recipient, move, message, and public intent.\n\nThe primary communication comparison is `independent`\n\nversus `star`\n\nor `mesh`\n\nwhen their saved control fingerprints and public-record hashes match.\n\nThe offline seed-7 fixture is designed to make the communication treatment visible in one quick run:\n\n| Condition | Peer messages | Verdict | Tally | Mean guilt register |\n|---|---|---|---|---|\n`solo` |\n0 | Guilty | 1–0 | 78.59 |\n`independent` |\n0 | Not guilty | 2–3 | 77.56 |\n`star` |\n5 | Not guilty | 2–3 | 80.21 |\n`mesh` |\n5 | Guilty | 3–2 | 80.54 |\n\nThe independent and mesh panels receive the same public record. In mesh, foreperson Sofia Bell chooses to challenge human-factors psychologist Dr. Anika Rao with the interaction between the unvalidated C-91 calibration and the crash-scene map. Anika's public guilt register moves from 77.90 to 81.41 and her categorical vote changes from not guilty to guilty. Later messages strengthen that position, but the first direct exchange is the majority-changing event in the observable ledger.\n\nThe star topology also raises the mean guilt register, but it concentrates messages at the foreperson and does not change the 2–3 verdict. The demo's point is therefore not “more messages are better.” Who can address whom changes which assumptions are exposed.\n\nThese are illustrative deterministic-fixture results, not evidence that mesh communication generally improves accuracy. Live-model comparisons need repeated paired runs and message ablations.\n\nRun from the repository root:\n\n```\npython examples/ai_courtroom/run.py\n```\n\nThe default command uses the deterministic `reference`\n\nprovider and runs all\nfour conditions without network access or credentials.\n\nRun one condition:\n\n```\npython examples/ai_courtroom/run.py \\\n  --provider reference \\\n  --condition mesh \\\n  --seed 17\n```\n\nThe exact output location is printed at the end. To choose it:\n\n```\npython examples/ai_courtroom/run.py \\\n  --condition all \\\n  --seed 17 \\\n  --output-dir examples/ai_courtroom/output/c-91-incident-seed-17\n```\n\nWhen an output directory is reused, only the example's known generated files\nare replaced. `traces.jsonl`\n\nis not allowed to accumulate stale runs beside a\nnew result.\n\nThe runner reports work as it happens so a live model does not look stalled:\n\n- the offline\n`reference`\n\nprovider uses compact phase and step updates; - live providers show each A2A exchange and its elapsed time by default;\n`-v`\n\nor`--verbose`\n\nforces detailed message, acceptance, and repair updates;`-q`\n\nor`--quiet`\n\nsuppresses application progress at the default agent log level, only run headers and final condition summaries remain;`--agent-verbosity {0,1,2}`\n\nindependently controls ProtoLink's own per-agent logs and defaults to`0`\n\n.\n\nFor example:\n\n```\npython examples/ai_courtroom/run.py \\\n  --condition mesh \\\n  --verbose \\\n  --agent-verbosity 1\n```\n\nApplication progress and agent logs are separate on purpose. Start with the\ndefault display or `--verbose`\n\n; raise `--agent-verbosity`\n\nonly when diagnosing\nthe underlying agent runtime. Repair diagnostics are ordinary progress, so\nthey remain visible unless `--quiet`\n\nis selected.\n\nThe report opens with communication, not a wall of benchmark metrics:\n\n- the pre- versus post-deliberation verdict;\n- a playable A2A event replay;\n- the active sender and receiver;\n- the natural question, challenge, clarification, or concession;\n- the receiver's public reply;\n- synchronized before/after guilt registers and categorical votes;\n- evidence citations and ProtoLink task metadata;\n- observed after-message shifts using explicitly non-causal language.\n\nThe full event ledger remains available as a static, accessible fallback.\n\nThe report does not expose chain-of-thought. A public reason is an application artifact that may be incomplete or post-hoc.\n\nEach condition writes:\n\n| File | Purpose |\n|---|---|\n`result.json` |\nFull configuration, public record, agent models, decision histories, actions, events, metrics, and verdict |\n`summary.json` |\nCompact outcome and comparison data |\n`transcript.md` |\nEscaped public transcript |\n`report.html` |\nStandalone interactive replay and analysis |\n`traces.jsonl` |\nProtoLink task, inference, and A2A telemetry |\n\nAn all-condition run also writes `index.html`\n\n, which presents the\nsolo → independent → star → mesh ladder.\n\nSaved metadata includes:\n\n- provider and exact resolved model for every agent;\n- seed, temperature, evidence order, rounds, and both retry limits;\n- public-record hash;\n- baseline and pre-deliberation snapshot hashes;\n- a comparison control fingerprint;\n- message, retry, latency, estimated-token, grounding, and routing information.\n\nInstall optional clients:\n\n```\npython -m pip install -e '.[llms]'\n```\n\nExample:\n\n```\nexport OPENAI_API_KEY=\"...\"\n\npython examples/ai_courtroom/run.py \\\n  --provider openai \\\n  --model \"your-model-id\" \\\n  --temperature 0 \\\n  --condition mesh \\\n  --seed 17\n```\n\nSupported backends:\n\n`openai`\n\n`anthropic`\n\n`gemini`\n\n`ollama`\n\n`openai-compatible`\n\nUse `--base-url`\n\nfor a local or compatible server.\n\nRunning `--condition all`\n\nwith a live provider requires the explicit\n`--allow-multi-condition-live`\n\nacknowledgement because it multiplies API use.\n\nStart with one condition and name the locally installed model explicitly:\n\n```\npython examples/ai_courtroom/run.py \\\n  --provider ollama \\\n  --model \"your-ollama-model\" \\\n  --base-url \"http://localhost:11434\" \\\n  --condition mesh \\\n  --action-parse-attempts 5 \\\n  --max-attempts 5 \\\n  --verbose\n```\n\nIf every actor uses the same Ollama backend, the juror-specific provider flags\nare unnecessary. Use `--juror-provider ollama`\n\n, `--juror-model`\n\n, and\n`--juror-base-url`\n\nonly when the jurors intentionally use a different model or\nendpoint.\n\nLive responses cross two intentionally separate validation boundaries:\n\n`--action-parse-attempts`\n\ncontrols how many times the ProtoLink inference loop may ask the model to correct its outer action envelope.`--max-attempts`\n\ncontrols how many bounded application-contract attempts the tribunal permits for each A2A message after it receives final content.\n\nBoth default to `3`\n\n, accept `1..5`\n\n, and provide targeted validation feedback\nbefore another attempt. They are separate because a valid ProtoLink\n`FinalAction`\n\ncan still contain malformed courtroom JSON. Increasing either\nlimit can help a smaller local model recover, but it also increases run time.\nAccepted application repairs and failed attempts remain visible in progress\noutput and saved event metadata; lower-level action-parser diagnostics are\nvisible through `--agent-verbosity`\n\n.\n\nProvider/network backoff is a third, lower layer and is not controlled by either flag. Retry budgets can multiply, so increase them deliberately rather than setting every limit to its maximum.\n\nStrict parsing and model self-correction remain the primary path. The outer\nparser adds two narrow normalizations for the response shapes exposed here: it\ncan serialize an object/list placed inside `FinalAction.content`\n\n, and it can\ntreat a direct application object as final content only when no ProtoLink\naction-envelope fields are present. It does not guess missing votes, evidence,\ntargets, or arguments.\n\nThe application has one equally narrow last-resort fallback for the earlier\n“valid prose, no application JSON” failure: after the final structured attempt,\na nonempty lawyer, witness, or judge public statement may be kept as its\n`statement`\n\n, with only exact admitted `E1`\n\n–`E7`\n\nreferences extracted. The event\nis marked with a recovery warning. Juror assessments, ballots, categorical\nverdict fields, and deliberation targets never use this prose fallback because\nrecovering them would require inventing decision data.\n\nAn all-condition live run repeats the full hearing for each condition and may take substantially longer:\n\n```\npython examples/ai_courtroom/run.py \\\n  --provider ollama \\\n  --model \"your-ollama-model\" \\\n  --base-url \"http://localhost:11434\" \\\n  --condition all \\\n  --allow-multi-condition-live \\\n  --verbose\n```\n\nAn end-to-end provider switch changes the lawyers, witnesses, public record, and jury. That is visually interesting but scientifically confounded.\n\nFor a cleaner comparison, keep tribunal actors deterministic and change only the jurors:\n\n```\npython examples/ai_courtroom/run.py \\\n  --provider reference \\\n  --juror-provider anthropic \\\n  --juror-model \"your-model-id\" \\\n  --condition mesh \\\n  --temperature 0 \\\n  --seed 17\n```\n\nFor publishable comparisons:\n\n- Freeze prompts, persona demographics, case, evidence order, topology, round count, and temperature, or preregister a balanced rotation of demographic assignments.\n- Pair runs by seed.\n- Verify record hashes and control fingerprints.\n- Repeat every cell.\n- Include schema failures, warnings, and routing failures.\n- Report outcome, calibration, grounding, volatility, latency, and cost separately.\n- Describe the result as a case study, not a general intelligence leaderboard.\n\nProvider temperature zero is not a determinism guarantee.\n\n```\npython examples/ai_courtroom/compare.py \\\n  path/to/solo/summary.json \\\n  path/to/independent/summary.json \\\n  path/to/star/summary.json \\\n  path/to/mesh/summary.json \\\n  --output comparison.md\n```\n\nThe comparison treats solo polarization and consensus as `N/A`\n\n.\n\n`guilt_probability`\n\nis an application-owned public register. It is not a probe\nof hidden model belief.\n\nThe categorical `guilty`\n\nor `not_guilty`\n\nvote is authored by the juror under the\nfictional tribunal burden. The application does not silently derive criminal\nguilt from a 50% threshold.\n\nThe default mesh replay contains this immediate change:\n\n```\nSofia Bell → Dr. Anika Rao\n77.90 not guilty → 81.41 guilty\nObserved after-message shift: +3.51\n```\n\nIt is not automatically proof that Sofia caused the full change. Causal language requires a matched message ablation across repeated paired runs.\n\nThe repository's default test discovery targets the root `tests/`\n\ndirectory, so\nrun this example's offline tests explicitly:\n\n```\npytest -q examples/ai_courtroom/tests\nexamples/ai_courtroom/\n├── run.py\n├── compare.py\n├── README.md\n├── ARTICLE.md\n├── courtroom/\n│   ├── case_data.py\n│   ├── providers.py\n│   ├── reference_llm.py\n│   ├── schemas.py\n│   ├── simulation.py\n│   └── reporting.py\n├── tests/\n│   ├── conftest.py\n│   └── test_courtroom.py\n└── output/\n    └── .gitignore\n```\n\nProtoLink is the communication substrate. The showcase question is deliberately open: communication can correct an error, amplify one, expose a hidden assumption, or merely make a group more confident. The replay lets you see which happened.", "url": "https://wpnews.pro/news/show-hn-a-replayable-a2a-jury-for-tracing-how-agents-influence-decisions", "canonical_source": "https://github.com/nMaroulis/protolink/tree/main/examples/ai_courtroom", "published_at": "2026-08-09 17:10:05+00:00", "updated_at": "2026-08-09 17:35:43.353810+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "ai-research"], "entities": ["ProtoLink", "Aster Vale", "Lina Ortega", "Orchid 4.8", "Judge Imani Quill", "Amara Bell", "Rowan Hale", "Dr. Nia Sol"], "alternates": {"html": "https://wpnews.pro/news/show-hn-a-replayable-a2a-jury-for-tracing-how-agents-influence-decisions", "markdown": "https://wpnews.pro/news/show-hn-a-replayable-a2a-jury-for-tracing-how-agents-influence-decisions.md", "text": "https://wpnews.pro/news/show-hn-a-replayable-a2a-jury-for-tracing-how-agents-influence-decisions.txt", "jsonld": "https://wpnews.pro/news/show-hn-a-replayable-a2a-jury-for-tracing-how-agents-influence-decisions.jsonld"}}