{"uuid": "4f794de1-0523-439c-8282-b3132ddd774f", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "GHSA-p498-v437-472g", "type": "seen", "source": "https://gist.github.com/citadelculture/59ba3685c4ac125fd240e01b8fcee60a", "content": "=== TRANSCRIPT: RED (unmodified pinned tree) ===\ndate: 2026-09-08T05:57:17Z\nHEAD: 40d2df72710a644f33a2b30831061e8265716db0\ngit status --short:\n   M package.json\n  ?? node_modules\n  ?? scripts/offchain-task-event-integrity-smoke.mjs\nguard present in server/offchain-task-lifecycle.js: 0 match(es)\n-------------------------------------------------\n\n$ npm run check:fast\n\n&gt; tasknode@0.1.0 check:fast\n&gt; npm run file-size-check &amp;&amp; npm run format-check &amp;&amp; npm run lint &amp;&amp; npm run api-reference-check &amp;&amp; npm run security\n\n\n&gt; tasknode@0.1.0 file-size-check\n&gt; node scripts/check-file-size.mjs\n\nfile size check ok: 0 active exceptions, no file over its configured limit\n\n&gt; tasknode@0.1.0 format-check\n&gt; node scripts/format-check.mjs\n\nformat check ok\n\n&gt; tasknode@0.1.0 lint\n&gt; eslint src server scripts shared\n\n\n&gt; tasknode@0.1.0 api-reference-check\n&gt; node scripts/generate-api-reference.mjs\n\nAPI reference ok: 174 policies match the generated inventory\n\n&gt; tasknode@0.1.0 security\n&gt; npm audit --audit-level=high &amp;&amp; npm run public-help-check &amp;&amp; npm run route-auth-policy-smoke &amp;&amp; npm run trusted-proxy-rate-limit-smoke &amp;&amp; npm run account-data-lifecycle-smoke &amp;&amp; npm run data-retention-smoke &amp;&amp; npm run data-recovery-safety-smoke &amp;&amp; npm run asset-provenance-check &amp;&amp; npm run dependency-license-check\n\n# npm audit report\n\n@humanfs/node  &lt;0.16.8\nSeverity: moderate\nhumanfs: Recursive copy follows symlinked files and copies data from outside the source tree - https://github.com/advisories/GHSA-p498-v437-472g\nfix available via `npm audit fix`\nnode_modules/@humanfs/node\n\n1 moderate severity vulnerability\n\nTo address all issues, run:\n  npm audit fix\n\n&gt; tasknode@0.1.0 public-help-check\n&gt; node scripts/public-help-boundary.mjs\n\npublic Help boundary ok: 26 explicitly allowlisted Markdown sources\n\n&gt; tasknode@0.1.0 route-auth-policy-smoke\n&gt; node scripts/route-auth-policy-smoke.mjs\n\nroute auth policy smoke ok: 174 policies cover 151 registered literal paths and 8 modes\n\n&gt; tasknode@0.1.0 trusted-proxy-rate-limit-smoke\n&gt; node scripts/trusted-proxy-rate-limit-smoke.mjs\n\ntrusted proxy and shared rate-limit smoke ok\n\n&gt; tasknode@0.1.0 account-data-lifecycle-smoke\n&gt; node scripts/account-data-lifecycle-smoke.mjs\n\naccount data export and deletion lifecycle smoke ok\n\n&gt; tasknode@0.1.0 data-retention-smoke\n&gt; node scripts/data-retention-smoke.mjs\n\ndata retention smoke ok\n\n&gt; tasknode@0.1.0 data-recovery-safety-smoke\n&gt; node scripts/data-recovery-safety-smoke.mjs\n\ndata recovery safety smoke ok: remote, destructive-target, and malformed-store guards verified\n\n&gt; tasknode@0.1.0 asset-provenance-check\n&gt; node scripts/asset-provenance-check.mjs\n\nasset provenance check ok: 10 reviewed public assets\n\n&gt; tasknode@0.1.0 dependency-license-check\n&gt; node scripts/dependency-license-check.mjs\n\ndependency license check ok: 483 packages; reviewed reciprocal/content licenses: LGPL-3.0-or-later=10, Apache-2.0 AND LGPL-3.0-or-later AND MIT=1, Apache-2.0 AND LGPL-3.0-or-later=3, MPL-2.0=13, CC-BY-4.0=1\n[exit 0]\n\n$ npm run offchain-task-lifecycle-smoke\n\n&gt; tasknode@0.1.0 offchain-task-lifecycle-smoke\n&gt; node scripts/offchain-task-lifecycle-smoke.mjs\n\noffchain-task-lifecycle-smoke ok\n[exit 0]\n\n$ TASKNODE_DATABASE_ENABLED=false node scripts/offchain-task-event-integrity-smoke.mjs\n[characterization] pre-guard exploit reproduced: accept emits pf.reward.v1 id=task_evt_attacker_chosen tx=DEADBEEF00000000000000000000000000000000000000000000000000000001 task_id=task_someone_elses economic_reward_pft=5000\nFAIL (19 assertions):\n- accept event_type must be server-derived pf.task.update.v1: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.reward.v1'\n- 'pf.task.update.v1'\n      ^\n\n- accept event id must be server-generated, not client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'task_evt_attacker_chosen'\n- accept source_tx_hash must be server ref offchain:: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'DEADBEEF00000000000000000000000000000000000000000000000000000001'\n- 'offchain:task_evt_attacker_chosen'\n\n- accept source_cid must be server ref postgres:: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'bafyforgedcid'\n- 'postgres:task_evt_attacker_chosen'\n\n- accept payload.task_id must be the authoritative task: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'task_someone_elses'\n- 'task_victim_owned_by_attacker'\n        ^\n\n- accept pointer.task_id must be the authoritative task: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'task_someone_elses'\n- 'task_victim_owned_by_attacker'\n        ^\n\n- accept must not carry a client economic reward: Expected values to be strictly equal:\n+ actual - expected\n\n+ 5000\n- undefined\n\n- persisted task_events.event_type for accept must be pf.task.update.v1: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.reward.v1'\n- 'pf.task.update.v1'\n      ^\n\n- persisted task_events.id must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'task_evt_attacker_chosen'\n- persisted source_tx_hash must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'DEADBEEF00000000000000000000000000000000000000000000000000000001'\n- persisted source_cid must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'bafyforgedcid'\n- persisted payload_json.task_id must be the authoritative task: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'task_someone_elses'\n- 'task_victim_owned_by_attacker'\n        ^\n\n- persisted payload_json.economic_reward_pft must not be client-chosen: Expected values to be strictly equal:\n+ actual - expected\n\n+ 5000\n- undefined\n\n- cancel must not emit a client-chosen pf.task.submission.v1 event_type: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.task.submission.v1'\n- 'pf.task.update.v1'\n           ^\n\n- cancel event id must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'task_evt_forged_submission'\n- refuse event_type must be server-derived, not the client's pf.reward.v1: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.reward.v1'\n- 'pf.task.update.v1'\n      ^\n\n- client cannot pin the task_events primary key (A): Expected \"actual\" to be strictly unequal to:\n\n'task_evt_pinned_pk'\n- client cannot pin the task_events primary key (B): Expected \"actual\" to be strictly unequal to:\n\n'task_evt_pinned_pk'\n- two attacker calls get distinct server-generated ids (no forced collision): Expected \"actual\" to be strictly unequal to:\n\n'task_evt_pinned_pk'\n[exit 1]\n\n\n############################################################\n\n=== TRANSCRIPT: GREEN (guard applied) ===\ndate: 2026-09-08T05:57:38Z\nHEAD: 40d2df72710a644f33a2b30831061e8265716db0\ngit status --short:\n   M package.json\n   M server/offchain-task-lifecycle.js\n  ?? node_modules\n  ?? scripts/offchain-task-event-integrity-smoke.mjs\nguard present in server/offchain-task-lifecycle.js: 2 match(es)\n-------------------------------------------------\n\n$ npm run check:fast\n\n&gt; tasknode@0.1.0 check:fast\n&gt; npm run file-size-check &amp;&amp; npm run format-check &amp;&amp; npm run lint &amp;&amp; npm run api-reference-check &amp;&amp; npm run security\n\n\n&gt; tasknode@0.1.0 file-size-check\n&gt; node scripts/check-file-size.mjs\n\nfile size check ok: 0 active exceptions, no file over its configured limit\n\n&gt; tasknode@0.1.0 format-check\n&gt; node scripts/format-check.mjs\n\nformat check ok\n\n&gt; tasknode@0.1.0 lint\n&gt; eslint src server scripts shared\n\n\n&gt; tasknode@0.1.0 api-reference-check\n&gt; node scripts/generate-api-reference.mjs\n\nAPI reference ok: 174 policies match the generated inventory\n\n&gt; tasknode@0.1.0 security\n&gt; npm audit --audit-level=high &amp;&amp; npm run public-help-check &amp;&amp; npm run route-auth-policy-smoke &amp;&amp; npm run trusted-proxy-rate-limit-smoke &amp;&amp; npm run account-data-lifecycle-smoke &amp;&amp; npm run data-retention-smoke &amp;&amp; npm run data-recovery-safety-smoke &amp;&amp; npm run asset-provenance-check &amp;&amp; npm run dependency-license-check\n\n# npm audit report\n\n@humanfs/node  &lt;0.16.8\nSeverity: moderate\nhumanfs: Recursive copy follows symlinked files and copies data from outside the source tree - https://github.com/advisories/GHSA-p498-v437-472g\nfix available via `npm audit fix`\nnode_modules/@humanfs/node\n\n1 moderate severity vulnerability\n\nTo address all issues, run:\n  npm audit fix\n\n&gt; tasknode@0.1.0 public-help-check\n&gt; node scripts/public-help-boundary.mjs\n\npublic Help boundary ok: 26 explicitly allowlisted Markdown sources\n\n&gt; tasknode@0.1.0 route-auth-policy-smoke\n&gt; node scripts/route-auth-policy-smoke.mjs\n\nroute auth policy smoke ok: 174 policies cover 151 registered literal paths and 8 modes\n\n&gt; tasknode@0.1.0 trusted-proxy-rate-limit-smoke\n&gt; node scripts/trusted-proxy-rate-limit-smoke.mjs\n\ntrusted proxy and shared rate-limit smoke ok\n\n&gt; tasknode@0.1.0 account-data-lifecycle-smoke\n&gt; node scripts/account-data-lifecycle-smoke.mjs\n\naccount data export and deletion lifecycle smoke ok\n\n&gt; tasknode@0.1.0 data-retention-smoke\n&gt; node scripts/data-retention-smoke.mjs\n\ndata retention smoke ok\n\n&gt; tasknode@0.1.0 data-recovery-safety-smoke\n&gt; node scripts/data-recovery-safety-smoke.mjs\n\ndata recovery safety smoke ok: remote, destructive-target, and malformed-store guards verified\n\n&gt; tasknode@0.1.0 asset-provenance-check\n&gt; node scripts/asset-provenance-check.mjs\n\nasset provenance check ok: 10 reviewed public assets\n\n&gt; tasknode@0.1.0 dependency-license-check\n&gt; node scripts/dependency-license-check.mjs\n\ndependency license check ok: 483 packages; reviewed reciprocal/content licenses: LGPL-3.0-or-later=10, Apache-2.0 AND LGPL-3.0-or-later AND MIT=1, Apache-2.0 AND LGPL-3.0-or-later=3, MPL-2.0=13, CC-BY-4.0=1\n[exit 0]\n\n$ npm run offchain-task-lifecycle-smoke\n\n&gt; tasknode@0.1.0 offchain-task-lifecycle-smoke\n&gt; node scripts/offchain-task-lifecycle-smoke.mjs\n\noffchain-task-lifecycle-smoke ok\n[exit 0]\n\n$ GUARD_APPLIED=1 TASKNODE_DATABASE_ENABLED=false node scripts/offchain-task-event-integrity-smoke.mjs\noffchain task event integrity smoke ok\n[exit 0]\n\n\n\n=== TRANSCRIPT: GREEN (guard applied) ===\ndate: 2026-09-08T05:57:38Z\nHEAD: 40d2df72710a644f33a2b30831061e8265716db0\ngit status --short:\n   M package.json\n   M server/offchain-task-lifecycle.js\n  ?? node_modules\n  ?? scripts/offchain-task-event-integrity-smoke.mjs\nguard present in server/offchain-task-lifecycle.js: 2 match(es)\n-------------------------------------------------\n\n$ npm run check:fast\n\n&gt; tasknode@0.1.0 check:fast\n&gt; npm run file-size-check &amp;&amp; npm run format-check &amp;&amp; npm run lint &amp;&amp; npm run api-reference-check &amp;&amp; npm run security\n\n\n&gt; tasknode@0.1.0 file-size-check\n&gt; node scripts/check-file-size.mjs\n\nfile size check ok: 0 active exceptions, no file over its configured limit\n\n&gt; tasknode@0.1.0 format-check\n&gt; node scripts/format-check.mjs\n\nformat check ok\n\n&gt; tasknode@0.1.0 lint\n&gt; eslint src server scripts shared\n\n\n&gt; tasknode@0.1.0 api-reference-check\n&gt; node scripts/generate-api-reference.mjs\n\nAPI reference ok: 174 policies match the generated inventory\n\n&gt; tasknode@0.1.0 security\n&gt; npm audit --audit-level=high &amp;&amp; npm run public-help-check &amp;&amp; npm run route-auth-policy-smoke &amp;&amp; npm run trusted-proxy-rate-limit-smoke &amp;&amp; npm run account-data-lifecycle-smoke &amp;&amp; npm run data-retention-smoke &amp;&amp; npm run data-recovery-safety-smoke &amp;&amp; npm run asset-provenance-check &amp;&amp; npm run dependency-license-check\n\n# npm audit report\n\n@humanfs/node  &lt;0.16.8\nSeverity: moderate\nhumanfs: Recursive copy follows symlinked files and copies data from outside the source tree - https://github.com/advisories/GHSA-p498-v437-472g\nfix available via `npm audit fix`\nnode_modules/@humanfs/node\n\n1 moderate severity vulnerability\n\nTo address all issues, run:\n  npm audit fix\n\n&gt; tasknode@0.1.0 public-help-check\n&gt; node scripts/public-help-boundary.mjs\n\npublic Help boundary ok: 26 explicitly allowlisted Markdown sources\n\n&gt; tasknode@0.1.0 route-auth-policy-smoke\n&gt; node scripts/route-auth-policy-smoke.mjs\n\nroute auth policy smoke ok: 174 policies cover 151 registered literal paths and 8 modes\n\n&gt; tasknode@0.1.0 trusted-proxy-rate-limit-smoke\n&gt; node scripts/trusted-proxy-rate-limit-smoke.mjs\n\ntrusted proxy and shared rate-limit smoke ok\n\n&gt; tasknode@0.1.0 account-data-lifecycle-smoke\n&gt; node scripts/account-data-lifecycle-smoke.mjs\n\naccount data export and deletion lifecycle smoke ok\n\n&gt; tasknode@0.1.0 data-retention-smoke\n&gt; node scripts/data-retention-smoke.mjs\n\ndata retention smoke ok\n\n&gt; tasknode@0.1.0 data-recovery-safety-smoke\n&gt; node scripts/data-recovery-safety-smoke.mjs\n\ndata recovery safety smoke ok: remote, destructive-target, and malformed-store guards verified\n\n&gt; tasknode@0.1.0 asset-provenance-check\n&gt; node scripts/asset-provenance-check.mjs\n\nasset provenance check ok: 10 reviewed public assets\n\n&gt; tasknode@0.1.0 dependency-license-check\n&gt; node scripts/dependency-license-check.mjs\n\ndependency license check ok: 483 packages; reviewed reciprocal/content licenses: LGPL-3.0-or-later=10, Apache-2.0 AND LGPL-3.0-or-later AND MIT=1, Apache-2.0 AND LGPL-3.0-or-later=3, MPL-2.0=13, CC-BY-4.0=1\n[exit 0]\n\n$ npm run offchain-task-lifecycle-smoke\n\n&gt; tasknode@0.1.0 offchain-task-lifecycle-smoke\n&gt; node scripts/offchain-task-lifecycle-smoke.mjs\n\noffchain-task-lifecycle-smoke ok\n[exit 0]\n\n$ GUARD_APPLIED=1 TASKNODE_DATABASE_ENABLED=false node scripts/offchain-task-event-integrity-smoke.mjs\noffchain task event integrity smoke ok\n[exit 0]\n\n\n\n=== TRANSCRIPT: RED (unmodified pinned tree) ===\ndate: 2026-09-08T05:57:17Z\nHEAD: 40d2df72710a644f33a2b30831061e8265716db0\ngit status --short:\n   M package.json\n  ?? node_modules\n  ?? scripts/offchain-task-event-integrity-smoke.mjs\nguard present in server/offchain-task-lifecycle.js: 0 match(es)\n-------------------------------------------------\n\n$ npm run check:fast\n\n&gt; tasknode@0.1.0 check:fast\n&gt; npm run file-size-check &amp;&amp; npm run format-check &amp;&amp; npm run lint &amp;&amp; npm run api-reference-check &amp;&amp; npm run security\n\n\n&gt; tasknode@0.1.0 file-size-check\n&gt; node scripts/check-file-size.mjs\n\nfile size check ok: 0 active exceptions, no file over its configured limit\n\n&gt; tasknode@0.1.0 format-check\n&gt; node scripts/format-check.mjs\n\nformat check ok\n\n&gt; tasknode@0.1.0 lint\n&gt; eslint src server scripts shared\n\n\n&gt; tasknode@0.1.0 api-reference-check\n&gt; node scripts/generate-api-reference.mjs\n\nAPI reference ok: 174 policies match the generated inventory\n\n&gt; tasknode@0.1.0 security\n&gt; npm audit --audit-level=high &amp;&amp; npm run public-help-check &amp;&amp; npm run route-auth-policy-smoke &amp;&amp; npm run trusted-proxy-rate-limit-smoke &amp;&amp; npm run account-data-lifecycle-smoke &amp;&amp; npm run data-retention-smoke &amp;&amp; npm run data-recovery-safety-smoke &amp;&amp; npm run asset-provenance-check &amp;&amp; npm run dependency-license-check\n\n# npm audit report\n\n@humanfs/node  &lt;0.16.8\nSeverity: moderate\nhumanfs: Recursive copy follows symlinked files and copies data from outside the source tree - https://github.com/advisories/GHSA-p498-v437-472g\nfix available via `npm audit fix`\nnode_modules/@humanfs/node\n\n1 moderate severity vulnerability\n\nTo address all issues, run:\n  npm audit fix\n\n&gt; tasknode@0.1.0 public-help-check\n&gt; node scripts/public-help-boundary.mjs\n\npublic Help boundary ok: 26 explicitly allowlisted Markdown sources\n\n&gt; tasknode@0.1.0 route-auth-policy-smoke\n&gt; node scripts/route-auth-policy-smoke.mjs\n\nroute auth policy smoke ok: 174 policies cover 151 registered literal paths and 8 modes\n\n&gt; tasknode@0.1.0 trusted-proxy-rate-limit-smoke\n&gt; node scripts/trusted-proxy-rate-limit-smoke.mjs\n\ntrusted proxy and shared rate-limit smoke ok\n\n&gt; tasknode@0.1.0 account-data-lifecycle-smoke\n&gt; node scripts/account-data-lifecycle-smoke.mjs\n\naccount data export and deletion lifecycle smoke ok\n\n&gt; tasknode@0.1.0 data-retention-smoke\n&gt; node scripts/data-retention-smoke.mjs\n\ndata retention smoke ok\n\n&gt; tasknode@0.1.0 data-recovery-safety-smoke\n&gt; node scripts/data-recovery-safety-smoke.mjs\n\ndata recovery safety smoke ok: remote, destructive-target, and malformed-store guards verified\n\n&gt; tasknode@0.1.0 asset-provenance-check\n&gt; node scripts/asset-provenance-check.mjs\n\nasset provenance check ok: 10 reviewed public assets\n\n&gt; tasknode@0.1.0 dependency-license-check\n&gt; node scripts/dependency-license-check.mjs\n\ndependency license check ok: 483 packages; reviewed reciprocal/content licenses: LGPL-3.0-or-later=10, Apache-2.0 AND LGPL-3.0-or-later AND MIT=1, Apache-2.0 AND LGPL-3.0-or-later=3, MPL-2.0=13, CC-BY-4.0=1\n[exit 0]\n\n$ npm run offchain-task-lifecycle-smoke\n\n&gt; tasknode@0.1.0 offchain-task-lifecycle-smoke\n&gt; node scripts/offchain-task-lifecycle-smoke.mjs\n\noffchain-task-lifecycle-smoke ok\n[exit 0]\n\n$ TASKNODE_DATABASE_ENABLED=false node scripts/offchain-task-event-integrity-smoke.mjs\n[characterization] pre-guard exploit reproduced: accept emits pf.reward.v1 id=task_evt_attacker_chosen tx=DEADBEEF00000000000000000000000000000000000000000000000000000001 task_id=task_someone_elses economic_reward_pft=5000\nFAIL (19 assertions):\n- accept event_type must be server-derived pf.task.update.v1: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.reward.v1'\n- 'pf.task.update.v1'\n      ^\n\n- accept event id must be server-generated, not client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'task_evt_attacker_chosen'\n- accept source_tx_hash must be server ref offchain:: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'DEADBEEF00000000000000000000000000000000000000000000000000000001'\n- 'offchain:task_evt_attacker_chosen'\n\n- accept source_cid must be server ref postgres:: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'bafyforgedcid'\n- 'postgres:task_evt_attacker_chosen'\n\n- accept payload.task_id must be the authoritative task: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'task_someone_elses'\n- 'task_victim_owned_by_attacker'\n        ^\n\n- accept pointer.task_id must be the authoritative task: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'task_someone_elses'\n- 'task_victim_owned_by_attacker'\n        ^\n\n- accept must not carry a client economic reward: Expected values to be strictly equal:\n+ actual - expected\n\n+ 5000\n- undefined\n\n- persisted task_events.event_type for accept must be pf.task.update.v1: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.reward.v1'\n- 'pf.task.update.v1'\n      ^\n\n- persisted task_events.id must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'task_evt_attacker_chosen'\n- persisted source_tx_hash must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'DEADBEEF00000000000000000000000000000000000000000000000000000001'\n- persisted source_cid must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'bafyforgedcid'\n- persisted payload_json.task_id must be the authoritative task: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'task_someone_elses'\n- 'task_victim_owned_by_attacker'\n        ^\n\n- persisted payload_json.economic_reward_pft must not be client-chosen: Expected values to be strictly equal:\n+ actual - expected\n\n+ 5000\n- undefined\n\n- cancel must not emit a client-chosen pf.task.submission.v1 event_type: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.task.submission.v1'\n- 'pf.task.update.v1'\n           ^\n\n- cancel event id must not be client-chosen: Expected \"actual\" to be strictly unequal to:\n\n'task_evt_forged_submission'\n- refuse event_type must be server-derived, not the client's pf.reward.v1: Expected values to be strictly equal:\n+ actual - expected\n\n+ 'pf.reward.v1'\n- 'pf.task.update.v1'\n      ^\n\n- client cannot pin the task_events primary key (A): Expected \"actual\" to be strictly unequal to:\n\n'task_evt_pinned_pk'\n- client cannot pin the task_events primary key (B): Expected \"actual\" to be strictly unequal to:\n\n'task_evt_pinned_pk'\n- two attacker calls get distinct server-generated ids (no forced collision): Expected \"actual\" to be strictly unequal to:\n\n'task_evt_pinned_pk'\n[exit 1]\n\n", "creation_timestamp": "2026-09-08T06:19:12.302908Z"}