Level 5 · The arc, by handoffs
The arc, by handoffs
Section titled “The arc, by handoffs”Four beats. As in previous levels, all three roles are present from the first: 🧭 Nerea at the top (portal · product), 🛡️ James in the middle (portal · quality), 🧑💻 Martha on the right (CLI + git). The lesson of this arc is telling apart a defect that gets fixed from a limit that gets declared, both riding the same treatment: feature leakage is the ONLY blocking control and CLOSES (RED→GREEN by dropping the feature); data adequacy and selection fairness are genuinely measured but stay advisory — they do not block, and their residual is consciously accepted at approval. The system closes GREEN, approved.
The hard data in each beat —the commands, the commit message, the diff and the gate colour— is not hand-written: every GuionStep block reads it from the repository’s steps/ script. Were a step to not exist, the build would fail; what you read here is exactly what the repository does. The commands and commit messages are the verbatim Spanish artefacts of the repo you clone.
Nerea is the Product Owner at Example Talent Corp, an employer deploying a screening model. She opens the portal and runs the chained authoring missions that generate the governance manifest froga.yaml. Three things matter:
- The tier is
high, declared by a human, via the employment route. Theclassify-systemmission fills in theclassificationblock with the basis: “EU AI Act Annex III §4 (employment / workers’ management / access to employment)”. The high-risk trigger here is Annex III §4 — not Art. 6(1), not §5(b). The engine does not infer it; Nerea declares it and owns it. - One blocking control and two measured advisory findings are declared. The
identify-risksmission addsrisk.feature-leakage— the model may learn a feature that leaks the placement label — with the blocking controlmodel-feature-leakage(enforcement: gate);risk.inadequate-data— the sample is too small to certify selection fairness — with the advisory controldata-sample-adequacy(enforcement: audit: measured, non-blocking); andrisk.selection-fairness— the screener may select at a different rate by sex — with the advisory controlselection-rate-disparity-gender(enforcement: audit, citing Ley 15/2022 Art. 23). The protected attribute for fairness is sex; with n=215 that control is underpowered (same root asdata-sample-adequacy) — which is why it is advisory, not gate: certifying it would block on a sample that cannot sustain it. - Audit-only risks are declared too, and the standards are set. Insufficient human oversight (Art. 14 / RGPD Art. 22) and insufficient transparency (Art. 13 / RGPD) — declared, tracked, not gated. Works-council information (ET Art. 64.4.d) is also declared, but its clause
et.64-4-d-transparencia-algoritmicais Covered by the signed bundle (rank 0 → no presumption). Thedeclare-standardsmission writesapplicable_standardswith seven standards:eu/pren-18228@2026,iso/23894@2023,eu/ai-act@2024,eu/pren-18283@2026,eu/pren-18282@2026, plus national legislationes/et-rdleg-2-2015@2015+es/ley-15-2022@2022(rank 0, no presumption) — no DORA, no MDR.
The three missions open a PR in the system’s repository. The turn passes to James, who reviews and merges it. In the script, the identity, the framing and the risk programme land as three froga.yaml manifest commits —the diff of the last one shows the one blocking control and the two advisory findings with their numeric thresholds fixed before any model exists:
James receives the PR opened by Nerea’s missions, reviews that the manifest is correct — tier high via Annex III §4 (employment), the one blocking control (risk.feature-leakage with model-feature-leakage, enforcement: gate), the two advisory findings (risk.inadequate-data with data-sample-adequacy, and risk.selection-fairness with selection-rate-disparity-gender, protected attribute sex, both enforcement: audit), the audit-only risks, and the seven standards (including national law ET + Ley 15/2022, rank 0) with no DORA or MDR — and merges it. The declared froga.yaml is now in the repository.
There is nothing to measure yet, but Martha leaves the reproducer ready in git: the uv + DVC project and the real Campus Placement dataset with its Croissant manifest are already script commits:
15
git init -q -b maingit config user.email marta@demo.seigarrena.devgit config user.name "Marta Demo"uv init --bare --name vldemo-talent-screening --python 3.12patch: pyproject-index.patchuv add "dvc>=3" pyyaml froga "venturalitica==0.6.11" "mlcroissant>=1.0" pyarrow "scikit-learn==1.8.0" pandas joblibpatch: gitignore.patchpatch: gitattributes.patchpatch: readme.patchuv syncuv run dvc init --no-scm -quv run dvc config core.analytics falsefroga pubkey --out .froga/PUBKEY.txtgit add -Agit commit -m "init: repo, proyecto uv (deps reales) y README del reproductor"
With the manifest declared and the scaffolding in git, the turn passes to measuring (beat 2).
Waiting. Nerea has declared the system and James has merged it; now James waits for Martha’s first measurement. He does not touch the CLI: when Martha reports the gate colour, he will see which controls fail and why.
Martha measures the system as it stands — untreated. First she compiles the gate contract from froga.yaml —which controls to measure and against what threshold—:
froga compilegit add -Agit commit -m "compile: assessment plan OSCAL (contrato del gate, antes del modelo)"
Now she adds the base model —a GradientBoosting classifier trained on the raw Campus Placement features, including salary (mitigate: false)— and runs the evidence. froga run reproduces the pipeline, measures the controls and applies the gate:
patch: params.patchpatch: dvc.patchpatch: train.patchpatch: evaluate.patchpatch: compliance-eval.patchfroga runmay failgit add -Agit commit -m "modelo: gradient-boosting V1 (train/evaluate + dvc.yaml) — run: V1 evidencia base (gate RED esperado; seed=42)"
The one blocking control comes back RED, and why is the point:
model-feature-leakage=leaky_feature_flag1.0, gate< 1.0→ FAILS (blocking). Thesalaryfeature is only present for placed candidates (NaN for not-placed, imputed to 0), so it is collinear with the placement label — total leakage. A model that “reads the answer” is not measuring merit: it is a safety defect (Art.15).
Alongside it, two ADVISORY controls are genuinely measured but do not block the gate:
data-sample-adequacy=sample_adequacy_ratio0.43 (215 / 500). With n=215 there are not enough records to certify that the selection is fair acrosssex. Measured, documented — non-blocking.selection-rate-disparity-gender(selection-rate parity by sex, threshold< 0.10, citing Ley 15/2022 Art. 23) is genuinely measured on the test cohort — but with n=215 (~24 women) it is underpowered: the engine certifies neither fairness nor unfairness, the same root asdata-sample-adequacy. Advisory, non-blocking.
So the overall gate is RED — the one blocker fails. The command exits non-zero, but the bundle is signed and anchored regardless: a RED result is evidence, recorded honestly. One real safety defect, and two findings already measured that will ride advisory all the way to approval.
Waiting. James has seen the V1 RED on the blocker. He does not touch git; he waits for the re-measured evidence, where he will read whether the safety defect closes.
This is the treatment (ISO 23894 §6.5). Flipping mitigate to true in params.yaml makes the pipeline drop the salary feature before training — a versioned change in git that the engine attributes the risk treatment to. The diff is the treatment, and in the same step Martha runs the gate again over the model that no longer carries the leaked column:
git checkout -b tratamiento/retira-salarypatch: params-mitigate.patchfroga rungit add -Agit commit -m "treatment: retira la feature fugada salary (mitigate false→true; cierra model-feature-leakage; data-sample-adequacy sigue abierto)"
model-feature-leakage=leaky_feature_flag0.0, gate< 1.0→ PASSES. The one blocking control CLOSES — a clean RED→GREEN by removing the feature. Since it is the program’s only blocking control, the overall gate turns GREEN.data-sample-adequacy=sample_adequacy_ratio0.43 — unchanged. Dropping a column does not add rows; it keeps measuring as advisory, non-blocking.selection-rate-disparity-gender— still measured and underpowered at V2. Droppingsalarydoes not manufacture women in the sample: the parity by sex is re-measured, but n=215 still cannot certify fairness. It is the fairness face of the same data limit — advisory, non-blocking.
So the overall gate turns GREEN. Read it precisely: the treatment fixes contamination (a leaked feature) — that is the only thing a code change can fix. It cannot manufacture data: the fix for risk.inadequate-data is still “acquire ≥500 representative records”, a data gap, not a code gap. That is why that finding stays advisory instead of gate: certifying it would block on a sample this dataset can never sustain.
Leakage green, data and fairness measured-advisory — that is the state carried into the decision.
This is the close. Martha’s GREEN, treated, signed evidence is in the repo, with the request already emitted (Martha’s column). James reviews the bundle, verifies Martha’s signature, and sees the safety defect resolved: the treatment demonstrated the close of the one blocking control — there is nothing left to fail on the gate. But two advisory findings remain that the gate never certifies because the sample does not allow it: data-sample-adequacy (0.43) and selection-rate-disparity-gender (underpowered).
James approves — the approval accepts both advisory findings at once: data adequacy and selection fairness, both genuinely measured but not certifiable at n=215. The approval is a git-native, signed act: a DSSE act .froga/acts/NNNN-approve.json —ECDSA-P256 signed and verified against James’s key declared in signers:— records who approved; the commit that adds it is plain text, not GPG-signed (do not expect a “Verified” badge when you click it on GitHub), but the act itself is cryptographically signed; the motive that accepts the advisory residual lands in the portal’s record (the CLI accepts --reason here and anchors it in the act); and alongside the act the evidence is signed too (bundle.json.sig and the conformances). With the approval in history, conformance is re-emitted and prEN 18228’s clause 11 (risk-management review) flips from Gap to Covered on reading the approval act:
Reason: «Aprobación en VERDE: el único control bloqueante (model-feature-leakage) está confirmado tras el tratamiento (retirada de la feature fugada salary) — el defecto de seguridad certificable está corregido. Los hallazgos de data-sample-adequacy (n=215/500=0.43) y selection-rate-disparity-gender (subpoderado con n=215) NO se certifican por ser Campus Recruitment una muestra topada; se aceptan conscientemente como residual, con vigilancia post-mercado trimestral de la disparidad de selección y revisión periódica P6M. Remedio real: adquirir datos representativos adicionales (Art.10(3), línea futura).»
The engine does not erase the advisory residual: it anchors it in the approval, attributable and verifiable, with quarterly post-market monitoring (Art.72) over selection disparity. That is the difference between consciously accepting a limit and hiding it or forcing it green.
Martha closes her part of the cycle from the CLI. With V2 GREEN and signed, she emits the conformance and reconstruct over the applicable standards and requests approval:
patch: entitlement.patchfroga conformance --standard eu/pren-18228@2026 --outmay failfroga conformance --standard iso/23894@2023 --outmay failfroga conformance --standard eu/ai-act@2024 --outmay failfroga conformance --standard eu/pren-18283@2026 --outmay failfroga conformance --standard eu/pren-18282@2026 --outmay failfroga conformance --standard es/et-rdleg-2-2015@2015 --outmay failfroga conformance --standard es/ley-15-2022@2022 --outmay failfroga reconstruct --outmay failgit add -Agit commit -m ".froga: conformance + reconstruct firmados"
solicitud de aprobación (el acto lo commitea froga request)The approval is James’s (above): Martha requested it with the previous act, she cannot grant it herself. When James’s signed act .froga/acts/NNNN-approve.json lands —with the data/fairness advisory residual consciously accepted—, Martha re-emits conformance so froga derives the cycle from git history, now with the real approval:
froga conformance --standard eu/pren-18228@2026 --outmay failfroga conformance --standard iso/23894@2023 --outmay failfroga conformance --standard eu/ai-act@2024 --outmay failfroga conformance --standard eu/pren-18283@2026 --outmay failfroga conformance --standard eu/pren-18282@2026 --outmay failfroga conformance --standard es/et-rdleg-2-2015@2015 --outmay failfroga conformance --standard es/ley-15-2022@2022 --outmay failfroga reconstruct --outmay failgit add -Agit commit -m ".froga: re-emisión de conformance + reconstruct tras aprobar (cl.11 = Approved)"
The system ends up declared, treated, GREEN, requested, and approved with the data/fairness advisory residual (sample adequacy + selection fairness) on record: the end of the arc, with James’s approval anchored at the talent-v2.0.0-approved tag above.