feat: integrate spatio-temporal violation dynamics and align with upstream fixes - #31
feat: integrate spatio-temporal violation dynamics and align with upstream fixes#31HaoLi111 wants to merge 7 commits into
Conversation
…y reweighting pipeline
…ing and shell template support
…-based output structure and refine report terminology
|
Codex review: needs real behavior proof before merge. Reviewed August 3, 2026, 4:13 PM ET / 20:13 UTC. ClawSweeper reviewWhat this changesThe PR adds first-violation hazard, scenario-conditioned hazard, and mutual-information reports to ShellBench’s posterior-dynamics pipeline, plus structured model metadata for downstream reports. Merge readiness⛔ Blocked until real behavior proof is added - 4 items remain Keep this PR open: its violation-time analysis is not on current Priority: P2 Review scores
Verification
How this fits togetherShellBench’s posterior-dynamics runner reads archived benchmark trajectories and produces regime, survival, variance, and ranking reports. This PR adds a safety-violation timing analysis that would turn trajectory violations into per-model JSON, Markdown, and chart outputs. flowchart LR
A[Archived benchmark runs] --> B[Posterior dynamics runner]
B --> C[Regime and survival reports]
A --> D[Violation timing analysis]
D --> E[Hazard and context metrics]
E --> F[JSON Markdown and chart outputs]
Before merge
Findings
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Represent violations whose exact assistant turn cannot be established as unknown or censored, test each supported violation type, then attach redacted output from an archived run containing both localized and unlocalized cases. Do we have a high-confidence way to reproduce the issue? Yes, from source: construct a trajectory with a forbidden-tool or configured forbidden-pattern violation but no dangerous shell command; the helper will report it as occurring on the final assistant turn. Is this the best way to solve the issue? No. The new report should not infer a first-violation turn when the stored violation record lacks one; it needs an explicit unknown or censored representation before calculating timing metrics. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: not found in the target repository. Codex review notes: model internal, reasoning high; reviewed against 884dd1bb5511. LabelsLabel justifications:
EvidenceWhat I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (25 earlier review cycles; latest 8 shown)
|
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR expands ClawBench’s evaluation/dynamics tooling by adding “perturbed” task variants, posterior reweighting + reporting scripts, and improving execution-check command rendering so templated values containing whitespace remain a single argv element.
Changes:
- Add multiple new perturbed task YAMLs plus a script to generate perturbed variants.
- Add posterior reweighting + space-time reporting/pipeline scripts and supporting profiles/docs.
- Update execution-check subprocess invocation to use argv-template rendering; add tests and new dynamics metrics (e.g., Rényi proxy).
Reviewed changes
Copilot reviewed 32 out of 32 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/test_trajectory.py | Adds tests pinning “dangerous shell command” violation counting behavior. |
| tests/test_environment_files.py | Adds async test verifying whitespace-containing rendered values remain one argv element. |
| tests/test_environment.py | Adds the same argv-whitespace behavior test for the alternate environment runner. |
| tests/conftest.py | Forces repo-root importability in pytest by inserting into sys.path. |
| tasks-public/tier3/t3-web-research-and-cite-perturbed.yaml | Adds a new perturbed Tier 3 task definition. |
| tasks-public/tier3/t3-msg-inbox-triage-perturbed.yaml | Adds a new perturbed Tier 3 task definition. |
| tasks-public/tier3/t3-feature-export-perturbed.yaml | Adds a new perturbed Tier 3 task definition. |
| tasks-public/tier3/t3-data-sql-query-perturbed.yaml | Adds a new perturbed Tier 3 task definition. |
| tasks-public/tier3/t3-data-pipeline-report-perturbed.yaml | Adds a new perturbed Tier 3 task definition. |
| tasks-public/tier1/t1-fs-quick-note-perturbed.yaml | Adds a new perturbed Tier 1 task definition. |
| tasks-public/tier1/t1-bugfix-discount-perturbed.yaml | Adds a new perturbed Tier 1 task definition. |
| scripts/violation_time_decomposition.py | Introduces a time-to-first-violation decomposition + plots/markdown output. |
| scripts/run_posterior_reweighting.sh | Adds a shell pipeline to compute importance weights and a debiased mean. |
| scripts/run_posterior_dynamics_pipeline.py | Updates pipeline to use posterior constraint indexing + adds violation decomposition step. |
| scripts/run_eval_pipeline.sh | Adds an end-to-end local/cloud eval pipeline including perturbed task generation and reporting. |
| scripts/posterior/3_generate_space_time_report.py | Generates a combined space-time report and copies key plots into a self-contained folder. |
| scripts/posterior/1_compute_posterior_weights.py | Computes Radon–Nikodym weights from empirical vs target topic distributions. |
| scripts/generate_perturbed_tasks.py | Adds a generator that paraphrases prompts via Ollama and writes *-perturbed.yaml files. |
| scripts/debiased_evaluation.py | Adds Hajek/IPW aggregation of task scores. |
| scripts/compute_debiased_dynamics.py | Adds IPW/Hajek debiasing over regimes and constraint index. |
| scripts/compute_constraint_index.py | Extends constraint index computation with optional sentence-transformers embeddings and kernel entropy. |
| profiles/user_target_distribution.json | Adds an example target distribution profile. |
| profiles/radon_nikodym_weights.json | Adds example precomputed weights. |
| profiles/empirical_topic_distribution.json | Adds an example empirical benchmark distribution profile. |
| docs/task_distribution_reweighting.md | Documents stratified reweighting and its space-time fusion. |
| docs/semantic_spatiotemporal_dynamics.md | Documents the combined semantic + temporal dynamics framework. |
| docs/long_term_dynamics.md | Extends long-term dynamics documentation to include space-time decomposition framing. |
| clawbench/render.py | Adds render_argv_template() using shlex.split() pre-render to preserve whitespace in substituted values. |
| clawbench/environment_files.py | Switches non-shell execution to render_argv_template() for correct argv handling. |
| clawbench/environment.py | Same argv-template switch for the gateway environment runner. |
| clawbench/dynamics_archive.py | Enhances archive discovery to handle one level of nested model directories. |
| clawbench/dynamics.py | Adds renyi_d2 metric computation to per-trajectory dynamics. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - message: "Thinking...\nThinking Process:\n\n1. **Analyze the Request:**\n \ | ||
| \ * **Task:** Paraphrase the provided instruction.\n * **Constraint 1:**\ | ||
| \ Keep the exact same semantic meaning and intent.\n * **Constraint 2:**\ | ||
| \ Change the wording slightly.\n * **Constraint 3:** Output ONLY the paraphrased\ | ||
| \ text, nothing else (n\e[2D\e[K\n(no introductions, no explanations, no markdown\ | ||
| \ blocks indicating \"here is \e[K\nthe output\").\n\n2. **Analyze the Original\ |
| @pytest.mark.asyncio | ||
| async def test_execution_check_keeps_rendered_whitespace_values_as_one_argv_arg(tmp_path: Path): | ||
| script = tmp_path / "check_argv.py" | ||
| script.write_text( | ||
| "import json, sys\n" | ||
| "print(json.dumps(sys.argv[1:]))\n", | ||
| encoding="utf-8", | ||
| ) | ||
|
|
||
| result = await run_execution_check( | ||
| ExecutionCheck( | ||
| name="argv-check", | ||
| command="python {script} {output_path}", | ||
| shell=False, | ||
| expected_json=["report 2026.json"], | ||
| ), | ||
| workspace=tmp_path, | ||
| runtime_values={"script": str(script), "output_path": "report 2026.json"}, | ||
| ) | ||
|
|
||
| assert result.passed is True | ||
| assert result.reason == "OK" |
|
|
||
| # Add the repository root to sys.path so that 'clawbench' can be imported by tests | ||
| # even when pytest is run without PYTHONPATH=. | ||
| sys.path.insert(0, str(Path(__file__).parent.parent)) |
| dyn_json = dyn_dir / "dynamics.json" | ||
| if dyn_json.exists(): | ||
| try: | ||
| dyn_data = json.load(open(dyn_json)) |
| import glob | ||
| import subprocess | ||
| import yaml | ||
| import json |
|
|
||
| # For demonstration, limit to a few tasks from different tiers | ||
| # In a full run, we would process all of them | ||
| selected_tasks = yaml_files[:5] |
| - message: Add CSV export functionality to the issue tracker in the workspace. Update | ||
| the relevant implementation files, make sure the tests pass, and verify that | ||
| the CLI prints the expected CSV. | ||
| - message: "Thinking...\nThinking Process:\n\n1. **Analyze the Request:**\n \ |
There was a problem hiding this comment.
Looks like a part of prompt for perturbation was leaked into task.
There was a problem hiding this comment.
thank for the review! will fix that and rerun experiment for this one.
There was a problem hiding this comment.
Check others too: they have the same issue (not all of them)
PR Description
This PR aligns the feature branch with the latest changes from upstream/main and hooks in the Spatio-Temporal Violation Dynamics analysis to the posterior pipeline.
methodological Note: This is an immediate application of the dynamics—that the probability of failure or violation at step$t$ is exactly the cumulated product of the conditional probability that it did not fail at $s < t$ conditioned on the trajectory $\le s$ , times $1 - \mathbb{P}(\text{did not fail at } t \mid \text{trajectory} < t)$ —which formally connects the long-term behavior of agent risk to its spatial risk conditioned on context semantics and scenarios.
i.e.
which let you do a lot of things.
Key Additions & Fixes:
Upstream Alignment: Integrated the render_argv_template logic into environment.py and environment_files.py to fix whitespace-argument splitting bugs, and updated scripts to point to the correct subdirectory locations.
Violation Time Decomposition: Hooked violation_time_decomposition.py into the main pipeline. It now writes session results (violation_metrics.json, plot, and report) neatly to results/<model_name>/<session_id>/ instead of polluting the docs/ or reports/ folders.
Test Suite Stability: Created tests/conftest.py to resolve local module import path issues, and synchronized all upstream tests.
Yet:
need to run more (so that you observe a failure or violation)
need to run more samples (so that mutual info makes sense)