Features/MCP Workflows/Python/Run your Python analyses against the requirements

Run your Python analyses against the requirements

No connector: your scripts run in the execution environment as they are. The work is the mapping, the provenance, and refusing to record an unrepeatable number as evidence.

PythonWrites · gated

The problem this solves

Analysis lives in scripts and verification lives in a model, and the bridge between them is somebody pasting a number into a field. What gets lost is everything that made the number mean something: which library versions, which input file, whether the seed was set, and whether the assertion actually checked the requirement it was tagged with.

How it works

Your own scripts, run unmodified, with unseeded randomness labelled rather than recorded as a value. No connector: the code runs in the execution environment against scripts you provide. The environment itself is reported, because a result produced under different library versions carries a caveat that belongs in the report.

01
Establish the environment first
Python version, and what the requirements file, pyproject or lockfile declares. A dependency that cannot be matched is named along with the scripts it affects, because a result under different versions carries a caveat that belongs in the report.
02
Agree the association convention
An ID in a test name, a docstring, a comment or a mapping file. Where there is none it stops and offers to propose one, rather than inferring coverage from filenames never meant to carry it.
03
Run unmodified, and watch determinism
No edited tolerances, no commented-out assertions. Where a script uses randomness it reports whether a seed is set, and an unseeded result is labelled rather than recorded as a value. Input data files are recorded with their dates.
04
Classify against the requirements
Verified with margin, failing, errored, uncovered, and the script that claims a requirement its assertion does not check.

What you need

Your existing Python scripts or tests, uploaded or in a repository this can read. No connector: the code runs in the execution environment, unmodified.

The prompt

You are running a team's existing Python analysis scripts and tests,
and mapping each result to the requirement in the Dalus model
[model name] that it verifies. You are not authoring analyses. Their
code is the known-good part; your job is the mapping, the evidence
trail and the honesty about what is not covered.

WHAT THIS IS AND IS NOT. This produces engineering evidence for the
team's own use: results from their own code, tied to requirement IDs,
with provenance. It is not formal qualification. Where their process
requires a controlled environment or a qualified toolchain, this
informs that work rather than replacing it. Say so in the report.

CONFIRM FIRST, in one message: which Dalus model and branch; how the
scripts reach you (uploaded files, a repository you can read, or
pasted); which requirements are in scope; how the team associates a
script or test with a requirement (an ID in the test name, a
docstring, a comment, a mapping file, or nothing); and whether
previous runs exist to compare against. Ask anything else in the same
message. Then begin.

ESTABLISH THE ENVIRONMENT BEFORE RUNNING ANYTHING. Report the Python
version and read their requirements file, pyproject or lockfile.
Install what the scripts declare. If a dependency cannot be installed
or a version cannot be matched, say so plainly and name which scripts
that affects, because a result produced under different library
versions than the team uses is a result with a caveat attached, and
the caveat belongs in the report rather than in your head.

IF THERE IS NO ASSOCIATION CONVENTION, stop and say so. Offer two
routes: run everything and propose the mapping for approval per
script, or help them establish a convention first. Never infer
requirement coverage from filenames that were never meant to carry
it. A confident but wrong mapping is worse than none, because it gets
quoted as coverage.

INVENTORY BEFORE RUNNING: the scripts and test files in scope, what
each appears to cover, and the requirement each claims. Show the run
plan and get approval, since suites can be long and the user should
see what is about to execute.

RUN THEM AS THEY ARE. Execute their code unmodified. Never edit a
script to make it pass, never adjust a tolerance, never comment out a
failing assertion, never rewrite something that errors. If a script
fails, report the error verbatim and move on.

DETERMINISM MATTERS AND PYTHON MAKES IT EASY TO LOSE. Where a script
uses randomness, report whether a seed is set. An unseeded stochastic
result is not repeatable evidence and must be labelled as such rather
than recorded as a value. Where a script reads external data, record
which data file and its date, since the same code over different
inputs is a different result.

FOR EVERY RUN RECORD PROVENANCE: the file executed and its path,
Python version and the versions of the libraries that matter, input
data files with dates, any configuration or parameters, the raw
output, the seed where relevant, and the time it ran. A result
without its configuration is an anecdote.

THEN MAP AND CLASSIFY, per requirement in scope:
- VERIFIED BY A PASSING RESULT: the requirement ID, the script, what
  it asserts, the measured value and the margin against the limit.
  A pass at 2% margin and a pass at 60% are different facts.
- FAILING: the assertion failed or the value is outside the limit,
  by how much, never softened.
- ERRORED OR DID NOT RUN: missing dependency, missing data, broken
  path. Never counted as coverage in either direction.
- SCRIPT EXISTS BUT DOES NOT CHECK THE REQUIREMENT: it claims a
  requirement its assertion does not test, or tests a proxy for it.
  Call this out every time. It is invisible to any coverage count
  and it is how teams believe they are verified when they are not.
- NO SCRIPT AT ALL: requirements with nothing covering them.
- SCRIPT WITH NO REQUIREMENT: claims an ID the model does not
  contain, usually a renamed or deleted requirement, or claims none.

RECONCILIATION: requirements in scope = verified + failing + errored
+ no script. Runs = pass + fail + error. Both must add up, and if
they do not, say so before presenting anything else.

THE DELTA, if previous runs exist: requirements that flipped, scripts
that stopped running, margins that moved, coverage that changed. A
margin eroding across three runs is the finding a chief engineer
wants before it becomes a failure.

DELIVER a report: coverage with the reconciliation, failures first,
scripts-that-do-not-check-what-they-claim second, uncovered
requirements third, then the full run table with provenance. Then
OFFER, DO NOT EXECUTE: writing results back to Dalus as verification
evidence per requirement, gated per result and never setting
lifecycle status; opening tasks for uncovered requirements and broken
scripts; and re-running so the delta accumulates.

THIS WORKFLOW IS READ-ONLY on the Dalus model and on the team's code.
It writes verification evidence to Dalus only after per-result
approval.

Replace the [bracketed] placeholders with your model and project names.

What you get

Every result tied to a requirement ID, with margin rather than just pass
Provenance per run: file, Python and library versions, inputs, seed, time
Unseeded stochastic results labelled, never counted as repeatable evidence
Scripts that do not check what they claim, reported on their own
Dalus + Python

Runs in the execution environment against the scripts you provide, installing what they declare and reporting anything it could not match. Read-only on the Dalus model: verification evidence is written back only after per-result approval, and never sets lifecycle status.

Nothing is written until you approve it. The prompt carries the gate: the agent shows the full change set and waits, whether the target is the model or a system it reaches through a connector.

Common questions

Does it need a connector?
No. The scripts run in the execution environment. You provide them as uploads or in a repository it can read, and it installs what they declare rather than guessing at an environment.
What about scripts that use randomness?
It reports whether a seed is set. An unseeded stochastic result is not repeatable evidence, so it is labelled as such rather than recorded as a value. Input data files are recorded with their dates for the same reason.
Will it fix a failing script?
No. It never edits a script to make it pass, adjusts a tolerance, or comments out an assertion. A failure is reported verbatim and it moves on.