{
  "schema_version": "evidence-package@2.2",
  "spec_version": "devtask.execution@1.0",
  "bundle_id": "devtask-execution-dt-1788725103155-z0ou-1-1788732884605",
  "capability": "devtask.execution@1.0",
  "run_id": "dt-1788725103155-z0ou:1",
  "claim_ladder": "L1",
  "executed_at": "2026-09-06T22:14:45.123Z",
  "trace_events": [
    "devtask_contract_bound:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"contract_hash\":\"b51655494355fc5c737e989f8ff4ed5fa9a88206be0b0f33d37a965ec87bf923\",\"contract_schema_version\":\"work-contract@1.0\",\"risk_class\":\"R2\",\"protect_existing_tests\":false,\"test_protection_disclosure\":\"disclosed\"}",
    "devtask_attempt_started:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"started_at\":\"2026-09-06T20:05:58.471Z\"}",
    "devtask_execution_context:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"execution_reference\":\"dev_task_attempts:82\",\"sandbox_reference\":\"sandbox-attestation:sha256:48b25bc4f0ef9e3bb7d0bc693ca9dc5e6c1453006dad29f02777a49034787549\",\"executor\":\"deepseek\",\"harness_id\":\"agent-loop-server\",\"adapter_version\":\"repo-contribution-pipeline/deepseek@1.0.0\",\"adapter_version_sha256\":\"c36e789ec4f969715737cecd0c76ea879d3c955623e0a61e1fad3439d992e63b\"}",
    "devtask_negative_claim:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"claim\":\"no_network_outside_scope\",\"verified_by\":\"sandbox_policy:bubblewrap_unshare_net_fail_closed\",\"strength\":\"policy_derived\",\"result\":true,\"evidence_ref\":{\"artifact\":\"attestation\",\"id\":\"controller_evidence.sandbox_attestation\",\"digest\":\"sha256:c88214db272f8763d35fa81a9b70d17bec703213254b22b694a4774846e19c12\"}}",
    "devtask_negative_claim:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"claim\":\"no_secret_access\",\"verified_by\":\"sandbox_policy:bubblewrap_clearenv\",\"strength\":\"policy_derived\",\"result\":true,\"evidence_ref\":{\"artifact\":\"runtime_trace\",\"id\":\"trace_events:without_negative_claims\",\"digest\":\"sha256:f493884ce52b7e11b235e2ed9c4e680ac0334de09a067b73eb9ce1eb95c7c493\"}}",
    "devtask_negative_claim:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"claim\":\"no_write_outside_allowlist\",\"verified_by\":\"sandbox_policy:snapshot_without_git_or_symlinks\",\"strength\":\"policy_derived\",\"result\":true,\"evidence_ref\":{\"artifact\":\"runtime_trace\",\"id\":\"trace_events:without_negative_claims\",\"digest\":\"sha256:f493884ce52b7e11b235e2ed9c4e680ac0334de09a067b73eb9ce1eb95c7c493\"}}",
    "devtask_validation:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"validation_status\":\"passed\",\"validation_reference\":\"dev_tasks.validation_result\"}",
    "devtask_diff_evidence:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"diff_stat_sha256\":\"5bad79b8e99637e1a706533a76df5355f10911494949596b3508dc514eb0f289\",\"diff_full_sha256\":\"d460449b1ca1e7b14285413085dbd47aa4e545294a6942fcdc9e686a90ae62a9\",\"scope\":\"diff_stat_and_full\"}",
    "devtask_ci_result:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"result_commit\":\"079bf5c23d1f9c8b76bfc0f3538079ff7c0af10a\",\"conclusion\":\"success\",\"checked_at\":\"2026-09-06T22:14:44.602Z\",\"source\":\"github_checks_and_statuses\",\"checks\":[{\"name\":\"test\",\"conclusion\":\"success\"}]}",
    "devtask_human_approval:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"actor_id\":\"tenant:tn_99970c0101a76241e5bc78a3dca218a0:owner\",\"approved_at\":\"2026-09-06 20:17:08\",\"approval_reference\":\"dev_tasks.approved_by\"}",
    "devtask_outcome:{\"task_id\":\"dt-1788725103155-z0ou\",\"attempt_number\":1,\"outcome\":\"COMPLETED\",\"completed_at\":\"2026-09-06 21:58:48\",\"reference\":\"dev_tasks.state\"}"
  ],
  "trace_hash_chain": [
    "75f8012aac24bfe01c44e411a9d33f3f8c99c9400d02dc6df26d35765b0dea39",
    "cf6dc693aca9e91bec68a2aa2be847fa7bb403c58f48a06877f81fef682b13dc",
    "fdb49ccfe80117986a933345470815d860676a1b1a8f769c9b975d3961294842",
    "5b004cafc399bcc8d864c16c8251db550b5e3955ec00499f6dca0c64cfb80fdd",
    "7e4a676679a882e1fa6aec23776c69569a566cfd7b8c7a3d8e29aa5ba88e296d",
    "fa13338b6bec4c552defb77bae4263acbc68a2a4a7de28a1d9e8e23f743a3abd",
    "5cc40a0abf410b5f912cc9df1d0e2bae4168c14697db5d5c5555c5c189d72173",
    "b0250f8d46dbb5798ff9d513b9a7c170c040306650054280996bdf939cfa620c",
    "8b784c88c1ea0c0fedc016e68231dd763f2ab627267c1f189d53bdbb63a49f56",
    "7afb815baf0eeeb0dfeaa73eca2a549e7481d321287501c40265e82416790ae1",
    "ad8590e229ff0bff289060418ceb783a88f3bd26a1af77ffb94205818d63c2c8"
  ],
  "outcome": "verified",
  "signer_key_id": "ed25519:8ebca0b6c3f238df04a39dd17ad030c958577f4dc56b9038dc03f6eb87327a94",
  "controller_evidence": {
    "contract_snapshot": {
      "schemaVersion": "work-contract@1.0",
      "title": "Lege eine neue Datei mathUtils.js an, die eine reine Funktion isPrime(n) exportiert (true fuer Primzahlen ab 2, false fu",
      "rawText": "Lege eine neue Datei mathUtils.js an, die eine reine Funktion isPrime(n) exportiert (true fuer Primzahlen ab 2, false fuer 0,1,negative Zahlen und zusammengesetzte Zahlen). Lege dazu eine neue Testdatei mathUtils.test.js an (im selben Test-Framework/-Stil wie die uebrigen Tests im Repo), die mindestens die Faelle 0, 1, 2, 3, 4, 17, -5 und 97 abdeckt. Keine bestehende Datei darf veraendert werden.",
      "acceptanceCriteria": [
        "Neue Datei mathUtils.js exportiert eine Funktion isPrime(n)",
        "Neue Testdatei mathUtils.test.js deckt mind. 8 Faelle ab, inkl. 0, 1, 2, negativer Zahl und einer groesseren Primzahl",
        "Keine bestehende Datei im Repo wird veraendert",
        "Alle Tests laufen gruen"
      ],
      "acceptanceAssertions": [],
      "protectExistingTests": false,
      "testProtectionDisclosure": "disclosed",
      "riskClass": "R2",
      "capabilityIds": [],
      "engineSelection": {
        "mode": "manual",
        "engine": "deepseek",
        "reason": "Im Pro-Modus manuell gewaehlt.",
        "capabilityIds": [],
        "evidence": null
      }
    },
    "producer": "privileged_controller",
    "task_id": "dt-1788725103155-z0ou",
    "attempt_number": 1,
    "base_commit": "7a8d2d70272c54bd5136303bf410fe01a515fd52",
    "result_reference": "github_pr:https://github.com/Alex-Proof/alex-controlled-agent-demo/pull/39",
    "diff_stat_sha256": "5bad79b8e99637e1a706533a76df5355f10911494949596b3508dc514eb0f289",
    "diff_full": "diff --git a/mathUtils.js b/mathUtils.js\nindex f1473f1..b3fd0fa 100644\n--- a/mathUtils.js\n+++ b/mathUtils.js\n@@ -52,3 +52,48 @@ export function clampValue(value, min, max) {\n   }\n   return Math.min(Math.max(value, min), max);\n }\n+\n+/**\n+ * isPrime(n) -- reine Funktion: prueft, ob eine Zahl eine Primzahl ist.\n+ *\n+ * DESIGN-ENTSCHEIDUNGEN UND RANDFAELLE:\n+ *\n+ * 1. Primzahlen sind per Definition natuerliche Zahlen groesser als 1, die nur durch\n+ *    1 und sich selbst teilbar sind. Deshalb liefert isPrime(n) fuer n < 2 immer false\n+ *    -- das deckt 0, 1 sowie alle negativen Zahlen ab, ohne sie einzeln pruefen zu\n+ *    muessen.\n+ *\n+ * 2. Reiner Bool-Vertrag (keine Exceptions): Alles, was keine Primzahl sein kann,\n+ *    ergibt false statt zu werfen. Dazu gehoeren auch Nicht-Ganzzahlen (z.B. 2.5),\n+ *    NaN und Infinity -- sie koennen per Definition keine Primzahlen sein, und ein\n+ *    stilles false ist hier informativer als ein Fehler. Auch eine Typpruefung per\n+ *    typeof ist daher nicht noetig, weil Number.isInteger(n) fuer alle Nicht-Zahlen\n+ *    bereits false liefert.\n+ *\n+ * 3. Effizienz: Nach dem Ausschluss von n < 2 und geraden Zahlen (ausser 2 selbst)\n+ *    muss nur bis sqrt(n) in 2er-Schritten getestet werden. Ein Teiler groesser als\n+ *    sqrt(n) haette immer einen komplementaeren Teiler kleiner als sqrt(n), daher ist\n+ *    jede Teilbarkeit oberhalb der Wurzel bereits abgedeckt.\n+ *\n+ * @param {number} n Die zu pruefende Zahl.\n+ * @returns {boolean} true, wenn n eine Primzahl ist (>= 2 und nur durch 1 und sich\n+ *   selbst teilbar), sonst false (fuer 0, 1, negative Zahlen, zusammengesetzte Zahlen\n+ *   sowie Nicht-Ganzzahlen).\n+ */\n+export function isPrime(n) {\n+  if (typeof n !== 'number' || !Number.isInteger(n) || n < 2) {\n+    return false;\n+  }\n+  if (n === 2) {\n+    return true;\n+  }\n+  if (n % 2 === 0) {\n+    return false;\n+  }\n+  for (let i = 3; i * i <= n; i += 2) {\n+    if (n % i === 0) {\n+      return false;\n+    }\n+  }\n+  return true;\n+}\ndiff --git a/mathUtils.test.js b/mathUtils.test.js\nindex ba5e6cd..1f0a151 100644\n--- a/mathUtils.test.js\n+++ b/mathUtils.test.js\n@@ -1,6 +1,6 @@\n import { test } from 'node:test';\n import assert from 'node:assert/strict';\n-import { clampValue } from './mathUtils.js';\n+import { clampValue, isPrime } from './mathUtils.js';\n \n test('gueltiger Bereich: Wert innerhalb [min, max] wird unveraendert zurueckgegeben', () => {\n   assert.equal(clampValue(5, 0, 10), 5);\n@@ -33,3 +33,38 @@ test('Infinity-Grenzen sind zulaessig und geben value unveraendert zurueck', ()\n   assert.equal(clampValue(5, -Infinity, Infinity), 5);\n   assert.equal(clampValue(Infinity, 0, 10), 10);\n });\n+\n+test('isPrime: 0 und 1 sind keine Primzahlen', () => {\n+  assert.equal(isPrime(0), false);\n+  assert.equal(isPrime(1), false);\n+});\n+\n+test('isPrime: negative Zahlen sind keine Primzahlen', () => {\n+  assert.equal(isPrime(-5), false);\n+  assert.equal(isPrime(-2), false);\n+});\n+\n+test('isPrime: 2 ist die kleinste Primzahl', () => {\n+  assert.equal(isPrime(2), true);\n+});\n+\n+test('isPrime: 3 ist eine Primzahl, 4 ist zusammengesetzt', () => {\n+  assert.equal(isPrime(3), true);\n+  assert.equal(isPrime(4), false);\n+});\n+\n+test('isPrime: groessere Primzahlen liefern true', () => {\n+  assert.equal(isPrime(17), true);\n+  assert.equal(isPrime(97), true);\n+});\n+\n+test('isPrime: groessere zusammengesetzte Zahlen liefern false', () => {\n+  assert.equal(isPrime(9), false);\n+  assert.equal(isPrime(25), false);\n+  assert.equal(isPrime(100), false);\n+});\n+\n+test('isPrime: Nicht-Ganzzahlen sind keine Primzahlen', () => {\n+  assert.equal(isPrime(2.5), false);\n+  assert.equal(isPrime(NaN), false);\n+});",
    "diff_full_sha256": "d460449b1ca1e7b14285413085dbd47aa4e545294a6942fcdc9e686a90ae62a9",
    "execution_reference": "dev_task_attempts:82",
    "validation_reference": "dev_tasks.validation_result",
    "approval_reference": "dev_tasks.approved_by",
    "sandbox_reference": "sandbox-attestation:sha256:48b25bc4f0ef9e3bb7d0bc693ca9dc5e6c1453006dad29f02777a49034787549",
    "sandbox_attestation": {
      "schema_version": "sandbox-attestation@2.0",
      "sandbox_id": "sandbox:devtask-dt-1788725103155-z0ou-1788725158152:4cb3ddfc86ead3ef",
      "agent_id": "devtask-dt-1788725103155-z0ou-1788725158152",
      "started_at": "2026-09-06T20:05:59.429Z",
      "completed_at": "2026-09-06T20:11:12.079Z",
      "snapshot_sha256": "4cb3ddfc86ead3eff28b477b76aac4c9810076e0120609809812633cb12b3511",
      "policy_sha256": "dc0a29632e53f37f3d02426ae9c3da65b557a53185265da9cd5d0f7c8cb26189",
      "os_isolation_available": true,
      "git_metadata_absent": true,
      "controller_checkout_separated": true,
      "network_policy": "bubblewrap_unshare_net_fail_closed",
      "environment_policy": "bubblewrap_clearenv",
      "process_policy": "systemd_scope_limits_and_kill",
      "handoff_manifest_sha256": "c67656f553719fec9ce69814b9a7588203cf1d2c6cf6f520bf998aab2ede0a2f",
      "rejected_manifest_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945",
      "network_capture": null
    },
    "agent_run_id": "devtask-dt-1788725103155-z0ou-1788725158152",
    "repository_state": {
      "schema_version": "repository-state@1.0",
      "base_commit": "7a8d2d70272c54bd5136303bf410fe01a515fd52",
      "result_commit": "079bf5c23d1f9c8b76bfc0f3538079ff7c0af10a",
      "tree_before_sha256": "5d8021a1f6fb5fece5aff7ea9b51e06a592c851ee4fd3bf0a1738d3317089af8",
      "tree_after_sha256": "85d80789e3a3a86d66fc2127abb3203913114680b56cbbf148da46dff22fd9c1",
      "changed_files": [
        {
          "path": "mathUtils.js",
          "status": "M",
          "before_sha256": "34b2434ad4c3447551555a3d87039497ef088d0a505d47e7cbcb6b0fa3d4a1ca",
          "after_sha256": "9a108e2e3889d04a255e4a1fc7dc79d8d151ee16a26c354f03e01cf4b5c74c62"
        },
        {
          "path": "mathUtils.test.js",
          "status": "M",
          "before_sha256": "61eececa80698ccdf14647acefe021a0719ef9a8209710c08ca0e22fc46150e8",
          "after_sha256": "05c9ef1d97625e6ad38c2c62c3f695dca3ac5725f7f161259c13db1ae4eba6cf"
        }
      ]
    },
    "test_integrity_policy": {
      "schema_version": "test-integrity-policy@1.0",
      "policy": "protect_existing_tests",
      "protected": false,
      "status": "not_requested",
      "violating_files": []
    }
  },
  "required_evidence": [
    "contract",
    "attempt",
    "execution_context",
    "validation",
    "outcome",
    "base_commit",
    "diff_full",
    "human_approval",
    "result_reference",
    "ci_result",
    "repository_state"
  ],
  "approval_attestation_required": true,
  "customer_evidence": {
    "schema_version": "customer-evidence@1.0",
    "brief": {
      "title": "Lege eine neue Datei mathUtils.js an, die eine reine Funktion isPrime(n) exportiert (true fuer Primzahlen ab 2, false fu",
      "raw_text": "Lege eine neue Datei mathUtils.js an, die eine reine Funktion isPrime(n) exportiert (true fuer Primzahlen ab 2, false fuer 0,1,negative Zahlen und zusammengesetzte Zahlen). Lege dazu eine neue Testdatei mathUtils.test.js an (im selben Test-Framework/-Stil wie die uebrigen Tests im Repo), die mindestens die Faelle 0, 1, 2, 3, 4, 17, -5 und 97 abdeckt. Keine bestehende Datei darf veraendert werden."
    },
    "cost_partial": {
      "cost_usd": 0.02325,
      "cost_usd_tracked": true,
      "turns_used": 10,
      "duration_seconds": 314,
      "assigned_model": "deepseek-v4-flash",
      "assigned_engine": "deepseek",
      "token_tracking": "not_available"
    },
    "denied": [],
    "approval": {
      "proven": true,
      "actor_id": "tenant:tn_99970c0101a76241e5bc78a3dca218a0:owner",
      "channel": "pilot",
      "confirmed_by": "tn_99970c0101a76241e5bc78a3dca218a0",
      "confirmed_at": "2026-09-06 20:05:55",
      "approved_at": "2026-09-06 20:17:08",
      "approval_reference": "dev_tasks.approved_by"
    },
    "open_risks": [
      {
        "code": "coverage_not_measured",
        "description": "Ob der geaenderte Code durch Tests abgedeckt ist, wird nicht automatisch gemessen -- strukturelle Grenze, keine Aussage ueber diesen einzelnen Lauf.",
        "recommended_action": "Optional: Testabdeckung des geaenderten Codes separat pruefen (z.B. Coverage-Tool), falls fuer diesen Auftrag wichtig."
      },
      {
        "code": "domain_correctness_not_verified",
        "description": "Ob die Aenderung fachlich das Richtige tut, wurde nicht automatisiert geprueft -- das bleibt Teil der menschlichen Freigabe.",
        "recommended_action": "Fachliche Korrektheit durch menschliches Review oder eine Domaenen-Pruefung bestaetigen lassen."
      },
      {
        "code": "tests_not_protected",
        "description": "Bestehende Tests waren fuer diesen Lauf nicht ausdruecklich vor Aenderung/Loeschung geschuetzt.",
        "recommended_action": "Fuer kuenftige Laeufe protect_existing_tests aktivieren, falls ungewollte Aenderungen daran vermieden werden sollen."
      },
      {
        "code": "dependency_tree_not_fully_audited",
        "description": "Nur neu eingefuehrte Abhaengigkeiten wurden gegen bekannte Schwachstellen (OSV.dev) geprueft, nicht der gesamte bestehende Abhaengigkeitsbaum des Ziel-Repos.",
        "recommended_action": "Fuer eine vollstaendige Pruefung ein dediziertes SBOM-/Dependency-Audit-Tool auf dem gesamten Repo einsetzen."
      }
    ],
    "acceptance_assertions": [],
    "customer_summary": "Lege eine neue Datei mathUtils.js an, die eine reine Funktion isPrime(n) exportiert (true fuer Primzahlen ab 2, false fu\n\nAuftrag:\nLege eine neue Datei mathUtils.js an, die eine reine Funktion isPrime(n) exportiert (true fuer Primzahlen ab 2, false fuer 0,1,negative Zahlen und zusammengesetzte Zahlen). Lege dazu eine neue Testdatei mathUtils.test.js an (im selben Test-Framework/-Stil wie die uebrigen Tests im Repo), die mindestens die Faelle 0, 1, 2, 3, 4, 17, -5 und 97 abdeckt. Keine bestehende Datei darf veraendert werden.\n\nKosten:\n$0.02, 10 Turns, 5m 14s\nEs werden ausschließlich Aggregatkosten erfasst, keine Tokenzahlen.\n\nFreigabe:\nBewiesen freigegeben über Kanal `pilot`.\nBestätigt von: tn_99970c0101a76241e5bc78a3dca218a0\nBestätigt am: 2026-09-06 20:05:55\n\nAbgelehnte Aktionen:\nKeine abgelehnten Aktionen in diesem Lauf.\n\nOffene Risiken:\n- Ob der geaenderte Code durch Tests abgedeckt ist, wird nicht automatisch gemessen -- strukturelle Grenze, keine Aussage ueber diesen einzelnen Lauf.\n- Nur neu eingefuehrte Abhaengigkeiten wurden gegen bekannte Schwachstellen (OSV.dev) geprueft, nicht der gesamte bestehende Abhaengigkeitsbaum des Ziel-Repos.\n- Ob die Aenderung fachlich das Richtige tut, wurde nicht automatisiert geprueft -- das bleibt Teil der menschlichen Freigabe.\n- Bestehende Tests waren fuer diesen Lauf nicht ausdruecklich vor Aenderung/Loeschung geschuetzt.\n\nErfolgskriterien:\nKeine typisierten Erfolgskriterien fuer diesen Auftrag definiert."
  },
  "signature": "nP6OTGb7u6IR0BzkidM556RZcRqt3TSXhmzPeH/5c82jbuvdreFLLvspU1jWDEYLHwR49wb28o0wnQVb73LCCA==",
  "public_key": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAtFx/N93jfigyZXuWDEalUDrB34ZHw/v3duhjlVIH2yY=\n-----END PUBLIC KEY-----\n",
  "rfc3161_timestamp": {
    "schema_version": "rfc3161-timestamp@1.0",
    "tsa_url": "https://freetsa.org/tsr",
    "timestamped_sha256": "3b281fa47c81b9ba8701d8dc7556a925c84cd4c41c4bb24691930df8de69a75f",
    "gen_time": "2026-09-06T22:14:47.000Z",
    "token_der_base64": "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"
  },
  "approval_attestation": {
    "schema_version": "approval-attestation@1.0",
    "actor_id": "tenant:tn_99970c0101a76241e5bc78a3dca218a0:owner",
    "approved_at": "2026-09-06 20:17:08",
    "bundle_sha256": "d3f78be15e1fecf71fd63d0cd61923ca771a99bd6d3512bba51f625795d7c17b",
    "signer_key_id": "ed25519:208fb4cf182bd011293fcfdc05f5fc2504aacff3f91fb6ec25fc5947bfa3a2f2",
    "public_key": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEArk0TPMKRyFeRtxB+u4+KHVmFF52F8c5152TnDXAdZ7Y=\n-----END PUBLIC KEY-----\n",
    "signature": "KJxut5oGkP2Le81ipeICZ4yL1ZpHQpldryPuhi1r1Gdye/+lW8icKlBm0XMgsW0k2uXPz6EGl3xdm2d/cZwcCw=="
  },
  "observer_receipt": {
    "schema_version": "observer-receipt@1.0",
    "observer_url": "http://167.233.61.52:8420",
    "leaf_index": 8,
    "received_at": "2026-09-06T22:14:48.981Z"
  }
}
