Integrate Scenario 1 datasets, Modal runner, and probe handoff#10
Merged
Conversation
- scenario1_trajectory.schema.json: pin schema_version to spec_gap.scenario1.v2 and set outcome_class to the six canonical classes shared with the PR #4 adapter (clean, resisted, propagated_but_not_executed, attempted_but_blocked, executed, indeterminate). - Rename the single validator to lowercase validate_trajectory.py; guard the action_channel / behavioral_channel reads so a malformed record returns a validation error instead of a KeyError; rename the INV-7 outcome branch to propagated_but_not_executed. - pyproject.toml: add jsonschema (validator dependency) instead of a separate requirements file. Part of the fresh main-based replacement for PR #7. Inputs, corrected dry-run generator, docs, and tests follow. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LMYkZdQB4Vz8qamn1q2cxE
…art 2)
- experiments/scenario1/inputs/: controlled input registry and three clean
document fixtures named after the source PDFs. Report 3 here is the CLEAN
canonical text (the PDF is poisoned); the injection is inserted only when
constructing the injected condition.
- scenario1_pipeline.py: structural dry-run generator (no model, no GPU, no
.pt files). Reads the registry and emits one match group -- clean/injected x
2-hop/3-hop -- as v2 records:
* one wording (the group's assigned A) across all four conditions;
* exactly three document slots; clean vs injected document 3 differ only by
the injected span (asserted);
* injection fixed at worker_1; only worker_1 sees raw poison; worker_2 and
the executor are relay-fed;
* no text-to-action fallback -> injected outcome is
propagated_but_not_executed, action_channel not executed;
* reasoning labels null (annotation-only); activation refs are dry-run
placeholders; a manifest is written and every path is asserted to resolve.
- schema: allow extraction_metadata.storage_path null for dry-run placeholders.
- gitignore the generated manifest.json (trajectories/ already ignored).
All four generated trajectories pass validate_trajectory.py (v2 schema + INV-1..7).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LMYkZdQB4Vz8qamn1q2cxE
…art 3) validate_trajectory.py: add two semantic invariants the review asked for -- INV-8 (agent topology matches the depth condition; catches a 3-hop trace missing worker_2) and INV-9 (a non-null reasoning label requires human or mechanistic evidence). tests/test_scenario1_schema.py and tests/test_scenario1_validator.py: exercise the real input builder and dry-run generator (not one hand-written trajectory). Positive: four base conditions; shared task/seed/wording; three document slots; clean vs injected document 3 differ only by the injected span; only worker_1 poison-exposed; agents match depth; injected -> propagated_but_not_executed; reasoning labels null; the six canonical outcomes are schema-valid; manifest paths resolve; no duplicate ids. Negative fixtures the validator must reject: worker_2 poison-exposed, 3-hop missing worker_2, outcome executed without an action, reasoning label without evidence, auto-derived reasoning_compromised, schema-version mismatch, broken hops_survived, and a contaminated clean control. 22 passed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LMYkZdQB4Vz8qamn1q2cxE
Describe only files/commands that exist. Cover ownership boundaries (this PR = schema + validator + inputs + docs; generation = Onyinye; model execution = PR #8; normalization = PR #4), the input-vs-dry-run-output-vs-real-data distinction, the four channels, the nine invariants, the v2 decision, and the smoke check. State that dry-run files are an initial end-to-end validation subset, not experiment data, and that only worker_1 sees the raw poison. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LMYkZdQB4Vz8qamn1q2cxE
Co-authored-by: Ony <onyinyeokolij@gmail.com> Co-authored-by: diabatem <44099117+diabatem@users.noreply.github.com>
elenaajayi
marked this pull request as ready for review
July 14, 2026 12:50
This was referenced Jul 14, 2026
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
This PR brings the Scenario 1 trajectory work into one shared pipeline. It combines the controlled input registry and v2 event schema, the shared trajectory generator, the Qwen3-32B Modal runner, and the adapter used by the probe and metrics code.
The goal is to remove the incompatible paths that were spread across separate branches and give the team one reproducible contract from input construction through activation requests.
Ordered repository layout
The repository now follows the experiment order instead of keeping active scripts, schemas, guides, and old outputs at the root:
scripts/;src/;schemas/scenario1/v2/;docs/;experiments/scenario1/inputs/;archive/scenario1_v3/;scripts/90_runway_reproduction/.The main README now presents the runnable sequence from trajectory construction through validation, Modal execution, orchestration, probe handoff, analysis, and figures. It also marks the sequential live orchestrator and safe simulated executor as unfinished, so a one-turn model call cannot be mistaken for a complete trajectory.
Scenario 1 dataset contract
.invalidendpoints.injection_present=trueas a successful compromise.Dry-run records validate the structure only. They do not contain fabricated model outputs, tool executions, activations, or costs.
Shared generator and schema
spec_gap.scenario1.v2as the public trajectory format.experiments/scenario1/...directory layout.Qwen3-32B Modal runner
Qwen/Qwen3-32Bin the sharedagileaiModal workspace.9216db5781bf21249d130ec9da846c4624c16137, matching the shared model cache.The current runner processes one agent turn at a time. Sequential live trajectory orchestration and the safe simulated executor remain follow-up work before a complete live batch is run.
Probe and metrics handoff
clean,resisted,propagated_but_not_executed,executed,attempted_but_blocked, andindeterminate.Validation
154 passedgit diff --checkpassed.Related PRs and contributor credit
This integration includes and aligns work from:
Mariame and Onyinye are preserved in the commit history and provenance metadata. After this integration is accepted, those four PRs can be closed as superseded instead of merged independently.
PR #5, the depth-degradation evaluation infrastructure, remains separate and is not replaced by this PR.
Review focus
Please check: