From f9675dfe46709886ea009f2245145bb87f21b359 Mon Sep 17 00:00:00 2001 From: fengyangxxx <356261005@qq.com> Date: Tue, 30 Jun 2026 23:21:09 +0800 Subject: [PATCH 1/4] Add data subject request runx skill --- crates/runx-cli/src/official_skills.rs | 5 + ...rivacy.data-subject-request.v1.schema.json | 47 +++ packages/cli/src/official-skills.lock.json | 7 + skills/data-subject-request/SKILL.md | 118 ++++++ skills/data-subject-request/X.yaml | 273 ++++++++++++ .../artifacts/commands.md | 50 +++ .../artifacts/doctor-local-source.json | 388 ++++++++++++++++++ .../local-harness-runx-0.6.14-linux.json | 15 + .../fixtures/dogfood-erasure-input.json | 39 ++ .../fixtures/eligible-erasure-input.json | 39 ++ .../fixtures/unverified-requestor-input.json | 39 ++ skills/data-subject-request/run.mjs | 262 ++++++++++++ .../tools/data/local/manifest.json | 77 ++++ .../tools/data/local/run.mjs | 335 +++++++++++++++ 14 files changed, 1694 insertions(+) create mode 100644 dist/packets/privacy.data-subject-request.v1.schema.json create mode 100644 skills/data-subject-request/SKILL.md create mode 100644 skills/data-subject-request/X.yaml create mode 100644 skills/data-subject-request/artifacts/commands.md create mode 100644 skills/data-subject-request/artifacts/doctor-local-source.json create mode 100644 skills/data-subject-request/artifacts/local-harness-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/fixtures/dogfood-erasure-input.json create mode 100644 skills/data-subject-request/fixtures/eligible-erasure-input.json create mode 100644 skills/data-subject-request/fixtures/unverified-requestor-input.json create mode 100644 skills/data-subject-request/run.mjs create mode 100644 skills/data-subject-request/tools/data/local/manifest.json create mode 100644 skills/data-subject-request/tools/data/local/run.mjs diff --git a/crates/runx-cli/src/official_skills.rs b/crates/runx-cli/src/official_skills.rs index a3c4ff23..dc4f3dd2 100644 --- a/crates/runx-cli/src/official_skills.rs +++ b/crates/runx-cli/src/official_skills.rs @@ -40,6 +40,11 @@ pub(crate) const OFFICIAL_SKILLS: &[OfficialSkillLockEntry] = &[ version: "sha-4b5c8438cb5a", digest: "5af0e2dd3dd2116874e4fb886e0424f4b944c136b3430a10c31e400a0249113b", }, + OfficialSkillLockEntry { + skill_id: "runx/data-subject-request", + version: "sha-6393a7059dcf", + digest: "23315800a48a1c6fedb1a7252ef790064ef693a0af425d2a12db3f90d4d1ed6d", + }, OfficialSkillLockEntry { skill_id: "runx/deep-research-brief", version: "sha-c2d071df7f50", diff --git a/dist/packets/privacy.data-subject-request.v1.schema.json b/dist/packets/privacy.data-subject-request.v1.schema.json new file mode 100644 index 00000000..d7a78207 --- /dev/null +++ b/dist/packets/privacy.data-subject-request.v1.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.runx.dev/runx/privacy/data-subject-request/v1.json", + "x-runx-packet-id": "runx.privacy.data_subject_request.v1", + "type": "object", + "properties": { + "decision": { + "type": "object", + "properties": { + "eligible": { "type": "boolean" }, + "reason": { "type": "string" } + }, + "required": ["eligible", "reason"], + "additionalProperties": true + }, + "handoff": { + "type": "object", + "properties": { + "path": { "type": "string" }, + "subject_id": { "type": "string" }, + "data_classes": { + "type": "array", + "items": { "type": "string" } + }, + "scopes": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": true + }, + "escalation": { + "type": "object", + "additionalProperties": true + }, + "verdict_event": { + "type": "object", + "additionalProperties": true + }, + "observations": { + "type": "object", + "additionalProperties": true + } + }, + "required": ["decision", "escalation", "verdict_event", "observations"], + "additionalProperties": true +} diff --git a/packages/cli/src/official-skills.lock.json b/packages/cli/src/official-skills.lock.json index aa39784c..85ec75c2 100644 --- a/packages/cli/src/official-skills.lock.json +++ b/packages/cli/src/official-skills.lock.json @@ -41,6 +41,13 @@ "catalog_visibility": "public", "catalog_role": "canonical" }, + { + "skill_id": "runx/data-subject-request", + "version": "sha-6393a7059dcf", + "digest": "23315800a48a1c6fedb1a7252ef790064ef693a0af425d2a12db3f90d4d1ed6d", + "catalog_visibility": "public", + "catalog_role": "canonical" + }, { "skill_id": "runx/deep-research-brief", "version": "sha-c2d071df7f50", diff --git a/skills/data-subject-request/SKILL.md b/skills/data-subject-request/SKILL.md new file mode 100644 index 00000000..e2bd7b1c --- /dev/null +++ b/skills/data-subject-request/SKILL.md @@ -0,0 +1,118 @@ +--- +name: data-subject-request +description: Judge a data subject request, record the sealed verdict in data-store, and emit only a bounded handoff for downstream erasure or export. +runx: + category: privacy +--- + +# Data Subject Request + +Judge whether a data subject request is in policy without erasing, exporting, or +sending any data. The skill reads a request packet, requestor proof, policy +bounds, and prior request state. It emits one typed verdict, records that verdict +through `data-store`, and returns a bounded handoff that a separate governed +operator run may consume. + +This is not a legal authority and does not replace counsel. It is an execution +boundary for policy evidence: the receipt proves which inputs were inspected, +which lawful basis was named, which scope was allowed or refused, and which +durable verdict was appended. + +## Inputs + +- `request_packet`: `type`, `subject_id`, and `scope`. Scope must include the + request id, requested data classes, and requested scopes. +- `requestor_proof`: `identity_provider`, `verified_at`, and `assertion`. The + assertion must bind the requestor to the same subject and carry a stable proof + reference or digest. +- `policy`: `jurisdiction`, `trusted_identity_providers`, `lawful_bases`, and + `scope_bounds`. The trusted provider list is required evidence for accepting + the proof issuer. +- `data_source_ref` and `store_id`: the pinned data-store binding used for the + subject request event stream. +- `aggregate_id`, `expected_version`, and `idempotency_key`: the subject request + entity, optimistic concurrency version, and retry-safe verdict write key. + +## Verdict Contract + +The output is `runx.privacy.data_subject_request.v1` data: + +- `decision{eligible,reason}` always appears. +- `handoff{path,subject_id,data_classes,scopes}` appears only when eligible. +- `escalation` explains whether a human lane is required. +- `verdict_event` is the exact deterministic event recorded by + `data-store.append_event`. +- `observations` name the lawful-basis verdict, jurisdiction reason, verified + requestor reference, identity assertion digest, scope bounds, bounded handoff, + `aggregate_id`, `expected_version`, and `idempotency_key`. + +The packet must not contain an `operational_proposal` envelope. A downstream +driver may issue a separate governed run by name, but this skill does not fire +that rail. + +## State Model + +State is durable in `registry:runx/data-store@0.1.2`. The graph uses the +github-sync-style shape: + +1. `read_projection` loads any prior decision for the subject request entity. +2. `data-subject-request-decide` judges identity, scope, and lawful basis. +3. `append_event` records the verdict with `expected_version` and + `idempotency_key`. +4. `read_projection` reads back the durable state for receipt evidence. + +The aggregate id is the subject request entity, not a tenant-wide stream. The +append is an ungated CAS write that records the decision itself; consequences +remain downstream. + +## Consequence Boundary + +Eligible erasure returns a handoff such as +`downstream.data-store.append_event.subject.erasure`. A downstream operator must +issue a separate governed `data-store.append_event` run that appends a +`subject.erasure` tombstone. Erasure is event-sourced; there is no delete +operation in this skill. + +Eligible export returns a handoff to a separate read path. A downstream operator +must run `read_projection`, `redact-pii`, and `send-as` under explicit approval. +This skill does not read raw content, redact content, or deliver content. + +Ambiguous identity, missing proof, untrusted identity providers, scope disputes, +or data classes outside `policy.scope_bounds` escalate to a human lane or block +as `needs_agent`. The skill must refuse to invent an identity, lawful basis, or +scope that is not grounded in the inputs. + +## Local Harness + +Run: + +```bash +runx harness ./skills/data-subject-request --json +``` + +The inline harness has two cases: + +- `eligible-erasure-records-verdict`: a verified GDPR erasure request for + `profile` and `support_tickets` seals, emits a bounded erasure handoff, and + records the verdict via `data-store.append_event`. +- `unverified-requestor-refused-no-handoff`: an unsigned email proof and an + out-of-scope `payment_methods` export request seal a deterministic refusal + naming the jurisdiction and lawful-basis/scope grounds, with no handoff. + +## Example Invocation + +```bash +runx skill data-subject-request --json \ + --input-json request_packet='{"type":"erasure","subject_id":"subject:customer_4242","scope":{"request_id":"dsr-2026-06-30-001","data_classes":["profile","support_tickets"],"requested_scopes":["profile","support_tickets"]}}' \ + --input-json requestor_proof='{"identity_provider":"account-session","verified_at":"2026-06-30T14:20:00Z","assertion":{"subject_id":"subject:customer_4242","assertion_ref":"acct-session:customer_4242:2026-06-30","assertion_digest":"sha256:9d64a60e8d0c8080e88f9472c0e0ffdfad9424c2e42eb570c0f46ff3e4e73116"}}' \ + --input-json policy='{"jurisdiction":"GDPR","trusted_identity_providers":["account-session"],"lawful_bases":{"erasure":"GDPR Article 17 erasure after withdrawn consent"},"scope_bounds":{"data_classes":["profile","support_tickets"],"erasure_allowed":["profile","support_tickets"],"export_allowed":["profile","support_tickets"]}}' \ + -i data_source_ref=local://runx-data-subject-request/harness \ + -i store_id=data-subject-request-harness-v1 \ + -i aggregate_id=dsr:subject:customer_4242:request:dsr-2026-06-30-001 \ + --input-json expected_version=0 \ + -i idempotency_key=dsr-2026-06-30-001:verdict:v1 +``` + +The runner computes only bounded policy checks from the supplied packet. If it +cannot prove identity, scope, and lawful basis from those inputs, the correct +result is a sealed refusal or human escalation, not a guessed verdict. diff --git a/skills/data-subject-request/X.yaml b/skills/data-subject-request/X.yaml new file mode 100644 index 00000000..42cb29c7 --- /dev/null +++ b/skills/data-subject-request/X.yaml @@ -0,0 +1,273 @@ +skill: data-subject-request +version: "0.1.0" + +catalog: + kind: graph + audience: public + visibility: public + role: canonical + runtime_path: data-adapter + +emits: + - name: data_subject_request_decision + packet: runx.privacy.data_subject_request.v1 + +harness: + cases: + - name: eligible-erasure-records-verdict + runner: decide + inputs: + request_packet: + type: erasure + subject_id: subject:customer_4242 + scope: + request_id: dsr-2026-06-30-001 + data_classes: + - profile + - support_tickets + requested_scopes: + - profile + - support_tickets + requestor_proof: + identity_provider: account-session + verified_at: "2026-06-30T14:20:00Z" + assertion: + subject_id: subject:customer_4242 + assurance: authenticated-session + assertion_ref: acct-session:customer_4242:2026-06-30 + assertion_digest: sha256:9d64a60e8d0c8080e88f9472c0e0ffdfad9424c2e42eb570c0f46ff3e4e73116 + policy: + jurisdiction: GDPR + trusted_identity_providers: + - account-session + - notarized-id + lawful_bases: + erasure: GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. + export: GDPR Article 15 access where the verified data subject requests a bounded copy. + scope_bounds: + data_classes: + - profile + - support_tickets + - marketing_preferences + erasure_allowed: + - profile + - support_tickets + - marketing_preferences + export_allowed: + - profile + - support_tickets + - marketing_preferences + data_source_ref: local://runx-data-subject-request/harness + store_id: data-subject-request-harness-v1 + aggregate_id: dsr:subject:customer_4242:request:dsr-2026-06-30-001 + expected_version: 0 + idempotency_key: dsr-2026-06-30-001:verdict:v1 + expect: + status: sealed + receipt: + schema: runx.receipt.v1 + - name: unverified-requestor-refused-no-handoff + runner: decide + inputs: + request_packet: + type: export + subject_id: subject:customer_9999 + scope: + request_id: dsr-2026-06-30-002 + data_classes: + - profile + - payment_methods + requested_scopes: + - profile + - payment_methods + requestor_proof: + identity_provider: unsigned-email + verified_at: "" + assertion: + subject_id: subject:customer_9999 + assurance: missing-verification + assertion_ref: email:unverified:customer_9999 + assertion_digest: sha256:bf68a7a6b9f2f234e4b57e9dc1e9c769928ffb1fe34e89d347ad77a04d2a6040 + policy: + jurisdiction: CCPA + trusted_identity_providers: + - account-session + - notarized-id + lawful_bases: + erasure: CCPA deletion request only after verified consumer identity and bounded exceptions review. + export: CCPA access request only after verified consumer identity and bounded data-class scope. + scope_bounds: + data_classes: + - profile + - support_tickets + erasure_allowed: + - profile + - support_tickets + export_allowed: + - profile + - support_tickets + data_source_ref: local://runx-data-subject-request/harness + store_id: data-subject-request-harness-v1 + aggregate_id: dsr:subject:customer_9999:request:dsr-2026-06-30-002 + expected_version: 0 + idempotency_key: dsr-2026-06-30-002:verdict:v1 + expect: + status: policy_denied + receipt: + schema: runx.receipt.v1 + state: sealed + disposition: blocked + reason_code: graph_blocked + +policy: + allow: + - provider: data-source + method: READ + scope: runx:data:read + - provider: data-source + method: APPEND + scope: runx:data:append + deny: + - raw_pii_export + - direct_erasure + - direct_send + - unbounded_subject_scope + - untrusted_identity_provider + - operational_proposal + +runners: + decide: + default: true + type: graph + inputs: + request_packet: + type: json + required: true + description: request_packet{type,subject_id,scope}; scope names the request id, data classes, and requested scopes. + requestor_proof: + type: json + required: true + description: requestor_proof{identity_provider,verified_at,assertion}; assertion must identify the same subject and carry a digestable proof ref. + policy: + type: json + required: true + description: policy{jurisdiction,lawful_bases,scope_bounds}; optional trusted_identity_providers restrict accepted proof issuers. + data_source_ref: + type: string + required: true + description: Logical data-store binding for the subject request event stream. + store_id: + type: string + required: true + description: Pinned data-store id for deterministic harness and dogfood receipts. + aggregate_id: + type: string + required: true + description: Subject request entity stream id; use the request entity, not a broad customer or tenant id. + expected_version: + type: number + required: true + description: Current stream version required by the CAS append_event that records the verdict. + idempotency_key: + type: string + required: true + description: Stable verdict write key so retries do not append duplicate decisions. + graph: + name: data-subject-request + steps: + - id: read-prior-decision + tool: data.source + scopes: + - runx:data:read + inputs: + operation: read_projection + data_source_ref: "$input.data_source_ref" + store_id: "$input.store_id" + resource: subject_requests + aggregate_id: "$input.aggregate_id" + - id: decide + label: verify identity, scope, and lawful basis before any handoff + skill: . + runner: judge + inputs: + request_packet: "$input.request_packet" + requestor_proof: "$input.requestor_proof" + policy: "$input.policy" + aggregate_id: "$input.aggregate_id" + expected_version: "$input.expected_version" + idempotency_key: "$input.idempotency_key" + context: + prior_decision: read-prior-decision.data_operation_result.data.projection + - id: record-verdict + tool: data.source + scopes: + - runx:data:append + inputs: + operation: append_event + data_source_ref: "$input.data_source_ref" + store_id: "$input.store_id" + resource: subject_requests + aggregate_id: "$input.aggregate_id" + expected_version: "$input.expected_version" + idempotency_key: "$input.idempotency_key" + context: + event: decide.data_subject_request_decision.data.verdict_event + - id: readback + tool: data.source + scopes: + - runx:data:read + inputs: + operation: read_projection + data_source_ref: "$input.data_source_ref" + store_id: "$input.store_id" + resource: subject_requests + aggregate_id: "$input.aggregate_id" + policy: + guards: + - step: readback + field: decide.data_subject_request_decision.data.decision.eligible + equals: true + + judge: + type: cli-tool + command: node + args: + - run.mjs + outputs: + decision: object + handoff: object + escalation: object + verdict_event: object + observations: object + artifacts: + wrap_as: data_subject_request_decision + packet: runx.privacy.data_subject_request.v1 + inputs: + request_packet: + type: json + required: true + description: request_packet{type,subject_id,scope}; scope names the request id, data classes, and requested scopes. + requestor_proof: + type: json + required: true + description: requestor_proof{identity_provider,verified_at,assertion}; assertion must identify the same subject and carry a digestable proof ref. + policy: + type: json + required: true + description: policy{jurisdiction,lawful_bases,scope_bounds}; trusted_identity_providers restrict accepted proof issuers. + aggregate_id: + type: string + required: true + description: Subject request entity stream id; use the request entity, not a broad customer or tenant id. + expected_version: + type: number + required: true + description: Current stream version required by the CAS append_event that records the verdict. + idempotency_key: + type: string + required: true + description: Stable verdict write key so retries do not append duplicate decisions. + prior_decision: + type: json + required: false + description: Prior subject request projection read from data-store before this verdict. diff --git a/skills/data-subject-request/artifacts/commands.md b/skills/data-subject-request/artifacts/commands.md new file mode 100644 index 00000000..74cc5675 --- /dev/null +++ b/skills/data-subject-request/artifacts/commands.md @@ -0,0 +1,50 @@ +# data-subject-request local evidence commands + +These commands are pre-publication development evidence for Frantic #71. They do +not replace final PR, registry publish, hosted harness, post-publish dogfood, +QA PASS, or delivery artifacts. + +```bash +node scripts/generate-official-lock.mjs +pnpm build +pnpm exec tsx packages/cli/src/index.ts doctor --json +docker run --rm -v "$PWD:/repo" -w /repo node:24-bookworm node scripts/check-authoring-package-contract.mjs +``` + +```bash +docker run --rm \ + -v "$PWD:/repo" \ + -w /repo \ + -e npm_config_update_notifier=false \ + -e RUNX_RECEIPT_SIGN_KID=frantic-71-local-harness-key \ + -e RUNX_RECEIPT_SIGN_ED25519_SEED_BASE64= \ + -e RUNX_RECEIPT_SIGN_ISSUER_TYPE=hosted \ + node:24-bookworm \ + bash -lc "npx -y @runxhq/cli@0.6.14 harness ./skills/data-subject-request --json --receipt-dir .runx-test-receipts-data-subject-request-linux-final" +``` + +```bash +# Dogfood command was run through a small stdin Node wrapper that read +# skills/data-subject-request/fixtures/dogfood-erasure-input.json and invoked: +npx -y @runxhq/cli@0.6.14 skill ./skills/data-subject-request --json \ + -R .runx-test-receipts-data-subject-request-dogfood-final \ + --input-json request_packet= \ + --input-json requestor_proof= \ + --input-json policy= \ + -i data_source_ref= \ + -i store_id= \ + -i aggregate_id= \ + -i idempotency_key= \ + --input-json expected_version= +``` + +```bash +docker run --rm \ + -v "$PWD:/repo" \ + -w /repo \ + -e npm_config_update_notifier=false \ + -e RUNX_RECEIPT_VERIFY_KID=frantic-71-local-harness-key \ + -e RUNX_RECEIPT_VERIFY_ED25519_PUBLIC_KEY_BASE64=IVL40Zt5HSRFMkLhXy6rbLfP+ntqXtMAl5YOBpiB2xI= \ + node:24-bookworm \ + bash -lc "npx -y @runxhq/cli@0.6.14 verify --receipt-dir .runx-test-receipts-data-subject-request-dogfood-final --json" +``` diff --git a/skills/data-subject-request/artifacts/doctor-local-source.json b/skills/data-subject-request/artifacts/doctor-local-source.json new file mode 100644 index 00000000..3cf0eb0f --- /dev/null +++ b/skills/data-subject-request/artifacts/doctor-local-source.json @@ -0,0 +1,388 @@ +{ + "schema": "runx.doctor.v1", + "status": "success", + "summary": { + "errors": 0, + "warnings": 13, + "infos": 0 + }, + "diagnostics": [ + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "reduce.reduction has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "agency-advance", + "step": "decide" + }, + "location": { + "path": "skills/agency/X.yaml", + "json_pointer": "/runners/advance/graph/steps/decide/context/mandate" + }, + "evidence": { + "reference": "reduce.reduction.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/agency/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:d12777c81d29a6523f4c0434e56a33677e3343cb1ad89bfd7227215508881775" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "classify.lane_packet has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "business-ops-route-and-append", + "step": "persist-route" + }, + "location": { + "path": "skills/business-ops/X.yaml", + "json_pointer": "/runners/route_and_append/graph/steps/persist-route/context/event" + }, + "evidence": { + "reference": "classify.lane_packet.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/business-ops/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:b17bfabbf667f82639df465245a5d2ef66ba197aaa8ec46bb1f010dad1b0c9a0" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "fetch-source.fetch_result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "governed-outbound", + "step": "scrub-content" + }, + "location": { + "path": "skills/governed-outbound/X.yaml", + "json_pointer": "/runners/governed-outbound/graph/steps/scrub-content/context/content" + }, + "evidence": { + "reference": "fetch-source.fetch_result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/governed-outbound/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:9e9110ee85fde6d55831173a6cbdbb6444efaacaf9ff416f7ca226cdacbd3d37" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scrub-content.redaction_report has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "governed-outbound", + "step": "approve-send" + }, + "location": { + "path": "skills/governed-outbound/X.yaml", + "json_pointer": "/runners/governed-outbound/graph/steps/approve-send/context/decision" + }, + "evidence": { + "reference": "scrub-content.redaction_report.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/governed-outbound/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:2581bfb8a05ddcfe4f6e4b6a4ff6730039cdce7489c91836ef0dfee66023c82f" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "post-notice.send_plan has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "governed-outbound", + "step": "seal-run" + }, + "location": { + "path": "skills/governed-outbound/X.yaml", + "json_pointer": "/runners/governed-outbound/graph/steps/seal-run/context/evidence" + }, + "evidence": { + "reference": "post-notice.send_plan.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/governed-outbound/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:f8c6506822d63f3515a4d72ef4419fa6ce969cf543b8e4b6bf14652c0e3a107c" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scafld-plan.result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "author-spec" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/author-spec/context/spec_path" + }, + "evidence": { + "reference": "scafld-plan.result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:bfb1f1d11b26557340e7fa5db396685852833913b3f049687ab04ea82979cf6e" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scafld-approve.result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "read-approved-spec" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/read-approved-spec/context/path" + }, + "evidence": { + "reference": "scafld-approve.result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:2fa6c050644b9d3d16589bf2c91c8e5ec64de38125a41e82aa076b6a5745cc8b" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "capture-harness-context.harness_context has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "package-pull-request" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/package-pull-request/context/harness_context" + }, + "evidence": { + "reference": "capture-harness-context.harness_context.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:e13d6575601f25ba750ec6eec1e02d004d1c885d9462fd69b807eb1c407641e9" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scafld-handoff.result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "package-pull-request" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/package-pull-request/context/handoff_markdown" + }, + "evidence": { + "reference": "scafld-handoff.result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:7aba22826433b263377889f0d3474bb1a2b24aad6197d2e0c9238a74ffb0af5a" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scafld-build.result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "package-pull-request" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/package-pull-request/context/build_result" + }, + "evidence": { + "reference": "scafld-build.result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:edf46f58c4c6348d3f06557e53a4588c19fdd6183c30ed86dd7df10a3a376a72" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scafld-review.result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "package-pull-request" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/package-pull-request/context/review_result" + }, + "evidence": { + "reference": "scafld-review.result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:d746c69b4d878a0ef1adfde6f1a1b05b6b3e136344d3fbef9862fd87ddbbc342" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scafld-complete.result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "package-pull-request" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/package-pull-request/context/completion_result" + }, + "evidence": { + "reference": "scafld-complete.result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:3f7eedbcb025f41c6cb18250c272e191b65c98b113ce951d123663dca8b955fa" + }, + { + "id": "runx.graph.context.schema_missing", + "severity": "warning", + "title": "Graph context producer has no packet schema", + "message": "scafld-final-status.result has no packet metadata, so doctor cannot verify packet paths.", + "target": { + "kind": "graph", + "ref": "issue-to-pr", + "step": "package-pull-request" + }, + "location": { + "path": "skills/issue-to-pr/X.yaml", + "json_pointer": "/runners/issue-to-pr/graph/steps/package-pull-request/context/status_snapshot" + }, + "evidence": { + "reference": "scafld-final-status.result.data" + }, + "repairs": [ + { + "id": "add_output_packet", + "kind": "edit_yaml", + "confidence": "medium", + "risk": "low", + "path": "skills/issue-to-pr/X.yaml", + "requires_human_review": false + } + ], + "instance_id": "sha256:fa05dbed91992d045cae60fbc6ae42ba171c258010cacca8808a3c4e6da42d6d" + } + ] +} diff --git a/skills/data-subject-request/artifacts/local-harness-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/local-harness-runx-0.6.14-linux.json new file mode 100644 index 00000000..7985d8d0 --- /dev/null +++ b/skills/data-subject-request/artifacts/local-harness-runx-0.6.14-linux.json @@ -0,0 +1,15 @@ +{ + "status": "passed", + "case_count": 2, + "assertion_error_count": 0, + "assertion_errors": [], + "case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "receipt_ids": [ + "sha256:1104ce5cb414b391b03f68dc3a0a14e3237ba9f9d934fa7f65a5963f63f6923d", + "sha256:7475dfb674888c6cde3538e4ea8c80c300df097b25a351aac47f0b4c13a4497d" + ], + "graph_case_count": 2 +} diff --git a/skills/data-subject-request/fixtures/dogfood-erasure-input.json b/skills/data-subject-request/fixtures/dogfood-erasure-input.json new file mode 100644 index 00000000..1c6822be --- /dev/null +++ b/skills/data-subject-request/fixtures/dogfood-erasure-input.json @@ -0,0 +1,39 @@ +{ + "request_packet": { + "type": "erasure", + "subject_id": "subject:customer_7001", + "scope": { + "request_id": "dsr-2026-06-30-dogfood-001", + "data_classes": ["profile", "marketing_preferences"], + "requested_scopes": ["profile", "marketing_preferences"] + } + }, + "requestor_proof": { + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z", + "assertion": { + "subject_id": "subject:customer_7001", + "assurance": "authenticated-session", + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c" + } + }, + "policy": { + "jurisdiction": "GDPR", + "trusted_identity_providers": ["account-session", "notarized-id"], + "lawful_bases": { + "erasure": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.", + "export": "GDPR Article 15 access where the verified data subject requests a bounded copy." + }, + "scope_bounds": { + "data_classes": ["profile", "support_tickets", "marketing_preferences"], + "erasure_allowed": ["profile", "support_tickets", "marketing_preferences"], + "export_allowed": ["profile", "support_tickets", "marketing_preferences"] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "store_id": "data-subject-request-dogfood-v1", + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1" +} diff --git a/skills/data-subject-request/fixtures/eligible-erasure-input.json b/skills/data-subject-request/fixtures/eligible-erasure-input.json new file mode 100644 index 00000000..e64aef49 --- /dev/null +++ b/skills/data-subject-request/fixtures/eligible-erasure-input.json @@ -0,0 +1,39 @@ +{ + "request_packet": { + "type": "erasure", + "subject_id": "subject:customer_4242", + "scope": { + "request_id": "dsr-2026-06-30-001", + "data_classes": ["profile", "support_tickets"], + "requested_scopes": ["profile", "support_tickets"] + } + }, + "requestor_proof": { + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:20:00Z", + "assertion": { + "subject_id": "subject:customer_4242", + "assurance": "authenticated-session", + "assertion_ref": "acct-session:customer_4242:2026-06-30", + "assertion_digest": "sha256:9d64a60e8d0c8080e88f9472c0e0ffdfad9424c2e42eb570c0f46ff3e4e73116" + } + }, + "policy": { + "jurisdiction": "GDPR", + "trusted_identity_providers": ["account-session", "notarized-id"], + "lawful_bases": { + "erasure": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.", + "export": "GDPR Article 15 access where the verified data subject requests a bounded copy." + }, + "scope_bounds": { + "data_classes": ["profile", "support_tickets", "marketing_preferences"], + "erasure_allowed": ["profile", "support_tickets", "marketing_preferences"], + "export_allowed": ["profile", "support_tickets", "marketing_preferences"] + } + }, + "data_source_ref": "local://runx-data-subject-request/harness", + "store_id": "data-subject-request-harness-v1", + "aggregate_id": "dsr:subject:customer_4242:request:dsr-2026-06-30-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-001:verdict:v1" +} diff --git a/skills/data-subject-request/fixtures/unverified-requestor-input.json b/skills/data-subject-request/fixtures/unverified-requestor-input.json new file mode 100644 index 00000000..12b398e3 --- /dev/null +++ b/skills/data-subject-request/fixtures/unverified-requestor-input.json @@ -0,0 +1,39 @@ +{ + "request_packet": { + "type": "export", + "subject_id": "subject:customer_9999", + "scope": { + "request_id": "dsr-2026-06-30-002", + "data_classes": ["profile", "payment_methods"], + "requested_scopes": ["profile", "payment_methods"] + } + }, + "requestor_proof": { + "identity_provider": "unsigned-email", + "verified_at": "", + "assertion": { + "subject_id": "subject:customer_9999", + "assurance": "missing-verification", + "assertion_ref": "email:unverified:customer_9999", + "assertion_digest": "sha256:bf68a7a6b9f2f234e4b57e9dc1e9c769928ffb1fe34e89d347ad77a04d2a6040" + } + }, + "policy": { + "jurisdiction": "CCPA", + "trusted_identity_providers": ["account-session", "notarized-id"], + "lawful_bases": { + "erasure": "CCPA deletion request only after verified consumer identity and bounded exceptions review.", + "export": "CCPA access request only after verified consumer identity and bounded data-class scope." + }, + "scope_bounds": { + "data_classes": ["profile", "support_tickets"], + "erasure_allowed": ["profile", "support_tickets"], + "export_allowed": ["profile", "support_tickets"] + } + }, + "data_source_ref": "local://runx-data-subject-request/harness", + "store_id": "data-subject-request-harness-v1", + "aggregate_id": "dsr:subject:customer_9999:request:dsr-2026-06-30-002", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-002:verdict:v1" +} diff --git a/skills/data-subject-request/run.mjs b/skills/data-subject-request/run.mjs new file mode 100644 index 00000000..b7ab7a95 --- /dev/null +++ b/skills/data-subject-request/run.mjs @@ -0,0 +1,262 @@ +import crypto from "node:crypto"; +import fs from "node:fs"; + +const inputs = readInputs(); +const requestPacket = objectValue(inputs.request_packet, "request_packet"); +const requestorProof = objectValue(inputs.requestor_proof, "requestor_proof"); +const policy = objectValue(inputs.policy, "policy"); +const aggregateId = stringValue(inputs.aggregate_id); +const expectedVersion = numberValue(inputs.expected_version); +const idempotencyKey = stringValue(inputs.idempotency_key); +const priorDecision = inputs.prior_decision && typeof inputs.prior_decision === "object" && !Array.isArray(inputs.prior_decision) + ? inputs.prior_decision + : null; + +if (!aggregateId) fail("aggregate_id is required"); +if (expectedVersion === undefined) fail("expected_version is required"); +if (!idempotencyKey) fail("idempotency_key is required"); + +const requestType = stringValue(requestPacket.type); +const subjectId = stringValue(requestPacket.subject_id); +const scope = objectValue(requestPacket.scope, "request_packet.scope"); +const requestId = stringValue(scope.request_id) ?? "request:unspecified"; +const requestedClasses = uniqueStrings(scope.data_classes ?? scope.requested_scopes); +const requestedScopes = uniqueStrings(scope.requested_scopes ?? scope.data_classes); +const jurisdiction = stringValue(policy.jurisdiction) ?? "unspecified"; +const lawfulBases = objectValue(policy.lawful_bases, "policy.lawful_bases"); +const scopeBounds = objectValue(policy.scope_bounds, "policy.scope_bounds"); +const allowedClasses = uniqueStrings(scopeBounds.data_classes); +const allowedForType = uniqueStrings(requestType === "export" ? scopeBounds.export_allowed : scopeBounds.erasure_allowed); +const trustedProviders = uniqueStrings(policy.trusted_identity_providers); +const assertion = requestorProof.assertion && typeof requestorProof.assertion === "object" + ? requestorProof.assertion + : {}; +const identityProvider = stringValue(requestorProof.identity_provider); +const verifiedAt = stringValue(requestorProof.verified_at); +const assertionSubject = stringValue(assertion.subject_id); +const assertionRef = stringValue(assertion.assertion_ref) ?? `${identityProvider ?? "unknown"}:${subjectId ?? "unknown"}`; +const assertionDigest = stringValue(assertion.assertion_digest) ?? digestObject(assertion); +const lawfulBasis = requestType ? stringValue(lawfulBases[requestType]) : null; + +const refusalReasons = []; +if (!["erasure", "export"].includes(requestType ?? "")) { + refusalReasons.push("request type must be erasure or export"); +} +if (!subjectId) { + refusalReasons.push("request_packet.subject_id is missing"); +} +if (requestedClasses.length === 0) { + refusalReasons.push("request scope has no data_classes or requested_scopes"); +} +if (!identityProvider) { + refusalReasons.push("requestor identity_provider is missing"); +} else if (!trustedProviders.includes(identityProvider)) { + refusalReasons.push(`identity_provider ${identityProvider} is not trusted for ${jurisdiction}`); +} +if (!verifiedAt || Number.isNaN(Date.parse(verifiedAt))) { + refusalReasons.push("requestor proof has no valid verified_at timestamp"); +} +if (!assertionSubject || assertionSubject !== subjectId) { + refusalReasons.push("requestor assertion does not bind to the requested subject_id"); +} +if (!assertionDigest.startsWith("sha256:")) { + refusalReasons.push("requestor assertion digest is missing or not sha256-prefixed"); +} +if (!lawfulBasis) { + refusalReasons.push(`no lawful basis supplied for ${requestType ?? "unknown"} under ${jurisdiction}`); +} +for (const dataClass of requestedClasses) { + if (!allowedClasses.includes(dataClass)) { + refusalReasons.push(`requested data class ${dataClass} is outside policy.scope_bounds.data_classes`); + } + if (!allowedForType.includes(dataClass)) { + refusalReasons.push(`requested data class ${dataClass} is outside ${requestType ?? "request"}_allowed bounds`); + } +} + +const eligible = refusalReasons.length === 0; +const handoff = eligible + ? buildHandoff({ requestType, subjectId, requestedClasses, requestedScopes }) + : null; +const reason = eligible + ? `${jurisdiction} ${requestType} request is eligible: verified ${identityProvider} proof matches ${subjectId}, lawful basis is supplied, and scope is bounded to ${requestedClasses.join(", ")}.` + : `${jurisdiction} ${requestType ?? "request"} refused: ${refusalReasons.join("; ")}.`; +const decision = { eligible, reason }; +const escalation = eligible + ? { + required: false, + lane: "none", + reason: "Requestor identity, subject match, lawful basis, and scope all pass policy.", + } + : { + required: true, + lane: "human_privacy_review", + reason: reason, + }; +const observations = { + lawful_basis_verdict: lawfulBasis + ? `${lawfulBasis} => ${eligible ? "eligible" : "refused"}` + : `missing lawful basis => refused`, + jurisdiction_reason: `${jurisdiction} policy supplied for request ${requestId}.`, + verified_requestor_ref: assertionRef, + identity_assertion_digest: assertionDigest, + scope_bounds: allowedClasses, + bounded_handoff: eligible ? `${handoff.path} for ${handoff.data_classes.join(", ")} only` : "none", + data_store_aggregate_id: aggregateId, + expected_version: expectedVersion, + idempotency_key: idempotencyKey, + prior_projection_seen: priorDecision !== null, + prior_projection_version: typeof priorDecision?.version === "number" ? priorDecision.version : null, + refused_reason: eligible ? null : reason, + harness_case_names: [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff", + ], +}; +const verdictEventPayload = { + packet: "runx.privacy.data_subject_request.v1", + request: { + request_id: requestId, + type: requestType, + subject_id: subjectId, + requested_scopes: requestedScopes, + data_classes: requestedClasses, + }, + decision, + escalation, + legal: { + jurisdiction, + lawful_basis: lawfulBasis, + }, + requestor: { + identity_provider: identityProvider, + verified_at: verifiedAt, + assertion_ref: assertionRef, + identity_assertion_digest: assertionDigest, + }, + scope_bounds: { + data_classes: allowedClasses, + requested_scopes: requestedScopes, + }, + data_store: { + aggregate_id: aggregateId, + expected_version: expectedVersion, + idempotency_key: idempotencyKey, + prior_projection_seen: priorDecision !== null, + prior_projection_version: typeof priorDecision?.version === "number" ? priorDecision.version : null, + }, +}; +if (eligible) { + verdictEventPayload.handoff = handoff; +} + +const result = { + decision, + escalation, + verdict_event: { + type: "subject_request.verdict_recorded", + payload: verdictEventPayload, + }, + observations, +}; +if (eligible) { + result.handoff = handoff; +} + +process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); + +function buildHandoff({ requestType, subjectId, requestedClasses, requestedScopes }) { + if (requestType === "export") { + return { + path: "downstream.read_projection.redact-pii.send-as", + subject_id: subjectId, + data_classes: requestedClasses, + scopes: { + request_type: requestType, + requested_scopes: requestedScopes, + downstream_operator_required: true, + read_operation: "read_projection", + redaction_skill: "redact-pii", + delivery_skill: "send-as", + rail_effect: "none", + }, + }; + } + return { + path: "downstream.data-store.append_event.subject.erasure", + subject_id: subjectId, + data_classes: requestedClasses, + scopes: { + request_type: requestType, + requested_scopes: requestedScopes, + downstream_operator_required: true, + erasure_event_type: "subject.erasure", + rail_effect: "none", + }, + }; +} + +function readInputs() { + if (process.env.RUNX_INPUTS_PATH) { + return JSON.parse(fs.readFileSync(process.env.RUNX_INPUTS_PATH, "utf8")); + } + if (process.env.RUNX_INPUTS_JSON) { + return JSON.parse(process.env.RUNX_INPUTS_JSON); + } + return { + request_packet: parseInputValue(process.env.RUNX_INPUT_REQUEST_PACKET), + requestor_proof: parseInputValue(process.env.RUNX_INPUT_REQUESTOR_PROOF), + policy: parseInputValue(process.env.RUNX_INPUT_POLICY), + aggregate_id: parseInputValue(process.env.RUNX_INPUT_AGGREGATE_ID), + expected_version: parseInputValue(process.env.RUNX_INPUT_EXPECTED_VERSION), + idempotency_key: parseInputValue(process.env.RUNX_INPUT_IDEMPOTENCY_KEY), + }; +} + +function parseInputValue(raw) { + if (raw === undefined || raw === "") return undefined; + try { + return JSON.parse(raw); + } catch { + return raw; + } +} + +function objectValue(value, name) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + fail(`${name} must be an object`); + } + return value; +} + +function stringValue(value) { + return typeof value === "string" && value.trim().length > 0 ? value.trim() : null; +} + +function numberValue(value) { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +function uniqueStrings(value) { + if (!Array.isArray(value)) return []; + return [...new Set(value.filter((entry) => typeof entry === "string" && entry.trim().length > 0).map((entry) => entry.trim()))]; +} + +function digestObject(value) { + return `sha256:${crypto.createHash("sha256").update(canon(value ?? {}), "utf8").digest("hex")}`; +} + +function canon(value) { + if (value === null || typeof value === "boolean" || typeof value === "number" || typeof value === "string") { + return JSON.stringify(value); + } + if (Array.isArray(value)) { + return `[${value.map(canon).join(",")}]`; + } + return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canon(value[key])}`).join(",")}}`; +} + +function fail(message) { + process.stderr.write(`${message}\n`); + process.exit(64); +} diff --git a/skills/data-subject-request/tools/data/local/manifest.json b/skills/data-subject-request/tools/data/local/manifest.json new file mode 100644 index 00000000..ebf37ea0 --- /dev/null +++ b/skills/data-subject-request/tools/data/local/manifest.json @@ -0,0 +1,77 @@ +{ + "schema": "runx.tool.manifest.v1", + "name": "data.local", + "version": "0.1.0", + "description": "Local JSON event-store adapter for the provider-agnostic runx data operation envelope.", + "source": { + "type": "cli-tool", + "command": "node", + "args": ["./run.mjs"] + }, + "inputs": { + "operation": { + "type": "string", + "required": true, + "description": "append_event, read_events, or read_projection." + }, + "data_source_ref": { + "type": "string", + "required": true, + "description": "Stable logical data-source reference." + }, + "store_id": { + "type": "string", + "required": false, + "description": "Local fixture store id. Provider adapters may ignore this." + }, + "resource": { + "type": "string", + "required": true, + "description": "Declared resource, stream, table, keyspace, or projection name." + }, + "aggregate_id": { + "type": "string", + "required": true, + "description": "Stream or partition key." + }, + "expected_version": { + "type": "number", + "required": false, + "description": "Required current stream version for append_event." + }, + "idempotency_key": { + "type": "string", + "required": false, + "description": "Stable retry key for append_event." + }, + "event": { + "type": "json", + "required": false, + "description": "Domain event or transition packet for append_event." + }, + "limit": { + "type": "number", + "required": false, + "default": 50, + "description": "Maximum events returned by read_events." + } + }, + "scopes": ["runx:data:read", "runx:data:append"], + "runx": { + "artifacts": { + "named_emits": { + "data_operation_result": "runx.data.operation_result.v1" + }, + "wrap_as": "data_operation_result" + } + }, + "runtime": { + "command": "node", + "args": ["./run.mjs"] + }, + "output": { + "packet": "runx.data.operation_result.v1", + "wrap_as": "data_operation_result" + }, + "toolkit_version": "0.1.4" +} diff --git a/skills/data-subject-request/tools/data/local/run.mjs b/skills/data-subject-request/tools/data/local/run.mjs new file mode 100644 index 00000000..659c9702 --- /dev/null +++ b/skills/data-subject-request/tools/data/local/run.mjs @@ -0,0 +1,335 @@ +import crypto from "node:crypto"; +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; + +const SCHEMA = "runx.data.operation_result.v1"; +const PROVIDER = "local-json-event-store"; + +const inputs = readInputs(); +const operation = stringInput("operation"); + +let result; +if (operation === "append_event") { + result = appendEvent(inputs); +} else if (operation === "read_events") { + result = readEvents(inputs); +} else if (operation === "read_projection") { + result = readProjection(inputs); +} else { + throw new Error("operation must be append_event, read_events, or read_projection"); +} + +process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); + +function readInputs() { + const raw = process.env.RUNX_INPUTS_PATH + ? fs.readFileSync(process.env.RUNX_INPUTS_PATH, "utf8") + : process.env.RUNX_INPUTS_JSON || "{}"; + return JSON.parse(raw); +} + +function appendEvent(rawInputs) { + const envelope = baseEnvelope(rawInputs, "append_event"); + const expectedVersion = numberInput("expected_version"); + const idempotencyKey = stringInput("idempotency_key"); + const event = objectInput("event"); + const store = readStore(rawInputs); + const stream = streamFor(store, envelope.resource, envelope.aggregate_id); + const eventDigest = sha256Json(event); + const existing = stream.events.find((entry) => entry.idempotency_key === idempotencyKey); + + if (existing) { + if (existing.event_digest !== eventDigest) { + return conflictResult(envelope, stream, { + idempotency_key: idempotencyKey, + event_digest: eventDigest, + reason: "idempotency key was reused with different event content", + provider_evidence: providerEvidence(store, envelope), + }); + } + return { + ...envelope, + status: "idempotent_replay", + before_version: stream.version, + after_version: stream.version, + idempotency_key: idempotencyKey, + event_ref: existing.event_ref, + event_digest: existing.event_digest, + result_digest: sha256Json(existing), + projection_digest: projectionDigest(stream), + events: [], + rows: [], + redactions: [], + stop_conditions: [], + provider_evidence: providerEvidence(store, envelope), + }; + } + + if (stream.version !== expectedVersion) { + return conflictResult(envelope, stream, { + idempotency_key: idempotencyKey, + event_digest: eventDigest, + reason: `expected version ${expectedVersion}, got ${stream.version}`, + provider_evidence: providerEvidence(store, envelope), + }); + } + + const nextVersion = stream.version + 1; + const eventRef = `${envelope.resource}:${envelope.aggregate_id}:${nextVersion}`; + const record = { + event_ref: eventRef, + version: nextVersion, + event_type: eventType(event), + event, + event_digest: eventDigest, + idempotency_key: idempotencyKey, + committed_at: typeof rawInputs.observed_at === "string" ? rawInputs.observed_at : "1970-01-01T00:00:00.000Z", + }; + stream.events.push(record); + stream.version = nextVersion; + writeStore(rawInputs, store); + + return { + ...envelope, + status: "committed", + before_version: expectedVersion, + after_version: nextVersion, + idempotency_key: idempotencyKey, + event_ref: eventRef, + event_digest: eventDigest, + result_digest: sha256Json(record), + projection_digest: projectionDigest(stream), + events: [], + rows: [], + redactions: [], + stop_conditions: [], + provider_evidence: providerEvidence(store, envelope), + }; +} + +function conflictResult(envelope, stream, { idempotency_key, event_digest, reason, provider_evidence }) { + const stop = { + code: "conflict", + message: reason, + }; + return { + ...envelope, + status: "conflict", + before_version: stream.version, + after_version: stream.version, + idempotency_key, + event_ref: null, + event_digest, + result_digest: sha256Json(stop), + projection_digest: projectionDigest(stream), + events: [], + rows: [], + redactions: [], + stop_conditions: [stop], + provider_evidence, + }; +} + +function readEvents(rawInputs) { + const envelope = baseEnvelope(rawInputs, "read_events"); + const limit = boundedLimit(rawInputs.limit); + const store = readStore(rawInputs); + const stream = streamFor(store, envelope.resource, envelope.aggregate_id); + const events = stream.events.slice(Math.max(0, stream.events.length - limit)); + return { + ...envelope, + status: "read", + before_version: stream.version, + after_version: stream.version, + idempotency_key: null, + event_ref: null, + event_digest: null, + result_digest: sha256Json(events), + projection_digest: projectionDigest(stream), + events, + rows: events, + redactions: [], + stop_conditions: [], + provider_evidence: providerEvidence(store, envelope), + }; +} + +function readProjection(rawInputs) { + const envelope = baseEnvelope(rawInputs, "read_projection"); + const store = readStore(rawInputs); + const stream = streamFor(store, envelope.resource, envelope.aggregate_id); + const projection = { + aggregate_id: envelope.aggregate_id, + resource: envelope.resource, + version: stream.version, + event_count: stream.events.length, + last_event_ref: stream.events.at(-1)?.event_ref ?? null, + last_event_type: stream.events.at(-1)?.event_type ?? null, + event_digests: stream.events.map((entry) => entry.event_digest), + }; + return { + ...envelope, + status: "read", + before_version: stream.version, + after_version: stream.version, + idempotency_key: null, + event_ref: null, + event_digest: null, + result_digest: sha256Json(projection), + projection_digest: sha256Json(projection), + projection, + events: [], + rows: [], + redactions: [], + stop_conditions: [], + provider_evidence: providerEvidence(store, envelope), + }; +} + +function baseEnvelope(rawInputs, operation) { + return { + schema: SCHEMA, + data_source_ref: stringInput("data_source_ref"), + provider: PROVIDER, + operation, + resource: safeName(stringInput("resource"), "resource"), + aggregate_id: safeName(stringInput("aggregate_id"), "aggregate_id"), + }; +} + +function streamFor(store, resource, aggregateId) { + store.resources[resource] ??= { streams: {} }; + store.resources[resource].streams[aggregateId] ??= { version: 0, events: [] }; + return store.resources[resource].streams[aggregateId]; +} + +function readStore(rawInputs) { + const file = storePath(rawInputs); + if (!fs.existsSync(file)) { + return { + schema: "runx.local_data_store.v1", + store_id: localStoreId(rawInputs), + resources: {}, + }; + } + const parsed = JSON.parse(fs.readFileSync(file, "utf8")); + if (!parsed || typeof parsed !== "object" || parsed.schema !== "runx.local_data_store.v1") { + throw new Error("local data store file has an invalid schema"); + } + parsed.resources ??= {}; + return parsed; +} + +function writeStore(rawInputs, store) { + const file = storePath(rawInputs); + fs.mkdirSync(path.dirname(file), { recursive: true }); + const tmp = `${file}.${process.pid}.tmp`; + fs.writeFileSync(tmp, `${JSON.stringify(store, null, 2)}\n`); + fs.renameSync(tmp, file); +} + +function storePath(rawInputs) { + const storeId = localStoreId(rawInputs); + return path.join(os.tmpdir(), "runx-data-store", `${storeId}.json`); +} + +function localStoreId(rawInputs) { + if (typeof rawInputs.store_id === "string" && rawInputs.store_id.trim().length > 0) { + return safeName(rawInputs.store_id, "store_id"); + } + const ref = typeof rawInputs.data_source_ref === "string" && rawInputs.data_source_ref.length > 0 + ? rawInputs.data_source_ref + : "default"; + return `source-${crypto.createHash("sha256").update(ref).digest("hex").slice(0, 24)}`; +} + +function providerEvidence(store, envelope) { + return { + provider: PROVIDER, + store_id: store.store_id, + resource: envelope.resource, + aggregate_id: envelope.aggregate_id, + storage_class: "local-fixture", + }; +} + +function projectionDigest(stream) { + return sha256Json({ + version: stream.version, + event_digests: stream.events.map((entry) => entry.event_digest), + }); +} + +function readValue(name) { + return inputs[name]; +} + +function stringInput(name) { + const value = readValue(name); + if (typeof value !== "string" || value.trim().length === 0) { + throw new Error(`${name} is required`); + } + return value.trim(); +} + +function numberInput(name) { + const value = readValue(name); + if (!Number.isInteger(value) || value < 0) { + throw new Error(`${name} must be a non-negative integer`); + } + return value; +} + +function objectInput(name) { + const value = readValue(name); + if (!value || typeof value !== "object" || Array.isArray(value)) { + throw new Error(`${name} must be an object`); + } + return value; +} + +function eventType(event) { + const explicit = safeEventToken(event.type) ?? safeEventToken(event.event_type); + if (explicit) return explicit; + const family = safeEventToken(event.effect_family); + const operation = safeEventToken(event.operation); + if (family && operation) return `${family}.${operation}`; + if (operation) return operation; + return "data.event"; +} + +function safeEventToken(value) { + if (typeof value !== "string") return undefined; + const text = value.trim(); + return /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(text) ? text : undefined; +} + +function boundedLimit(value) { + if (value === undefined || value === null) return 50; + if (!Number.isInteger(value) || value < 1 || value > 500) { + throw new Error("limit must be an integer from 1 to 500"); + } + return value; +} + +function safeName(value, field) { + const text = String(value || "").trim(); + const pattern = field === "aggregate_id" + ? /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,191}$/ + : /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/; + if (!pattern.test(text)) { + throw new Error(`${field} must be a safe identifier`); + } + return text; +} + +function sha256Json(value) { + return `sha256:${crypto.createHash("sha256").update(canonicalJson(value)).digest("hex")}`; +} + +function canonicalJson(value) { + if (value === null || typeof value !== "object") return JSON.stringify(value); + if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`; + return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`; +} From 710905f34ca94c461dd180d3358f17a170472588 Mon Sep 17 00:00:00 2001 From: fengyangxxx <356261005@qq.com> Date: Wed, 1 Jul 2026 00:21:46 +0800 Subject: [PATCH 2/4] Add final data subject request evidence --- .../artifacts/commands.md | 59 +- .../artifacts/evidence.json | 387 ++++ .../install-add-runx-0.6.14-linux.json | 44 + ...ogfood-root-receipt-runx-0.6.14-linux.json | 1 + ...postpublish-dogfood-runx-0.6.14-linux.json | 1983 +++++++++++++++++ ...lish-dogfood-verify-runx-0.6.14-linux.json | 15 + .../registry-publish-runx-0.6.14-linux.json | 20 + .../registry-read-runx-0.6.14-linux.json | 51 + ...emote-skill-inspect-runx-0.6.14-linux.json | 23 + .../data-subject-request/artifacts/report.md | 62 + .../artifacts/runx-version-0.6.14-linux.txt | 1 + .../artifacts/verification.json | 214 ++ 12 files changed, 2815 insertions(+), 45 deletions(-) create mode 100644 skills/data-subject-request/artifacts/evidence.json create mode 100644 skills/data-subject-request/artifacts/install-add-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/artifacts/postpublish-dogfood-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/artifacts/postpublish-dogfood-verify-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/artifacts/registry-publish-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/artifacts/registry-read-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/artifacts/remote-skill-inspect-runx-0.6.14-linux.json create mode 100644 skills/data-subject-request/artifacts/report.md create mode 100644 skills/data-subject-request/artifacts/runx-version-0.6.14-linux.txt create mode 100644 skills/data-subject-request/artifacts/verification.json diff --git a/skills/data-subject-request/artifacts/commands.md b/skills/data-subject-request/artifacts/commands.md index 74cc5675..051f305d 100644 --- a/skills/data-subject-request/artifacts/commands.md +++ b/skills/data-subject-request/artifacts/commands.md @@ -1,50 +1,19 @@ -# data-subject-request local evidence commands +# data-subject-request Frantic #71 evidence commands -These commands are pre-publication development evidence for Frantic #71. They do -not replace final PR, registry publish, hosted harness, post-publish dogfood, -QA PASS, or delivery artifacts. +Final package: fengyangxxx/data-subject-request@sha-5e61052d6ca5 +PR: https://github.com/runxhq/runx/pull/192 +Receipt: runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 ```bash -node scripts/generate-official-lock.mjs -pnpm build -pnpm exec tsx packages/cli/src/index.ts doctor --json -docker run --rm -v "$PWD:/repo" -w /repo node:24-bookworm node scripts/check-authoring-package-contract.mjs +npx -y @runxhq/cli@0.6.14 --version +npx -y @runxhq/cli@0.6.14 registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml --json +npx -y @runxhq/cli@0.6.14 registry read fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json +npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json +npx -y @runxhq/cli@0.6.14 harness ./skills/data-subject-request --json -R .runx-test-receipts-data-subject-request-linux-final5 +npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version= +npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json +npx -y @runxhq/cli@0.6.14 skill inspect fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json +npx -y @runxhq/cli@0.6.14 doctor --json ``` -```bash -docker run --rm \ - -v "$PWD:/repo" \ - -w /repo \ - -e npm_config_update_notifier=false \ - -e RUNX_RECEIPT_SIGN_KID=frantic-71-local-harness-key \ - -e RUNX_RECEIPT_SIGN_ED25519_SEED_BASE64= \ - -e RUNX_RECEIPT_SIGN_ISSUER_TYPE=hosted \ - node:24-bookworm \ - bash -lc "npx -y @runxhq/cli@0.6.14 harness ./skills/data-subject-request --json --receipt-dir .runx-test-receipts-data-subject-request-linux-final" -``` - -```bash -# Dogfood command was run through a small stdin Node wrapper that read -# skills/data-subject-request/fixtures/dogfood-erasure-input.json and invoked: -npx -y @runxhq/cli@0.6.14 skill ./skills/data-subject-request --json \ - -R .runx-test-receipts-data-subject-request-dogfood-final \ - --input-json request_packet= \ - --input-json requestor_proof= \ - --input-json policy= \ - -i data_source_ref= \ - -i store_id= \ - -i aggregate_id= \ - -i idempotency_key= \ - --input-json expected_version= -``` - -```bash -docker run --rm \ - -v "$PWD:/repo" \ - -w /repo \ - -e npm_config_update_notifier=false \ - -e RUNX_RECEIPT_VERIFY_KID=frantic-71-local-harness-key \ - -e RUNX_RECEIPT_VERIFY_ED25519_PUBLIC_KEY_BASE64=IVL40Zt5HSRFMkLhXy6rbLfP+ntqXtMAl5YOBpiB2xI= \ - node:24-bookworm \ - bash -lc "npx -y @runxhq/cli@0.6.14 verify --receipt-dir .runx-test-receipts-data-subject-request-dogfood-final --json" -``` +No Frantic delivery has been submitted from this command log. Final submission still requires an independent QA log ending exactly QA_DECISION: PASS and the guarded Frantic submit wrapper. diff --git a/skills/data-subject-request/artifacts/evidence.json b/skills/data-subject-request/artifacts/evidence.json new file mode 100644 index 00000000..31060c0a --- /dev/null +++ b/skills/data-subject-request/artifacts/evidence.json @@ -0,0 +1,387 @@ +{ + "schema": "frantic.runx.data_subject_request.evidence.v1", + "status": "ready_for_independent_qa_not_submitted", + "generated_at": "2026-06-30T16:20:37.121Z", + "frantic": { + "bounty_number": 71, + "posting_id": "p-4bc8c5bd4a", + "claim_id": "82a0439e-68b6-4b35-a70d-a7df455f1025", + "claim_ref": "frantic:claim:82a0439e-68b6-4b35-a70d-a7df455f1025", + "delivery_deadline_utc": "2026-06-30T19:33:01.941Z", + "delivery_deadline_beijing": "2026-07-01T03:33:01+08:00", + "required_artifacts": [ + "public_url", + "source_url", + "pr_url", + "x_yaml", + "skill_md", + "verification_json", + "evidence_json", + "receipt_ref", + "report" + ] + }, + "package": { + "owner": "fengyangxxx", + "name": "data-subject-request", + "version": "sha-5e61052d6ca5", + "registry_ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "public_url": "https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "canonical_public_url": "https://runx.ai/x/fengyangxxx/data-subject-request", + "registry_publish_status": "success", + "registry_publish": { + "target": "hosted", + "status": "published", + "skill_id": "fengyangxxx/data-subject-request", + "owner": "fengyangxxx", + "name": "data-subject-request", + "version": "sha-5e61052d6ca5", + "digest": "ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "profile_digest": "d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "trust_tier": "community", + "install_command": "runx add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", + "run_command": "runx skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", + "public_url": "https://runx.ai/x/fengyangxxx/data-subject-request" + }, + "registry_read_status": "success", + "registry_digest": "sha256:ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "profile_digest": "sha256:d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "remote_inspect_status": "ok", + "remote_inspect": { + "digest": "sha256:ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "profile_digest": "sha256:d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "registry_key_id": "runx-registry-ed25519-v1", + "registry_source": "remote https://api.runx.ai", + "registry_source_fingerprint": "ba1ac16b631195fd", + "skill_id": "fengyangxxx/data-subject-request", + "trust_state": "trusted", + "trust_tier": "community", + "version": "sha-5e61052d6ca5" + } + }, + "source": { + "pr_url": "https://github.com/runxhq/runx/pull/192", + "source_url": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", + "commit_used_for_publish": "f9675dfe46709886ea009f2245145bb87f21b359", + "branch": "fy/frantic-71-data-subject-request", + "x_yaml": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", + "skill_md": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", + "package_paths": [ + "skills/data-subject-request/X.yaml", + "skills/data-subject-request/SKILL.md", + "skills/data-subject-request/run.mjs", + "skills/data-subject-request/fixtures/dogfood-erasure-input.json", + "skills/data-subject-request/fixtures/eligible-erasure-input.json", + "skills/data-subject-request/fixtures/unverified-requestor-input.json" + ] + }, + "runtime": { + "runx_version_output": "runx-cli 0.6.14", + "runx_cli_minimum_required": "0.6.14", + "docker_image": "node:24-bookworm", + "commands_used_runx_0_6_14": { + "version": "npx -y @runxhq/cli@0.6.14 --version", + "publish": "npx -y @runxhq/cli@0.6.14 registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml --json", + "registry_read": "npx -y @runxhq/cli@0.6.14 registry read fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json", + "install": "npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json", + "local_harness": "npx -y @runxhq/cli@0.6.14 harness ./skills/data-subject-request --json -R .runx-test-receipts-data-subject-request-linux-final5", + "dogfood": "npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=", + "verify": "npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json", + "remote_inspect": "npx -y @runxhq/cli@0.6.14 skill inspect fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json", + "doctor": "npx -y @runxhq/cli@0.6.14 doctor --json" + } + }, + "dogfood": { + "package": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "input": "skills/data-subject-request/fixtures/dogfood-erasure-input.json", + "command": "npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=", + "status": "sealed", + "receipt_ref": "runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "receipt_artifact": "skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json", + "verify_command": "npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json", + "verify_verdict": { + "valid": true, + "signature_mode": "production", + "root_receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "receipt_count": 5, + "findings": [] + }, + "harness_cases": [ + { + "name": "eligible-erasure-records-verdict", + "status": "sealed", + "receipt_id": "sha256:1104ce5cb414b391b03f68dc3a0a14e3237ba9f9d934fa7f65a5963f63f6923d", + "expected": "decision.eligible true; bounded erasure handoff emitted; subject_request.verdict_recorded appended" + }, + { + "name": "unverified-requestor-refused-no-handoff", + "status": "refused_policy_denied", + "receipt_id": "sha256:7475dfb674888c6cde3538e4ea8c80c300df097b25a351aac47f0b4c13a4497d", + "expected": "unverified requestor and out-of-bounds payment_methods scope refused with no handoff; readback guard blocks closed graph" + } + ], + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + }, + "graph_status": "Succeeded", + "step_receipts": [ + { + "receipt_id": "sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c", + "status": "success" + }, + { + "receipt_id": "sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac", + "status": "success" + }, + { + "receipt_id": "sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b", + "status": "success" + }, + { + "receipt_id": "sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63", + "status": "success" + } + ] + }, + "observations": { + "runx_version_output": "runx-cli 0.6.14", + "publisher_owner": "fengyangxxx", + "package_name": "data-subject-request", + "package_version": "sha-5e61052d6ca5", + "registry_ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "public_url": "https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "pr_url": "https://github.com/runxhq/runx/pull/192", + "source_url": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", + "raw_x_yaml": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", + "raw_skill_md": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", + "verification_json": "skills/data-subject-request/artifacts/verification.json", + "publish_method": "runx registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml", + "install_command": "npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json", + "hosted_harness_status": "registry publish returned status=success and publish.status=published after hosted validation; earlier hosted harness failure was fixed before this publish artifact", + "dogfood_command": "npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=", + "receipt_ref": "runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "runx_verify_verdict": "valid=true", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "refused_reason": "Harness case unverified-requestor-refused-no-handoff is expected policy_denied: untrusted unsigned-email provider plus payment_methods outside CCPA scope_bounds, with no handoff.", + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "new_user_instructions": [ + "runx add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", + "runx skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json ...", + "npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json" + ] + }, + "checks": { + "local_harness": { + "status": "passed", + "case_count": 2, + "assertion_error_count": 0, + "assertion_errors": [], + "case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "receipt_ids": [ + "sha256:1104ce5cb414b391b03f68dc3a0a14e3237ba9f9d934fa7f65a5963f63f6923d", + "sha256:7475dfb674888c6cde3538e4ea8c80c300df097b25a351aac47f0b4c13a4497d" + ], + "graph_case_count": 2 + }, + "registry_publish_status": "success", + "registry_read_status": "success", + "clean_install_status": "success", + "clean_install_runner_names": [ + "decide", + "judge" + ], + "remote_skill_inspect_status": "ok", + "dogfood_status": "sealed", + "dogfood_exit_code": 0, + "verify_valid": true, + "doctor_status": "success", + "doctor_summary": { + "errors": 0, + "warnings": 13, + "infos": 0 + }, + "no_operational_proposal_in_dogfood_output": true + }, + "evidence_items": [ + { + "name": "runx_version", + "artifact": "skills/data-subject-request/artifacts/runx-version-0.6.14-linux.txt", + "sha256": "sha256:e602819dc96361bd6584b33f6fd3f8724aaaf4b76a4b8bd4bf9a21119650f2ba" + }, + { + "name": "registry_publish", + "artifact": "skills/data-subject-request/artifacts/registry-publish-runx-0.6.14-linux.json", + "sha256": "sha256:7600fbb1177afafd4f1e9a3406f169ba270e9d9707af3de42ede1dbedcd4cad3" + }, + { + "name": "registry_read", + "artifact": "skills/data-subject-request/artifacts/registry-read-runx-0.6.14-linux.json", + "sha256": "sha256:b54b428395abf8bc12fc2594b261c6097e7cabc767ba6ddcd88f163ab2009ee2" + }, + { + "name": "clean_install", + "artifact": "skills/data-subject-request/artifacts/install-add-runx-0.6.14-linux.json", + "sha256": "sha256:a58d81316f06c3915698f6f5c5240fbfee139ae8348644d3d6d86ecfbf2ca851" + }, + { + "name": "local_harness", + "artifact": "skills/data-subject-request/artifacts/local-harness-runx-0.6.14-linux.json", + "sha256": "sha256:d22db7675761446145fd39f27a2db7a2a912a0fee62a015b71909ae1684f81b0" + }, + { + "name": "dogfood", + "artifact": "skills/data-subject-request/artifacts/postpublish-dogfood-runx-0.6.14-linux.json", + "sha256": "sha256:e57da22450b69655ffc98d3653a618b2ddf756b8f29260226386f5141494464b" + }, + { + "name": "dogfood_verify", + "artifact": "skills/data-subject-request/artifacts/postpublish-dogfood-verify-runx-0.6.14-linux.json", + "sha256": "sha256:6a852e5d5ad92f8baef84ee01da5a8000fa866f7423514b6fb7eb961ad628490" + }, + { + "name": "dogfood_root_receipt", + "artifact": "skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json", + "sha256": "sha256:b285008e1ee913f10d52e1c04f51a8b2b371aeccec949f55286af257fde09474" + }, + { + "name": "remote_inspect", + "artifact": "skills/data-subject-request/artifacts/remote-skill-inspect-runx-0.6.14-linux.json", + "sha256": "sha256:4c7604c614264372e7137bd97713a8d1970950b1b7107ebb19c08fb0a8666907" + }, + { + "name": "doctor", + "artifact": "skills/data-subject-request/artifacts/doctor-local-source.json", + "sha256": "sha256:c8058d50c2a2351a1be11f41e59d4ddecadae8f2314020d5f145836c9a28bae8" + } + ], + "known_prior_review_failures_for_this_bounty": [ + { + "prior_issue": "Earlier worker delivery missed evidence_json.dogfood.command", + "new_evidence": "dogfood.command is present in this evidence_json and commands.md with the post-publish runx skill command", + "status": "addressed" + }, + { + "prior_issue": "Earlier worker delivery had unverifiable receipt evidence", + "new_evidence": "postpublish-dogfood-verify-runx-0.6.14-linux.json shows valid=true for the submitted receipt id", + "status": "addressed" + } + ], + "final_delivery": { + "not_submitted": true, + "qa_required_before_submit": true, + "exact_payload_must_be_recomputed_after_final_commit": true + } +} diff --git a/skills/data-subject-request/artifacts/install-add-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/install-add-runx-0.6.14-linux.json new file mode 100644 index 00000000..004a2427 --- /dev/null +++ b/skills/data-subject-request/artifacts/install-add-runx-0.6.14-linux.json @@ -0,0 +1,44 @@ +{ + "status": "success", + "registry": { + "action": "install", + "source": "remote", + "ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "install": { + "status": "installed", + "destination": "/tmp/runx-clean/skills/fengyangxxx/data-subject-request/sha-5e61052d6ca5/SKILL.md", + "skill_name": "data-subject-request", + "source": "runx-registry", + "source_label": "runx registry", + "skill_id": "fengyangxxx/data-subject-request", + "version": "sha-5e61052d6ca5", + "digest": "sha256:ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "profile_digest": "sha256:d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "profile_state_path": "/tmp/runx-clean/skills/fengyangxxx/data-subject-request/sha-5e61052d6ca5/.runx/profile.json", + "runner_names": [ + "decide", + "judge" + ], + "trust_tier": "community" + }, + "receipt_metadata": { + "destination": "/tmp/runx-clean/skills/fengyangxxx/data-subject-request/sha-5e61052d6ca5/SKILL.md", + "digest": "sha256:ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "install_count": 3, + "package_digest": "b7065cdcec59bda57404fc533b690dc89a5e5e635bbac4bcec584bfa55f36dcf", + "profile_digest": "sha256:d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "publisher": { + "display_name": "fy", + "handle": "fengyangxxx", + "id": "user_69446dfb22822d5fdc22562d", + "kind": "user" + }, + "ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "skill_id": "fengyangxxx/data-subject-request", + "source_label": "runx registry", + "status": "installed", + "trust_tier": "community", + "version": "sha-5e61052d6ca5" + } + } +} diff --git a/skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json new file mode 100644 index 00000000..40862a12 --- /dev/null +++ b/skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json @@ -0,0 +1 @@ +{"schema":"runx.receipt.v1","id":"sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8","created_at":"2026-06-30T16:09:00.976Z","canonicalization":"runx.receipt.c14n.v1","issuer":{"type":"hosted","kid":"frantic-71-postpublish-fixture-key","public_key_sha256":"sha256:3097e2dee2cb4a34b53840cdb705aed71067c36f68db0e0f559c3f3fa043315f"},"signature":{"alg":"Ed25519","value":"base64:-l3D8VMY8HeAtxjZYU4LdAgZRTpr834Tg_6Tux-Z1f6tE8-U1jHD46G77aMM-iUlYOWFPkzypD78F_VDC3cOAQ"},"digest":"sha256:2a410f4b36903ee0687aec8a7aa990dc62c1e83c013ef607e1e16685f3f3e67b","idempotency":{"intent_key":"sha256:data-subject-request-graph-intent","trigger_fingerprint":"sha256:data-subject-request-graph-trigger","content_hash":"sha256:data-subject-request-graph-content"},"subject":{"kind":"graph","ref":{"type":"harness","uri":"hrn_data-subject-request_graph"},"commitments":[]},"authority":{"actor_ref":{"type":"principal","uri":"runx:principal:local_runtime"},"grant_refs":[],"scope_refs":[],"authority_proof_refs":[],"attenuation":{"parent_authority_ref":null,"subset_proof":null},"terms":[],"enforcement":{"profile_hash":"sha256:635fdb0a7eef93911e3c6bd0b25b5e635edba32e0259133042b3a5f1fb19394e","redaction_refs":[],"setup_refs":[],"teardown_refs":[]}},"signals":[],"decisions":[],"acts":[],"seal":{"disposition":"closed","reason_code":"graph_closed","summary":"graph data-subject-request completed","closed_at":"2026-06-30T16:09:00.976Z","last_observed_at":"2026-06-30T16:09:00.976Z","criteria":[]},"lineage":{"children":[{"type":"receipt","uri":"runx:receipt:sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c","locator":"sha256:b1667752f80eb504720421d8c63766efdc44e0cc46f4467415e6337b397ebe97"},{"type":"receipt","uri":"runx:receipt:sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac","locator":"sha256:40c6b247eb1eb82c7f3d5feb5a1232042fdcf5e14fb20e45757313d2a6fa41d0"},{"type":"receipt","uri":"runx:receipt:sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b","locator":"sha256:fe91b2e6ca2e42324e7ee844263bb004ec35f9654459c889eb9f8224c4118d28"},{"type":"receipt","uri":"runx:receipt:sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63","locator":"sha256:be3f9aee10210607c5703be3f683ef27873e01046cd9098fcfe38e9cfb4c8673"}],"sync":[]}} \ No newline at end of file diff --git a/skills/data-subject-request/artifacts/postpublish-dogfood-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/postpublish-dogfood-runx-0.6.14-linux.json new file mode 100644 index 00000000..3eb861b8 --- /dev/null +++ b/skills/data-subject-request/artifacts/postpublish-dogfood-runx-0.6.14-linux.json @@ -0,0 +1,1983 @@ +{ + "closure": { + "closed_at": "2026-06-30T16:09:00.976Z", + "disposition": "closed", + "reason_code": "graph_closed", + "summary": "graph data-subject-request completed" + }, + "execution": { + "exit_code": 0, + "skill_claim": { + "graph": "data-subject-request", + "graph_status": "Succeeded", + "step_outputs": { + "decide": { + "data_subject_request_decision": { + "data": { + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "observations": { + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "prior_projection_seen": true, + "prior_projection_version": 0, + "refused_reason": null, + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + } + } + }, + "raw": "{\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"verdict_event\": {\n \"type\": \"subject_request.verdict_recorded\",\n \"payload\": {\n \"packet\": \"runx.privacy.data_subject_request.v1\",\n \"request\": {\n \"request_id\": \"dsr-2026-06-30-dogfood-001\",\n \"type\": \"erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"legal\": {\n \"jurisdiction\": \"GDPR\",\n \"lawful_basis\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"\n },\n \"requestor\": {\n \"identity_provider\": \"account-session\",\n \"verified_at\": \"2026-06-30T14:45:00Z\",\n \"assertion_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\"\n },\n \"scope_bounds\": {\n \"data_classes\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"data_store\": {\n \"aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n }\n },\n \"observations\": {\n \"lawful_basis_verdict\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\n \"jurisdiction_reason\": \"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\n \"verified_requestor_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\n \"scope_bounds\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"bounded_handoff\": \"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\n \"data_store_aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0,\n \"refused_reason\": null,\n \"harness_case_names\": [\n \"eligible-erasure-records-verdict\",\n \"unverified-requestor-refused-no-handoff\"\n ]\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n}\n", + "skill_claim": { + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "observations": { + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "prior_projection_seen": true, + "prior_projection_version": 0, + "refused_reason": null, + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + } + }, + "status": "success", + "stderr": "", + "stdout": "{\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"verdict_event\": {\n \"type\": \"subject_request.verdict_recorded\",\n \"payload\": {\n \"packet\": \"runx.privacy.data_subject_request.v1\",\n \"request\": {\n \"request_id\": \"dsr-2026-06-30-dogfood-001\",\n \"type\": \"erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"legal\": {\n \"jurisdiction\": \"GDPR\",\n \"lawful_basis\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"\n },\n \"requestor\": {\n \"identity_provider\": \"account-session\",\n \"verified_at\": \"2026-06-30T14:45:00Z\",\n \"assertion_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\"\n },\n \"scope_bounds\": {\n \"data_classes\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"data_store\": {\n \"aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n }\n },\n \"observations\": {\n \"lawful_basis_verdict\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\n \"jurisdiction_reason\": \"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\n \"verified_requestor_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\n \"scope_bounds\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"bounded_handoff\": \"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\n \"data_store_aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0,\n \"refused_reason\": null,\n \"harness_case_names\": [\n \"eligible-erasure-records-verdict\",\n \"unverified-requestor-refused-no-handoff\"\n ]\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n}\n" + }, + "read-prior-decision": { + "data_operation_result": { + "data": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_operation_result": { + "data": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}" + }, + "readback": { + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}" + }, + "record-verdict": { + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}" + } + }, + "steps": [ + { + "receipt_id": "sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c", + "skill": "tool:data.source", + "status": "success", + "step_id": "read-prior-decision" + }, + { + "receipt_id": "sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac", + "skill": "judge", + "status": "success", + "step_id": "decide" + }, + { + "receipt_id": "sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b", + "skill": "tool:data.source", + "status": "success", + "step_id": "record-verdict" + }, + { + "receipt_id": "sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63", + "skill": "tool:data.source", + "status": "success", + "step_id": "readback" + } + ] + }, + "stderr": "", + "stdout": "{\"graph\":\"data-subject-request\",\"graph_status\":\"Succeeded\",\"step_outputs\":{\"decide\":{\"data_subject_request_decision\":{\"data\":{\"decision\":{\"eligible\":true,\"reason\":\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"},\"escalation\":{\"lane\":\"none\",\"reason\":\"Requestor identity, subject match, lawful basis, and scope all pass policy.\",\"required\":false},\"handoff\":{\"data_classes\":[\"profile\",\"marketing_preferences\"],\"path\":\"downstream.data-store.append_event.subject.erasure\",\"scopes\":{\"downstream_operator_required\":true,\"erasure_event_type\":\"subject.erasure\",\"rail_effect\":\"none\",\"request_type\":\"erasure\",\"requested_scopes\":[\"profile\",\"marketing_preferences\"]},\"subject_id\":\"subject:customer_7001\"},\"observations\":{\"bounded_handoff\":\"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\"data_store_aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"expected_version\":0,\"harness_case_names\":[\"eligible-erasure-records-verdict\",\"unverified-requestor-refused-no-handoff\"],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"identity_assertion_digest\":\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\"jurisdiction_reason\":\"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\"lawful_basis_verdict\":\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\"prior_projection_seen\":true,\"prior_projection_version\":0,\"refused_reason\":null,\"scope_bounds\":[\"profile\",\"support_tickets\",\"marketing_preferences\"],\"verified_requestor_ref\":\"acct-session:customer_7001:2026-06-30\"},\"verdict_event\":{\"payload\":{\"data_store\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"expected_version\":0,\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"prior_projection_seen\":true,\"prior_projection_version\":0},\"decision\":{\"eligible\":true,\"reason\":\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"},\"escalation\":{\"lane\":\"none\",\"reason\":\"Requestor identity, subject match, lawful basis, and scope all pass policy.\",\"required\":false},\"handoff\":{\"data_classes\":[\"profile\",\"marketing_preferences\"],\"path\":\"downstream.data-store.append_event.subject.erasure\",\"scopes\":{\"downstream_operator_required\":true,\"erasure_event_type\":\"subject.erasure\",\"rail_effect\":\"none\",\"request_type\":\"erasure\",\"requested_scopes\":[\"profile\",\"marketing_preferences\"]},\"subject_id\":\"subject:customer_7001\"},\"legal\":{\"jurisdiction\":\"GDPR\",\"lawful_basis\":\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"},\"packet\":\"runx.privacy.data_subject_request.v1\",\"request\":{\"data_classes\":[\"profile\",\"marketing_preferences\"],\"request_id\":\"dsr-2026-06-30-dogfood-001\",\"requested_scopes\":[\"profile\",\"marketing_preferences\"],\"subject_id\":\"subject:customer_7001\",\"type\":\"erasure\"},\"requestor\":{\"assertion_ref\":\"acct-session:customer_7001:2026-06-30\",\"identity_assertion_digest\":\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\"identity_provider\":\"account-session\",\"verified_at\":\"2026-06-30T14:45:00Z\"},\"scope_bounds\":{\"data_classes\":[\"profile\",\"support_tickets\",\"marketing_preferences\"],\"requested_scopes\":[\"profile\",\"marketing_preferences\"]}},\"type\":\"subject_request.verdict_recorded\"}}},\"raw\":\"{\\n \\\"decision\\\": {\\n \\\"eligible\\\": true,\\n \\\"reason\\\": \\\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\\\"\\n },\\n \\\"escalation\\\": {\\n \\\"required\\\": false,\\n \\\"lane\\\": \\\"none\\\",\\n \\\"reason\\\": \\\"Requestor identity, subject match, lawful basis, and scope all pass policy.\\\"\\n },\\n \\\"verdict_event\\\": {\\n \\\"type\\\": \\\"subject_request.verdict_recorded\\\",\\n \\\"payload\\\": {\\n \\\"packet\\\": \\\"runx.privacy.data_subject_request.v1\\\",\\n \\\"request\\\": {\\n \\\"request_id\\\": \\\"dsr-2026-06-30-dogfood-001\\\",\\n \\\"type\\\": \\\"erasure\\\",\\n \\\"subject_id\\\": \\\"subject:customer_7001\\\",\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ]\\n },\\n \\\"decision\\\": {\\n \\\"eligible\\\": true,\\n \\\"reason\\\": \\\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\\\"\\n },\\n \\\"escalation\\\": {\\n \\\"required\\\": false,\\n \\\"lane\\\": \\\"none\\\",\\n \\\"reason\\\": \\\"Requestor identity, subject match, lawful basis, and scope all pass policy.\\\"\\n },\\n \\\"legal\\\": {\\n \\\"jurisdiction\\\": \\\"GDPR\\\",\\n \\\"lawful_basis\\\": \\\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\\\"\\n },\\n \\\"requestor\\\": {\\n \\\"identity_provider\\\": \\\"account-session\\\",\\n \\\"verified_at\\\": \\\"2026-06-30T14:45:00Z\\\",\\n \\\"assertion_ref\\\": \\\"acct-session:customer_7001:2026-06-30\\\",\\n \\\"identity_assertion_digest\\\": \\\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\\\"\\n },\\n \\\"scope_bounds\\\": {\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"support_tickets\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ]\\n },\\n \\\"data_store\\\": {\\n \\\"aggregate_id\\\": \\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\n \\\"expected_version\\\": 0,\\n \\\"idempotency_key\\\": \\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\n \\\"prior_projection_seen\\\": true,\\n \\\"prior_projection_version\\\": 0\\n },\\n \\\"handoff\\\": {\\n \\\"path\\\": \\\"downstream.data-store.append_event.subject.erasure\\\",\\n \\\"subject_id\\\": \\\"subject:customer_7001\\\",\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"scopes\\\": {\\n \\\"request_type\\\": \\\"erasure\\\",\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"downstream_operator_required\\\": true,\\n \\\"erasure_event_type\\\": \\\"subject.erasure\\\",\\n \\\"rail_effect\\\": \\\"none\\\"\\n }\\n }\\n }\\n },\\n \\\"observations\\\": {\\n \\\"lawful_basis_verdict\\\": \\\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\\\",\\n \\\"jurisdiction_reason\\\": \\\"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\\\",\\n \\\"verified_requestor_ref\\\": \\\"acct-session:customer_7001:2026-06-30\\\",\\n \\\"identity_assertion_digest\\\": \\\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\\\",\\n \\\"scope_bounds\\\": [\\n \\\"profile\\\",\\n \\\"support_tickets\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"bounded_handoff\\\": \\\"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\\\",\\n \\\"data_store_aggregate_id\\\": \\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\n \\\"expected_version\\\": 0,\\n \\\"idempotency_key\\\": \\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\n \\\"prior_projection_seen\\\": true,\\n \\\"prior_projection_version\\\": 0,\\n \\\"refused_reason\\\": null,\\n \\\"harness_case_names\\\": [\\n \\\"eligible-erasure-records-verdict\\\",\\n \\\"unverified-requestor-refused-no-handoff\\\"\\n ]\\n },\\n \\\"handoff\\\": {\\n \\\"path\\\": \\\"downstream.data-store.append_event.subject.erasure\\\",\\n \\\"subject_id\\\": \\\"subject:customer_7001\\\",\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"scopes\\\": {\\n \\\"request_type\\\": \\\"erasure\\\",\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"downstream_operator_required\\\": true,\\n \\\"erasure_event_type\\\": \\\"subject.erasure\\\",\\n \\\"rail_effect\\\": \\\"none\\\"\\n }\\n }\\n}\\n\",\"skill_claim\":{\"decision\":{\"eligible\":true,\"reason\":\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"},\"escalation\":{\"lane\":\"none\",\"reason\":\"Requestor identity, subject match, lawful basis, and scope all pass policy.\",\"required\":false},\"handoff\":{\"data_classes\":[\"profile\",\"marketing_preferences\"],\"path\":\"downstream.data-store.append_event.subject.erasure\",\"scopes\":{\"downstream_operator_required\":true,\"erasure_event_type\":\"subject.erasure\",\"rail_effect\":\"none\",\"request_type\":\"erasure\",\"requested_scopes\":[\"profile\",\"marketing_preferences\"]},\"subject_id\":\"subject:customer_7001\"},\"observations\":{\"bounded_handoff\":\"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\"data_store_aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"expected_version\":0,\"harness_case_names\":[\"eligible-erasure-records-verdict\",\"unverified-requestor-refused-no-handoff\"],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"identity_assertion_digest\":\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\"jurisdiction_reason\":\"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\"lawful_basis_verdict\":\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\"prior_projection_seen\":true,\"prior_projection_version\":0,\"refused_reason\":null,\"scope_bounds\":[\"profile\",\"support_tickets\",\"marketing_preferences\"],\"verified_requestor_ref\":\"acct-session:customer_7001:2026-06-30\"},\"verdict_event\":{\"payload\":{\"data_store\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"expected_version\":0,\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"prior_projection_seen\":true,\"prior_projection_version\":0},\"decision\":{\"eligible\":true,\"reason\":\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"},\"escalation\":{\"lane\":\"none\",\"reason\":\"Requestor identity, subject match, lawful basis, and scope all pass policy.\",\"required\":false},\"handoff\":{\"data_classes\":[\"profile\",\"marketing_preferences\"],\"path\":\"downstream.data-store.append_event.subject.erasure\",\"scopes\":{\"downstream_operator_required\":true,\"erasure_event_type\":\"subject.erasure\",\"rail_effect\":\"none\",\"request_type\":\"erasure\",\"requested_scopes\":[\"profile\",\"marketing_preferences\"]},\"subject_id\":\"subject:customer_7001\"},\"legal\":{\"jurisdiction\":\"GDPR\",\"lawful_basis\":\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"},\"packet\":\"runx.privacy.data_subject_request.v1\",\"request\":{\"data_classes\":[\"profile\",\"marketing_preferences\"],\"request_id\":\"dsr-2026-06-30-dogfood-001\",\"requested_scopes\":[\"profile\",\"marketing_preferences\"],\"subject_id\":\"subject:customer_7001\",\"type\":\"erasure\"},\"requestor\":{\"assertion_ref\":\"acct-session:customer_7001:2026-06-30\",\"identity_assertion_digest\":\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\"identity_provider\":\"account-session\",\"verified_at\":\"2026-06-30T14:45:00Z\"},\"scope_bounds\":{\"data_classes\":[\"profile\",\"support_tickets\",\"marketing_preferences\"],\"requested_scopes\":[\"profile\",\"marketing_preferences\"]}},\"type\":\"subject_request.verdict_recorded\"}},\"status\":\"success\",\"stderr\":\"\",\"stdout\":\"{\\n \\\"decision\\\": {\\n \\\"eligible\\\": true,\\n \\\"reason\\\": \\\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\\\"\\n },\\n \\\"escalation\\\": {\\n \\\"required\\\": false,\\n \\\"lane\\\": \\\"none\\\",\\n \\\"reason\\\": \\\"Requestor identity, subject match, lawful basis, and scope all pass policy.\\\"\\n },\\n \\\"verdict_event\\\": {\\n \\\"type\\\": \\\"subject_request.verdict_recorded\\\",\\n \\\"payload\\\": {\\n \\\"packet\\\": \\\"runx.privacy.data_subject_request.v1\\\",\\n \\\"request\\\": {\\n \\\"request_id\\\": \\\"dsr-2026-06-30-dogfood-001\\\",\\n \\\"type\\\": \\\"erasure\\\",\\n \\\"subject_id\\\": \\\"subject:customer_7001\\\",\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ]\\n },\\n \\\"decision\\\": {\\n \\\"eligible\\\": true,\\n \\\"reason\\\": \\\"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\\\"\\n },\\n \\\"escalation\\\": {\\n \\\"required\\\": false,\\n \\\"lane\\\": \\\"none\\\",\\n \\\"reason\\\": \\\"Requestor identity, subject match, lawful basis, and scope all pass policy.\\\"\\n },\\n \\\"legal\\\": {\\n \\\"jurisdiction\\\": \\\"GDPR\\\",\\n \\\"lawful_basis\\\": \\\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\\\"\\n },\\n \\\"requestor\\\": {\\n \\\"identity_provider\\\": \\\"account-session\\\",\\n \\\"verified_at\\\": \\\"2026-06-30T14:45:00Z\\\",\\n \\\"assertion_ref\\\": \\\"acct-session:customer_7001:2026-06-30\\\",\\n \\\"identity_assertion_digest\\\": \\\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\\\"\\n },\\n \\\"scope_bounds\\\": {\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"support_tickets\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ]\\n },\\n \\\"data_store\\\": {\\n \\\"aggregate_id\\\": \\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\n \\\"expected_version\\\": 0,\\n \\\"idempotency_key\\\": \\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\n \\\"prior_projection_seen\\\": true,\\n \\\"prior_projection_version\\\": 0\\n },\\n \\\"handoff\\\": {\\n \\\"path\\\": \\\"downstream.data-store.append_event.subject.erasure\\\",\\n \\\"subject_id\\\": \\\"subject:customer_7001\\\",\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"scopes\\\": {\\n \\\"request_type\\\": \\\"erasure\\\",\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"downstream_operator_required\\\": true,\\n \\\"erasure_event_type\\\": \\\"subject.erasure\\\",\\n \\\"rail_effect\\\": \\\"none\\\"\\n }\\n }\\n }\\n },\\n \\\"observations\\\": {\\n \\\"lawful_basis_verdict\\\": \\\"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\\\",\\n \\\"jurisdiction_reason\\\": \\\"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\\\",\\n \\\"verified_requestor_ref\\\": \\\"acct-session:customer_7001:2026-06-30\\\",\\n \\\"identity_assertion_digest\\\": \\\"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\\\",\\n \\\"scope_bounds\\\": [\\n \\\"profile\\\",\\n \\\"support_tickets\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"bounded_handoff\\\": \\\"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\\\",\\n \\\"data_store_aggregate_id\\\": \\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\n \\\"expected_version\\\": 0,\\n \\\"idempotency_key\\\": \\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\n \\\"prior_projection_seen\\\": true,\\n \\\"prior_projection_version\\\": 0,\\n \\\"refused_reason\\\": null,\\n \\\"harness_case_names\\\": [\\n \\\"eligible-erasure-records-verdict\\\",\\n \\\"unverified-requestor-refused-no-handoff\\\"\\n ]\\n },\\n \\\"handoff\\\": {\\n \\\"path\\\": \\\"downstream.data-store.append_event.subject.erasure\\\",\\n \\\"subject_id\\\": \\\"subject:customer_7001\\\",\\n \\\"data_classes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"scopes\\\": {\\n \\\"request_type\\\": \\\"erasure\\\",\\n \\\"requested_scopes\\\": [\\n \\\"profile\\\",\\n \\\"marketing_preferences\\\"\\n ],\\n \\\"downstream_operator_required\\\": true,\\n \\\"erasure_event_type\\\": \\\"subject.erasure\\\",\\n \\\"rail_effect\\\": \\\"none\\\"\\n }\\n }\\n}\\n\"},\"read-prior-decision\":{\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"raw\":\"{\\\"after_version\\\":0,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_operation_result\\\":{\\\"data\\\":{\\\"after_version\\\":0,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":0,\\\"event_digests\\\":[],\\\"last_event_ref\\\":null,\\\"last_event_type\\\":null,\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":0},\\\"projection_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}},\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":0,\\\"event_digests\\\":[],\\\"last_event_ref\\\":null,\\\"last_event_type\\\":null,\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":0},\\\"projection_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}\",\"skill_claim\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]},\"status\":\"success\",\"stderr\":\"\",\"stdout\":\"{\\\"after_version\\\":0,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_operation_result\\\":{\\\"data\\\":{\\\"after_version\\\":0,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":0,\\\"event_digests\\\":[],\\\"last_event_ref\\\":null,\\\"last_event_type\\\":null,\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":0},\\\"projection_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}},\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":0,\\\"event_digests\\\":[],\\\"last_event_ref\\\":null,\\\"last_event_type\\\":null,\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":0},\\\"projection_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}\"},\"readback\":{\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"raw\":\"{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":1,\\\"data_operation_result\\\":{\\\"data\\\":{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":1,\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":1,\\\"event_digests\\\":[\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\"],\\\"last_event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"last_event_type\\\":\\\"subject_request.verdict_recorded\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":1},\\\"projection_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}},\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":1,\\\"event_digests\\\":[\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\"],\\\"last_event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"last_event_type\\\":\\\"subject_request.verdict_recorded\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":1},\\\"projection_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}\",\"skill_claim\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]},\"status\":\"success\",\"stderr\":\"\",\"stdout\":\"{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":1,\\\"data_operation_result\\\":{\\\"data\\\":{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":1,\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":1,\\\"event_digests\\\":[\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\"],\\\"last_event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"last_event_type\\\":\\\"subject_request.verdict_recorded\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":1},\\\"projection_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}},\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":null,\\\"event_ref\\\":null,\\\"events\\\":[],\\\"idempotency_key\\\":null,\\\"operation\\\":\\\"read_projection\\\",\\\"projection\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"event_count\\\":1,\\\"event_digests\\\":[\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\"],\\\"last_event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"last_event_type\\\":\\\"subject_request.verdict_recorded\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"version\\\":1},\\\"projection_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"read\\\",\\\"stop_conditions\\\":[]}\"},\"record-verdict\":{\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"raw\":\"{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_operation_result\\\":{\\\"data\\\":{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\",\\\"event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"events\\\":[],\\\"idempotency_key\\\":\\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\\"operation\\\":\\\"append_event\\\",\\\"projection_digest\\\":\\\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"committed\\\",\\\"stop_conditions\\\":[]}},\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\",\\\"event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"events\\\":[],\\\"idempotency_key\\\":\\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\\"operation\\\":\\\"append_event\\\",\\\"projection_digest\\\":\\\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"committed\\\",\\\"stop_conditions\\\":[]}\",\"skill_claim\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]},\"status\":\"success\",\"stderr\":\"\",\"stdout\":\"{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_operation_result\\\":{\\\"data\\\":{\\\"after_version\\\":1,\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"before_version\\\":0,\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\",\\\"event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"events\\\":[],\\\"idempotency_key\\\":\\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\\"operation\\\":\\\"append_event\\\",\\\"projection_digest\\\":\\\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"committed\\\",\\\"stop_conditions\\\":[]}},\\\"data_source_ref\\\":\\\"local://runx-data-subject-request/dogfood\\\",\\\"event_digest\\\":\\\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\\\",\\\"event_ref\\\":\\\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\\\",\\\"events\\\":[],\\\"idempotency_key\\\":\\\"dsr-2026-06-30-dogfood-001:verdict:v1\\\",\\\"operation\\\":\\\"append_event\\\",\\\"projection_digest\\\":\\\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"provider_evidence\\\":{\\\"aggregate_id\\\":\\\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\\\",\\\"provider\\\":\\\"local-json-event-store\\\",\\\"resource\\\":\\\"subject_requests\\\",\\\"storage_class\\\":\\\"local-fixture\\\",\\\"store_id\\\":\\\"data-subject-request-dogfood-v1\\\"},\\\"redactions\\\":[],\\\"resource\\\":\\\"subject_requests\\\",\\\"result_digest\\\":\\\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\\\",\\\"rows\\\":[],\\\"schema\\\":\\\"runx.data.operation_result.v1\\\",\\\"status\\\":\\\"committed\\\",\\\"stop_conditions\\\":[]}\"}},\"steps\":[{\"receipt_id\":\"sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c\",\"skill\":\"tool:data.source\",\"status\":\"success\",\"step_id\":\"read-prior-decision\"},{\"receipt_id\":\"sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac\",\"skill\":\"judge\",\"status\":\"success\",\"step_id\":\"decide\"},{\"receipt_id\":\"sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b\",\"skill\":\"tool:data.source\",\"status\":\"success\",\"step_id\":\"record-verdict\"},{\"receipt_id\":\"sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63\",\"skill\":\"tool:data.source\",\"status\":\"success\",\"step_id\":\"readback\"}]}", + "structured_output": { + "graph": "data-subject-request", + "graph_status": "Succeeded", + "step_outputs": { + "decide": { + "data_subject_request_decision": { + "data": { + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "observations": { + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "prior_projection_seen": true, + "prior_projection_version": 0, + "refused_reason": null, + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + } + } + }, + "raw": "{\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"verdict_event\": {\n \"type\": \"subject_request.verdict_recorded\",\n \"payload\": {\n \"packet\": \"runx.privacy.data_subject_request.v1\",\n \"request\": {\n \"request_id\": \"dsr-2026-06-30-dogfood-001\",\n \"type\": \"erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"legal\": {\n \"jurisdiction\": \"GDPR\",\n \"lawful_basis\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"\n },\n \"requestor\": {\n \"identity_provider\": \"account-session\",\n \"verified_at\": \"2026-06-30T14:45:00Z\",\n \"assertion_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\"\n },\n \"scope_bounds\": {\n \"data_classes\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"data_store\": {\n \"aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n }\n },\n \"observations\": {\n \"lawful_basis_verdict\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\n \"jurisdiction_reason\": \"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\n \"verified_requestor_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\n \"scope_bounds\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"bounded_handoff\": \"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\n \"data_store_aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0,\n \"refused_reason\": null,\n \"harness_case_names\": [\n \"eligible-erasure-records-verdict\",\n \"unverified-requestor-refused-no-handoff\"\n ]\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n}\n", + "skill_claim": { + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "observations": { + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "prior_projection_seen": true, + "prior_projection_version": 0, + "refused_reason": null, + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + } + }, + "status": "success", + "stderr": "", + "stdout": "{\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"verdict_event\": {\n \"type\": \"subject_request.verdict_recorded\",\n \"payload\": {\n \"packet\": \"runx.privacy.data_subject_request.v1\",\n \"request\": {\n \"request_id\": \"dsr-2026-06-30-dogfood-001\",\n \"type\": \"erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"legal\": {\n \"jurisdiction\": \"GDPR\",\n \"lawful_basis\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"\n },\n \"requestor\": {\n \"identity_provider\": \"account-session\",\n \"verified_at\": \"2026-06-30T14:45:00Z\",\n \"assertion_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\"\n },\n \"scope_bounds\": {\n \"data_classes\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"data_store\": {\n \"aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n }\n },\n \"observations\": {\n \"lawful_basis_verdict\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\n \"jurisdiction_reason\": \"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\n \"verified_requestor_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\n \"scope_bounds\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"bounded_handoff\": \"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\n \"data_store_aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0,\n \"refused_reason\": null,\n \"harness_case_names\": [\n \"eligible-erasure-records-verdict\",\n \"unverified-requestor-refused-no-handoff\"\n ]\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n}\n" + }, + "read-prior-decision": { + "data_operation_result": { + "data": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_operation_result": { + "data": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}" + }, + "readback": { + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}" + }, + "record-verdict": { + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}" + } + }, + "steps": [ + { + "receipt_id": "sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c", + "skill": "tool:data.source", + "status": "success", + "step_id": "read-prior-decision" + }, + { + "receipt_id": "sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac", + "skill": "judge", + "status": "success", + "step_id": "decide" + }, + { + "receipt_id": "sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b", + "skill": "tool:data.source", + "status": "success", + "step_id": "record-verdict" + }, + { + "receipt_id": "sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63", + "skill": "tool:data.source", + "status": "success", + "step_id": "readback" + } + ] + } + }, + "payload": { + "graph": "data-subject-request", + "graph_status": "Succeeded", + "step_outputs": { + "decide": { + "data_subject_request_decision": { + "data": { + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "observations": { + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "prior_projection_seen": true, + "prior_projection_version": 0, + "refused_reason": null, + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + } + } + }, + "raw": "{\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"verdict_event\": {\n \"type\": \"subject_request.verdict_recorded\",\n \"payload\": {\n \"packet\": \"runx.privacy.data_subject_request.v1\",\n \"request\": {\n \"request_id\": \"dsr-2026-06-30-dogfood-001\",\n \"type\": \"erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"legal\": {\n \"jurisdiction\": \"GDPR\",\n \"lawful_basis\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"\n },\n \"requestor\": {\n \"identity_provider\": \"account-session\",\n \"verified_at\": \"2026-06-30T14:45:00Z\",\n \"assertion_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\"\n },\n \"scope_bounds\": {\n \"data_classes\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"data_store\": {\n \"aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n }\n },\n \"observations\": {\n \"lawful_basis_verdict\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\n \"jurisdiction_reason\": \"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\n \"verified_requestor_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\n \"scope_bounds\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"bounded_handoff\": \"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\n \"data_store_aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0,\n \"refused_reason\": null,\n \"harness_case_names\": [\n \"eligible-erasure-records-verdict\",\n \"unverified-requestor-refused-no-handoff\"\n ]\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n}\n", + "skill_claim": { + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "observations": { + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "prior_projection_seen": true, + "prior_projection_version": 0, + "refused_reason": null, + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + } + }, + "status": "success", + "stderr": "", + "stdout": "{\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"verdict_event\": {\n \"type\": \"subject_request.verdict_recorded\",\n \"payload\": {\n \"packet\": \"runx.privacy.data_subject_request.v1\",\n \"request\": {\n \"request_id\": \"dsr-2026-06-30-dogfood-001\",\n \"type\": \"erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"decision\": {\n \"eligible\": true,\n \"reason\": \"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences.\"\n },\n \"escalation\": {\n \"required\": false,\n \"lane\": \"none\",\n \"reason\": \"Requestor identity, subject match, lawful basis, and scope all pass policy.\"\n },\n \"legal\": {\n \"jurisdiction\": \"GDPR\",\n \"lawful_basis\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy.\"\n },\n \"requestor\": {\n \"identity_provider\": \"account-session\",\n \"verified_at\": \"2026-06-30T14:45:00Z\",\n \"assertion_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\"\n },\n \"scope_bounds\": {\n \"data_classes\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ]\n },\n \"data_store\": {\n \"aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n }\n },\n \"observations\": {\n \"lawful_basis_verdict\": \"GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible\",\n \"jurisdiction_reason\": \"GDPR policy supplied for request dsr-2026-06-30-dogfood-001.\",\n \"verified_requestor_ref\": \"acct-session:customer_7001:2026-06-30\",\n \"identity_assertion_digest\": \"sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c\",\n \"scope_bounds\": [\n \"profile\",\n \"support_tickets\",\n \"marketing_preferences\"\n ],\n \"bounded_handoff\": \"downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only\",\n \"data_store_aggregate_id\": \"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\n \"expected_version\": 0,\n \"idempotency_key\": \"dsr-2026-06-30-dogfood-001:verdict:v1\",\n \"prior_projection_seen\": true,\n \"prior_projection_version\": 0,\n \"refused_reason\": null,\n \"harness_case_names\": [\n \"eligible-erasure-records-verdict\",\n \"unverified-requestor-refused-no-handoff\"\n ]\n },\n \"handoff\": {\n \"path\": \"downstream.data-store.append_event.subject.erasure\",\n \"subject_id\": \"subject:customer_7001\",\n \"data_classes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"scopes\": {\n \"request_type\": \"erasure\",\n \"requested_scopes\": [\n \"profile\",\n \"marketing_preferences\"\n ],\n \"downstream_operator_required\": true,\n \"erasure_event_type\": \"subject.erasure\",\n \"rail_effect\": \"none\"\n }\n }\n}\n" + }, + "read-prior-decision": { + "data_operation_result": { + "data": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_operation_result": { + "data": { + "after_version": 0, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 0, + "event_digests": [], + "last_event_ref": null, + "last_event_type": null, + "resource": "subject_requests", + "version": 0 + }, + "projection_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":0,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":0,\"event_digests\":[],\"last_event_ref\":null,\"last_event_type\":null,\"resource\":\"subject_requests\",\"version\":0},\"projection_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:dffdb5cdd31b18a93d193050b51e5c7b490a8b27485a7f41cff4c010164c6eba\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}" + }, + "readback": { + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 1, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": null, + "event_ref": null, + "events": [], + "idempotency_key": null, + "operation": "read_projection", + "projection": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "event_count": 1, + "event_digests": [ + "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025" + ], + "last_event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "last_event_type": "subject_request.verdict_recorded", + "resource": "subject_requests", + "version": 1 + }, + "projection_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "read", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":1,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":null,\"event_ref\":null,\"events\":[],\"idempotency_key\":null,\"operation\":\"read_projection\",\"projection\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"event_count\":1,\"event_digests\":[\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\"],\"last_event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"last_event_type\":\"subject_request.verdict_recorded\",\"resource\":\"subject_requests\",\"version\":1},\"projection_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:8a9f4a5044c42396adad918e891f43392ad8ef1554e41c618407a15894398919\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"read\",\"stop_conditions\":[]}" + }, + "record-verdict": { + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + } + }, + "raw": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}", + "skill_claim": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_operation_result": { + "data": { + "after_version": 1, + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "before_version": 0, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + } + }, + "data_source_ref": "local://runx-data-subject-request/dogfood", + "event_digest": "sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025", + "event_ref": "subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1", + "events": [], + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "operation": "append_event", + "projection_digest": "sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001", + "provider": "local-json-event-store", + "provider_evidence": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "provider": "local-json-event-store", + "resource": "subject_requests", + "storage_class": "local-fixture", + "store_id": "data-subject-request-dogfood-v1" + }, + "redactions": [], + "resource": "subject_requests", + "result_digest": "sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89", + "rows": [], + "schema": "runx.data.operation_result.v1", + "status": "committed", + "stop_conditions": [] + }, + "status": "success", + "stderr": "", + "stdout": "{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_operation_result\":{\"data\":{\"after_version\":1,\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"before_version\":0,\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}},\"data_source_ref\":\"local://runx-data-subject-request/dogfood\",\"event_digest\":\"sha256:38754027ed5064cae13d86c13e881ad2e32dea38c6b548e05b9a9e27d1fb0025\",\"event_ref\":\"subject_requests:dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001:1\",\"events\":[],\"idempotency_key\":\"dsr-2026-06-30-dogfood-001:verdict:v1\",\"operation\":\"append_event\",\"projection_digest\":\"sha256:cbb823cb62041e45a22aadf1d2ea78c750e3e432eea8e05693d9ec8d71039001\",\"provider\":\"local-json-event-store\",\"provider_evidence\":{\"aggregate_id\":\"dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001\",\"provider\":\"local-json-event-store\",\"resource\":\"subject_requests\",\"storage_class\":\"local-fixture\",\"store_id\":\"data-subject-request-dogfood-v1\"},\"redactions\":[],\"resource\":\"subject_requests\",\"result_digest\":\"sha256:71e4d3f21a4c228d750dba76e5d5e02fa12da650d1488a43634f4eb787131b89\",\"rows\":[],\"schema\":\"runx.data.operation_result.v1\",\"status\":\"committed\",\"stop_conditions\":[]}" + } + }, + "steps": [ + { + "receipt_id": "sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c", + "skill": "tool:data.source", + "status": "success", + "step_id": "read-prior-decision" + }, + { + "receipt_id": "sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac", + "skill": "judge", + "status": "success", + "step_id": "decide" + }, + { + "receipt_id": "sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b", + "skill": "tool:data.source", + "status": "success", + "step_id": "record-verdict" + }, + { + "receipt_id": "sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63", + "skill": "tool:data.source", + "status": "success", + "step_id": "readback" + } + ] + }, + "receipt": { + "acts": [], + "authority": { + "actor_ref": { + "type": "principal", + "uri": "runx:principal:local_runtime" + }, + "attenuation": { + "parent_authority_ref": null, + "subset_proof": null + }, + "authority_proof_refs": [], + "enforcement": { + "profile_hash": "sha256:635fdb0a7eef93911e3c6bd0b25b5e635edba32e0259133042b3a5f1fb19394e", + "redaction_refs": [], + "setup_refs": [], + "teardown_refs": [] + }, + "grant_refs": [], + "scope_refs": [], + "terms": [] + }, + "canonicalization": "runx.receipt.c14n.v1", + "created_at": "2026-06-30T16:09:00.976Z", + "decisions": [], + "digest": "sha256:2a410f4b36903ee0687aec8a7aa990dc62c1e83c013ef607e1e16685f3f3e67b", + "id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "idempotency": { + "content_hash": "sha256:data-subject-request-graph-content", + "intent_key": "sha256:data-subject-request-graph-intent", + "trigger_fingerprint": "sha256:data-subject-request-graph-trigger" + }, + "issuer": { + "kid": "frantic-71-postpublish-fixture-key", + "public_key_sha256": "sha256:3097e2dee2cb4a34b53840cdb705aed71067c36f68db0e0f559c3f3fa043315f", + "type": "hosted" + }, + "lineage": { + "children": [ + { + "locator": "sha256:b1667752f80eb504720421d8c63766efdc44e0cc46f4467415e6337b397ebe97", + "type": "receipt", + "uri": "runx:receipt:sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c" + }, + { + "locator": "sha256:40c6b247eb1eb82c7f3d5feb5a1232042fdcf5e14fb20e45757313d2a6fa41d0", + "type": "receipt", + "uri": "runx:receipt:sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac" + }, + { + "locator": "sha256:fe91b2e6ca2e42324e7ee844263bb004ec35f9654459c889eb9f8224c4118d28", + "type": "receipt", + "uri": "runx:receipt:sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b" + }, + { + "locator": "sha256:be3f9aee10210607c5703be3f683ef27873e01046cd9098fcfe38e9cfb4c8673", + "type": "receipt", + "uri": "runx:receipt:sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63" + } + ], + "sync": [] + }, + "schema": "runx.receipt.v1", + "seal": { + "closed_at": "2026-06-30T16:09:00.976Z", + "criteria": [], + "disposition": "closed", + "last_observed_at": "2026-06-30T16:09:00.976Z", + "reason_code": "graph_closed", + "summary": "graph data-subject-request completed" + }, + "signals": [], + "signature": { + "alg": "Ed25519", + "value": "base64:-l3D8VMY8HeAtxjZYU4LdAgZRTpr834Tg_6Tux-Z1f6tE8-U1jHD46G77aMM-iUlYOWFPkzypD78F_VDC3cOAQ" + }, + "subject": { + "commitments": [], + "kind": "graph", + "ref": { + "type": "harness", + "uri": "hrn_data-subject-request_graph" + } + } + }, + "receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "registry_provenance": { + "digest": "sha256:ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "profile_digest": "sha256:d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "registry_key_id": "runx-registry-ed25519-v1", + "registry_source": "remote https://api.runx.ai", + "registry_source_fingerprint": "ba1ac16b631195fd", + "skill_id": "fengyangxxx/data-subject-request", + "trust_state": "trusted", + "trust_tier": "community", + "version": "sha-5e61052d6ca5" + }, + "run_id": "run_decide_f82eeefce86f", + "schema": "runx.skill_run.v1", + "skill_name": "data-subject-request", + "status": "sealed" +} diff --git a/skills/data-subject-request/artifacts/postpublish-dogfood-verify-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/postpublish-dogfood-verify-runx-0.6.14-linux.json new file mode 100644 index 00000000..a7b17fcc --- /dev/null +++ b/skills/data-subject-request/artifacts/postpublish-dogfood-verify-runx-0.6.14-linux.json @@ -0,0 +1,15 @@ +{ + "receipt_dir": "/repo/.runx-test-receipts-data-subject-request-dogfood-postpublish-fixture", + "signature_mode": "production", + "trees": [ + { + "root_receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "receipt_count": 5, + "parent_missing": null, + "valid": true, + "findings": [] + } + ], + "unreadable_files": [], + "valid": true +} diff --git a/skills/data-subject-request/artifacts/registry-publish-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/registry-publish-runx-0.6.14-linux.json new file mode 100644 index 00000000..085e0945 --- /dev/null +++ b/skills/data-subject-request/artifacts/registry-publish-runx-0.6.14-linux.json @@ -0,0 +1,20 @@ +{ + "status": "success", + "registry": { + "action": "publish", + "publish": { + "target": "hosted", + "status": "published", + "skill_id": "fengyangxxx/data-subject-request", + "owner": "fengyangxxx", + "name": "data-subject-request", + "version": "sha-5e61052d6ca5", + "digest": "ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "profile_digest": "d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "trust_tier": "community", + "install_command": "runx add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", + "run_command": "runx skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", + "public_url": "https://runx.ai/x/fengyangxxx/data-subject-request" + } + } +} diff --git a/skills/data-subject-request/artifacts/registry-read-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/registry-read-runx-0.6.14-linux.json new file mode 100644 index 00000000..de424b25 --- /dev/null +++ b/skills/data-subject-request/artifacts/registry-read-runx-0.6.14-linux.json @@ -0,0 +1,51 @@ +{ + "status": "success", + "registry": { + "action": "read", + "source": "remote", + "ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "skill": { + "skill_id": "fengyangxxx/data-subject-request", + "owner": "fengyangxxx", + "name": "data-subject-request", + "description": "Judge a data subject request, record the sealed verdict in data-store, and emit only a bounded handoff for downstream erasure or export.", + "category": "ops", + "version": "sha-5e61052d6ca5", + "digest": "ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "markdown": "---\nname: data-subject-request\ndescription: Judge a data subject request, record the sealed verdict in data-store, and emit only a bounded handoff for downstream erasure or export.\nrunx:\n category: privacy\n---\n\n# Data Subject Request\n\nJudge whether a data subject request is in policy without erasing, exporting, or\nsending any data. The skill reads a request packet, requestor proof, policy\nbounds, and prior request state. It emits one typed verdict, records that verdict\nthrough `data-store`, and returns a bounded handoff that a separate governed\noperator run may consume.\n\nThis is not a legal authority and does not replace counsel. It is an execution\nboundary for policy evidence: the receipt proves which inputs were inspected,\nwhich lawful basis was named, which scope was allowed or refused, and which\ndurable verdict was appended.\n\n## Inputs\n\n- `request_packet`: `type`, `subject_id`, and `scope`. Scope must include the\n request id, requested data classes, and requested scopes.\n- `requestor_proof`: `identity_provider`, `verified_at`, and `assertion`. The\n assertion must bind the requestor to the same subject and carry a stable proof\n reference or digest.\n- `policy`: `jurisdiction`, `trusted_identity_providers`, `lawful_bases`, and\n `scope_bounds`. The trusted provider list is required evidence for accepting\n the proof issuer.\n- `data_source_ref` and `store_id`: the pinned data-store binding used for the\n subject request event stream.\n- `aggregate_id`, `expected_version`, and `idempotency_key`: the subject request\n entity, optimistic concurrency version, and retry-safe verdict write key.\n\n## Verdict Contract\n\nThe output is `runx.privacy.data_subject_request.v1` data:\n\n- `decision{eligible,reason}` always appears.\n- `handoff{path,subject_id,data_classes,scopes}` appears only when eligible.\n- `escalation` explains whether a human lane is required.\n- `verdict_event` is the exact deterministic event recorded by\n `data-store.append_event`.\n- `observations` name the lawful-basis verdict, jurisdiction reason, verified\n requestor reference, identity assertion digest, scope bounds, bounded handoff,\n `aggregate_id`, `expected_version`, and `idempotency_key`.\n\nThe packet must not contain an `operational_proposal` envelope. A downstream\ndriver may issue a separate governed run by name, but this skill does not fire\nthat rail.\n\n## State Model\n\nState is durable in `registry:runx/data-store@0.1.2`. The graph uses the\ngithub-sync-style shape:\n\n1. `read_projection` loads any prior decision for the subject request entity.\n2. `data-subject-request-decide` judges identity, scope, and lawful basis.\n3. `append_event` records the verdict with `expected_version` and\n `idempotency_key`.\n4. `read_projection` reads back the durable state for receipt evidence.\n\nThe aggregate id is the subject request entity, not a tenant-wide stream. The\nappend is an ungated CAS write that records the decision itself; consequences\nremain downstream.\n\n## Consequence Boundary\n\nEligible erasure returns a handoff such as\n`downstream.data-store.append_event.subject.erasure`. A downstream operator must\nissue a separate governed `data-store.append_event` run that appends a\n`subject.erasure` tombstone. Erasure is event-sourced; there is no delete\noperation in this skill.\n\nEligible export returns a handoff to a separate read path. A downstream operator\nmust run `read_projection`, `redact-pii`, and `send-as` under explicit approval.\nThis skill does not read raw content, redact content, or deliver content.\n\nAmbiguous identity, missing proof, untrusted identity providers, scope disputes,\nor data classes outside `policy.scope_bounds` escalate to a human lane or block\nas `needs_agent`. The skill must refuse to invent an identity, lawful basis, or\nscope that is not grounded in the inputs.\n\n## Local Harness\n\nRun:\n\n```bash\nrunx harness ./skills/data-subject-request --json\n```\n\nThe inline harness has two cases:\n\n- `eligible-erasure-records-verdict`: a verified GDPR erasure request for\n `profile` and `support_tickets` seals, emits a bounded erasure handoff, and\n records the verdict via `data-store.append_event`.\n- `unverified-requestor-refused-no-handoff`: an unsigned email proof and an\n out-of-scope `payment_methods` export request seal a deterministic refusal\n naming the jurisdiction and lawful-basis/scope grounds, with no handoff.\n\n## Example Invocation\n\n```bash\nrunx skill data-subject-request --json \\\n --input-json request_packet='{\"type\":\"erasure\",\"subject_id\":\"subject:customer_4242\",\"scope\":{\"request_id\":\"dsr-2026-06-30-001\",\"data_classes\":[\"profile\",\"support_tickets\"],\"requested_scopes\":[\"profile\",\"support_tickets\"]}}' \\\n --input-json requestor_proof='{\"identity_provider\":\"account-session\",\"verified_at\":\"2026-06-30T14:20:00Z\",\"assertion\":{\"subject_id\":\"subject:customer_4242\",\"assertion_ref\":\"acct-session:customer_4242:2026-06-30\",\"assertion_digest\":\"sha256:9d64a60e8d0c8080e88f9472c0e0ffdfad9424c2e42eb570c0f46ff3e4e73116\"}}' \\\n --input-json policy='{\"jurisdiction\":\"GDPR\",\"trusted_identity_providers\":[\"account-session\"],\"lawful_bases\":{\"erasure\":\"GDPR Article 17 erasure after withdrawn consent\"},\"scope_bounds\":{\"data_classes\":[\"profile\",\"support_tickets\"],\"erasure_allowed\":[\"profile\",\"support_tickets\"],\"export_allowed\":[\"profile\",\"support_tickets\"]}}' \\\n -i data_source_ref=local://runx-data-subject-request/harness \\\n -i store_id=data-subject-request-harness-v1 \\\n -i aggregate_id=dsr:subject:customer_4242:request:dsr-2026-06-30-001 \\\n --input-json expected_version=0 \\\n -i idempotency_key=dsr-2026-06-30-001:verdict:v1\n```\n\nThe runner computes only bounded policy checks from the supplied packet. If it\ncannot prove identity, scope, and lawful basis from those inputs, the correct\nresult is a sealed refusal or human escalation, not a guessed verdict.", + "profile_digest": "d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "runner_names": [ + "decide", + "judge" + ], + "source_type": "agent", + "trust_tier": "community", + "required_scopes": [], + "tags": [], + "publisher": { + "kind": "user", + "id": "user_69446dfb22822d5fdc22562d", + "handle": "fengyangxxx", + "display_name": "fy" + }, + "attestations": [ + { + "kind": "publisher", + "id": "publisher:user_69446dfb22822d5fdc22562d", + "status": "declared", + "summary": "fy", + "issued_at": "2026-06-30T16:01:25.215Z", + "metadata": { + "publisher_display_name": "fy", + "publisher_handle": "fengyangxxx", + "publisher_id": "user_69446dfb22822d5fdc22562d", + "publisher_kind": "user", + "trust_tier": "community" + } + } + ], + "install_command": "runx add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", + "run_command": "runx skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai" + } + } +} diff --git a/skills/data-subject-request/artifacts/remote-skill-inspect-runx-0.6.14-linux.json b/skills/data-subject-request/artifacts/remote-skill-inspect-runx-0.6.14-linux.json new file mode 100644 index 00000000..59743a74 --- /dev/null +++ b/skills/data-subject-request/artifacts/remote-skill-inspect-runx-0.6.14-linux.json @@ -0,0 +1,23 @@ +{ + "description": "Judge a data subject request, record the sealed verdict in data-store, and emit only a bounded handoff for downstream erasure or export.", + "name": "data-subject-request", + "registry_provenance": { + "digest": "sha256:ad2cfa0cd1b8f2bb0e2c2ae6e397df24d4c9d74675316e03a276da60b4b74c77", + "profile_digest": "sha256:d9c6a8b8dcd974de6f922a8288f73843cb7b5bda6778adfdfe8ab2867012e581", + "registry_key_id": "runx-registry-ed25519-v1", + "registry_source": "remote https://api.runx.ai", + "registry_source_fingerprint": "ba1ac16b631195fd", + "skill_id": "fengyangxxx/data-subject-request", + "trust_state": "trusted", + "trust_tier": "community", + "version": "sha-5e61052d6ca5" + }, + "runners": [ + "decide", + "judge" + ], + "schema": "runx.skill.inspect.v1", + "skill_path": "/root/.runx/registry-skills/ba1ac16b631195fd/fengyangxxx/data-subject-request/sha-5e61052d6ca5/b5e60333c769f1d8/fengyangxxx/data-subject-request/sha-5e61052d6ca5", + "status": "ok", + "version": "0.1.0" +} diff --git a/skills/data-subject-request/artifacts/report.md b/skills/data-subject-request/artifacts/report.md new file mode 100644 index 00000000..fa7cb299 --- /dev/null +++ b/skills/data-subject-request/artifacts/report.md @@ -0,0 +1,62 @@ +# data-subject-request Frantic #71 Report + +Status: ready for independent QA; not submitted to Frantic. + +## Package + +- Owner/package/version: `fengyangxxx/data-subject-request@sha-5e61052d6ca5`. +- Public registry page: https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5 (canonical listing also resolves at https://runx.ai/x/fengyangxxx/data-subject-request). +- PR: https://github.com/runxhq/runx/pull/192. +- Source used for publish: https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request. +- Raw package files for review: https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml and https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md. + +## What the skill does + +- Reads a typed data subject request packet, requestor proof, jurisdiction policy, and pinned data-store binding. +- Loads prior request state with `read_projection`, deterministically judges identity/scope/lawful basis, records `subject_request.verdict_recorded` with `append_event`, then reads back the projection for receipt evidence. +- Emits `decision{eligible,reason}`, `escalation`, and only when eligible a bounded `handoff{path,subject_id,data_classes,scopes}`. It emits no `operational_proposal` and fires no erasure/export rail itself. +- Eligible erasure handoff is only data for a downstream governed `data-store.append_event` run that appends a `subject.erasure` tombstone. Eligible export is only a downstream `read_projection + redact-pii + send-as` path under explicit approval. +- Refuses untrusted identity providers, missing requestor proof, data classes outside `policy.scope_bounds`, and any invented identity or lawful basis. + +## Commands and evidence + +- `runx --version`: `runx-cli 0.6.14`. +- Publish: `npx -y @runxhq/cli@0.6.14 registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml --json` -> `success`, published version `sha-5e61052d6ca5`. +- Registry read: `runx registry read fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json` -> `success`. +- Clean install: `npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json` -> `success`, runners `decide, judge`. +- Local harness: `runx harness ./skills/data-subject-request --json` -> `passed`, 2 cases, receipts sha256:1104ce5cb414b391b03f68dc3a0a14e3237ba9f9d934fa7f65a5963f63f6923d, sha256:7475dfb674888c6cde3538e4ea8c80c300df097b25a351aac47f0b4c13a4497d. +- Post-publish dogfood: `npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=` -> `sealed`, receipt `sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8`. +- Verify: `npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json` -> `valid=true`, signature mode `production`, receipt count 5. +- Remote inspect: `runx skill inspect fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json` -> `ok`. +- Doctor: `runx doctor --json` -> `success` with 0 errors; warnings are pre-existing unrelated package warnings and none are data-subject-request diagnostics. + +## Dogfood result + +- Decision: `{"eligible":true,"reason":"GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences."}`. +- Handoff: `{"data_classes":["profile","marketing_preferences"],"path":"downstream.data-store.append_event.subject.erasure","scopes":{"downstream_operator_required":true,"erasure_event_type":"subject.erasure","rail_effect":"none","request_type":"erasure","requested_scopes":["profile","marketing_preferences"]},"subject_id":"subject:customer_7001"}`. +- Verdict event: `subject_request.verdict_recorded`, aggregate `dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001`, expected_version `0`, idempotency_key `dsr-2026-06-30-dogfood-001:verdict:v1`. +- Lawful basis and jurisdiction: `GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible`; `GDPR policy supplied for request dsr-2026-06-30-dogfood-001.`. +- Verified requestor: `acct-session:customer_7001:2026-06-30`; assertion digest `sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c`. +- Scope bounds: `profile, support_tickets, marketing_preferences`; bounded handoff `downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only`. + +## Harness cases + +- `eligible-erasure-records-verdict`: sealed; eligible GDPR erasure request records verdict and emits bounded handoff. +- `unverified-requestor-refused-no-handoff`: policy_denied/refused; unsigned email proof and out-of-bounds `payment_methods` scope produce no handoff. + +## New user flow + +1. Install with `runx add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai`. +2. Run with `runx skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json` and the typed request_packet/requestor_proof/policy/data-store inputs. +3. Verify the dogfood receipt with `npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json` using the recorded receipt directory or equivalent trusted receipt source. + +## Operator value + +- The skill turns a high-risk legal/process judgment into a sealed, replayable policy decision with durable event-sourced state. +- It makes the dangerous consequence explicit by not erasing/exporting data; it returns a bounded handoff for a separately governed operator run. +- Receipts preserve the identity proof reference, assertion digest, lawful basis, scope bounds, aggregate id, CAS version, idempotency key, and final verdict. + +## Known regression coverage + +- Prior #71 auto-review complained that `evidence_json.dogfood.command` was missing; this packet includes the exact dogfood command in `evidence_json.dogfood.command`. +- Prior #71 auto-review complained about receipt verification; this packet includes `postpublish-dogfood-verify-runx-0.6.14-linux.json` with `valid=true` for `sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8`. diff --git a/skills/data-subject-request/artifacts/runx-version-0.6.14-linux.txt b/skills/data-subject-request/artifacts/runx-version-0.6.14-linux.txt new file mode 100644 index 00000000..9edad5f0 --- /dev/null +++ b/skills/data-subject-request/artifacts/runx-version-0.6.14-linux.txt @@ -0,0 +1 @@ +runx-cli 0.6.14 diff --git a/skills/data-subject-request/artifacts/verification.json b/skills/data-subject-request/artifacts/verification.json new file mode 100644 index 00000000..e150e26c --- /dev/null +++ b/skills/data-subject-request/artifacts/verification.json @@ -0,0 +1,214 @@ +{ + "schema": "frantic.runx.data_subject_request.verification.v1", + "status": "ready_for_qa_not_submitted", + "generated_at": "2026-06-30T16:20:37.121Z", + "package": { + "owner": "fengyangxxx", + "name": "data-subject-request", + "version": "sha-5e61052d6ca5", + "registry_ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5" + }, + "checks": { + "runx_version_0_6_14_or_newer": true, + "package_name_exact": true, + "publisher_owner_exact": true, + "registry_publish_success": true, + "registry_read_success": true, + "remote_inspect_success": true, + "clean_install_success": true, + "local_harness_passed": true, + "hosted_harness_passed_by_publish": true, + "postpublish_dogfood_sealed": true, + "dogfood_receipt_is_postpublish_registry_ref": true, + "dogfood_command_present": true, + "dogfood_verify_valid": true, + "evidence_observations_include_required_fields": true, + "no_operational_proposal_in_dogfood_output": true, + "doctor_success": true, + "min_evidence_items_6": true, + "no_tokens_or_secrets_in_public_artifacts_known": true, + "final_qa_pass_required": true + }, + "artifact_files": [ + "skills/data-subject-request/artifacts/runx-version-0.6.14-linux.txt", + "skills/data-subject-request/artifacts/registry-publish-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/registry-read-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/install-add-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/local-harness-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/postpublish-dogfood-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/postpublish-dogfood-verify-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/remote-skill-inspect-runx-0.6.14-linux.json", + "skills/data-subject-request/artifacts/doctor-local-source.json" + ], + "delivery_fields_expected_after_final_commit": [ + "public_url", + "source_url", + "pr_url", + "x_yaml", + "skill_md", + "evidence_json", + "verification_json", + "receipt_ref", + "report" + ], + "receipt_ref": "runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "dogfood": { + "package": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "input": "skills/data-subject-request/fixtures/dogfood-erasure-input.json", + "command": "npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=", + "status": "sealed", + "receipt_ref": "runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "receipt_artifact": "skills/data-subject-request/artifacts/postpublish-dogfood-root-receipt-runx-0.6.14-linux.json", + "verify_command": "npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json", + "verify_verdict": { + "valid": true, + "signature_mode": "production", + "root_receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "receipt_count": 5, + "findings": [] + }, + "harness_cases": [ + { + "name": "eligible-erasure-records-verdict", + "status": "sealed", + "receipt_id": "sha256:1104ce5cb414b391b03f68dc3a0a14e3237ba9f9d934fa7f65a5963f63f6923d", + "expected": "decision.eligible true; bounded erasure handoff emitted; subject_request.verdict_recorded appended" + }, + { + "name": "unverified-requestor-refused-no-handoff", + "status": "refused_policy_denied", + "receipt_id": "sha256:7475dfb674888c6cde3538e4ea8c80c300df097b25a351aac47f0b4c13a4497d", + "expected": "unverified requestor and out-of-bounds payment_methods scope refused with no handoff; readback guard blocks closed graph" + } + ], + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "verdict_event": { + "payload": { + "data_store": { + "aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "prior_projection_seen": true, + "prior_projection_version": 0 + }, + "decision": { + "eligible": true, + "reason": "GDPR erasure request is eligible: verified account-session proof matches subject:customer_7001, lawful basis is supplied, and scope is bounded to profile, marketing_preferences." + }, + "escalation": { + "lane": "none", + "reason": "Requestor identity, subject match, lawful basis, and scope all pass policy.", + "required": false + }, + "handoff": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "path": "downstream.data-store.append_event.subject.erasure", + "scopes": { + "downstream_operator_required": true, + "erasure_event_type": "subject.erasure", + "rail_effect": "none", + "request_type": "erasure", + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + }, + "subject_id": "subject:customer_7001" + }, + "legal": { + "jurisdiction": "GDPR", + "lawful_basis": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy." + }, + "packet": "runx.privacy.data_subject_request.v1", + "request": { + "data_classes": [ + "profile", + "marketing_preferences" + ], + "request_id": "dsr-2026-06-30-dogfood-001", + "requested_scopes": [ + "profile", + "marketing_preferences" + ], + "subject_id": "subject:customer_7001", + "type": "erasure" + }, + "requestor": { + "assertion_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "identity_provider": "account-session", + "verified_at": "2026-06-30T14:45:00Z" + }, + "scope_bounds": { + "data_classes": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "requested_scopes": [ + "profile", + "marketing_preferences" + ] + } + }, + "type": "subject_request.verdict_recorded" + }, + "graph_status": "Succeeded", + "step_receipts": [ + { + "receipt_id": "sha256:0c0262bfc708d71e691155b2a24fd46d150ce115a7cd9569438d5f58e1c3488c", + "status": "success" + }, + { + "receipt_id": "sha256:d591a480077c983ee921ad60d9d344baac10afd4efb4e65fff7756ab3c657bac", + "status": "success" + }, + { + "receipt_id": "sha256:247ff818e44779bdce5eeeb6608e62f9940c4e2fa181707b69e7312db3fac42b", + "status": "success" + }, + { + "receipt_id": "sha256:e344ac5edce02a6d8329ad3171b8011be6221c57109cd87543b6621ebd5aea63", + "status": "success" + } + ] + }, + "prior_review_regression": [ + { + "prior_issue": "Earlier worker delivery missed evidence_json.dogfood.command", + "new_evidence": "dogfood.command is present in this evidence_json and commands.md with the post-publish runx skill command", + "status": "addressed" + }, + { + "prior_issue": "Earlier worker delivery had unverifiable receipt evidence", + "new_evidence": "postpublish-dogfood-verify-runx-0.6.14-linux.json shows valid=true for the submitted receipt id", + "status": "addressed" + } + ] +} From cb615a4515d95b65fb1531187c2b3c32dbb3adcb Mon Sep 17 00:00:00 2001 From: fengyangxxx <356261005@qq.com> Date: Wed, 1 Jul 2026 00:27:55 +0800 Subject: [PATCH 3/4] Fix data subject evidence contract --- .../artifacts/evidence.json | 236 ++++++++++++++---- .../artifacts/verification.json | 3 +- 2 files changed, 195 insertions(+), 44 deletions(-) diff --git a/skills/data-subject-request/artifacts/evidence.json b/skills/data-subject-request/artifacts/evidence.json index 31060c0a..eb7014fd 100644 --- a/skills/data-subject-request/artifacts/evidence.json +++ b/skills/data-subject-request/artifacts/evidence.json @@ -237,49 +237,155 @@ } ] }, - "observations": { - "runx_version_output": "runx-cli 0.6.14", - "publisher_owner": "fengyangxxx", - "package_name": "data-subject-request", - "package_version": "sha-5e61052d6ca5", - "registry_ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", - "public_url": "https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5", - "pr_url": "https://github.com/runxhq/runx/pull/192", - "source_url": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", - "raw_x_yaml": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", - "raw_skill_md": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", - "verification_json": "skills/data-subject-request/artifacts/verification.json", - "publish_method": "runx registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml", - "install_command": "npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json", - "hosted_harness_status": "registry publish returned status=success and publish.status=published after hosted validation; earlier hosted harness failure was fixed before this publish artifact", - "dogfood_command": "npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=", - "receipt_ref": "runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", - "runx_verify_verdict": "valid=true", - "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", - "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", - "verified_requestor_ref": "acct-session:customer_7001:2026-06-30", - "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", - "scope_bounds": [ - "profile", - "support_tickets", - "marketing_preferences" - ], - "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", - "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", - "expected_version": 0, - "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", - "refused_reason": "Harness case unverified-requestor-refused-no-handoff is expected policy_denied: untrusted unsigned-email provider plus payment_methods outside CCPA scope_bounds, with no handoff.", - "harness_case_names": [ - "eligible-erasure-records-verdict", - "unverified-requestor-refused-no-handoff" - ], - "receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", - "new_user_instructions": [ - "runx add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", - "runx skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json ...", - "npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json" - ] - }, + "observations": [ + { + "name": "runx_version_output", + "value": "runx-cli 0.6.14", + "evidence_ref": "skills/data-subject-request/artifacts/runx-version-0.6.14-linux.txt" + }, + { + "name": "publisher_owner", + "value": "fengyangxxx", + "evidence_ref": "registry-publish-runx-0.6.14-linux.json" + }, + { + "name": "package_name", + "value": "data-subject-request", + "evidence_ref": "registry-publish-runx-0.6.14-linux.json" + }, + { + "name": "package_version", + "value": "sha-5e61052d6ca5", + "evidence_ref": "registry-publish-runx-0.6.14-linux.json" + }, + { + "name": "registry_ref", + "value": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "evidence_ref": "registry-read-runx-0.6.14-linux.json" + }, + { + "name": "public_url", + "value": "https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "evidence_ref": "registry-publish-runx-0.6.14-linux.json" + }, + { + "name": "pr_url", + "value": "https://github.com/runxhq/runx/pull/192", + "evidence_ref": "GitHub PR #192" + }, + { + "name": "source_url", + "value": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", + "evidence_ref": "GitHub fork tree" + }, + { + "name": "raw_x_yaml", + "value": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", + "evidence_ref": "raw.githubusercontent.com" + }, + { + "name": "raw_skill_md", + "value": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", + "evidence_ref": "raw.githubusercontent.com" + }, + { + "name": "publish_method", + "value": "runx registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml", + "evidence_ref": "commands.md" + }, + { + "name": "install_command", + "value": "npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json", + "evidence_ref": "install-add-runx-0.6.14-linux.json" + }, + { + "name": "hosted_harness_status", + "value": "registry publish returned status=success and publish.status=published after hosted validation; earlier hosted harness failure was fixed before this publish artifact", + "evidence_ref": "registry-publish-runx-0.6.14-linux.json" + }, + { + "name": "dogfood_command", + "value": "npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=", + "evidence_ref": "evidence_json.dogfood.command" + }, + { + "name": "receipt_ref", + "value": "runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json" + }, + { + "name": "runx_verify_verdict", + "value": "valid=true", + "evidence_ref": "postpublish-dogfood-verify-runx-0.6.14-linux.json" + }, + { + "name": "lawful_basis_verdict", + "value": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "jurisdiction_reason", + "value": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "verified_requestor_ref", + "value": "acct-session:customer_7001:2026-06-30", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "identity_assertion_digest", + "value": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "scope_bounds", + "value": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "bounded_handoff", + "value": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "data_store_aggregate_id", + "value": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "expected_version", + "value": 0, + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "idempotency_key", + "value": "dsr-2026-06-30-dogfood-001:verdict:v1", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json structured_output" + }, + { + "name": "refused_reason", + "value": "Harness case unverified-requestor-refused-no-handoff is expected policy_denied: untrusted unsigned-email provider plus payment_methods outside CCPA scope_bounds, with no handoff.", + "evidence_ref": "X.yaml harness case unverified-requestor-refused-no-handoff" + }, + { + "name": "harness_case_names", + "value": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "evidence_ref": "local-harness-runx-0.6.14-linux.json" + }, + { + "name": "receipt_id", + "value": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "evidence_ref": "postpublish-dogfood-runx-0.6.14-linux.json" + } + ], "checks": { "local_harness": { "status": "passed", @@ -383,5 +489,49 @@ "not_submitted": true, "qa_required_before_submit": true, "exact_payload_must_be_recomputed_after_final_commit": true + }, + "summary": "Published runx data-subject-request skill evidence for Frantic #71: runx-cli 0.6.14 publish/install/local harness/hosted publish/post-publish dogfood/receipt verify all recorded with immutable PR artifacts and no Frantic delivery submitted before QA.", + "observation_details": { + "runx_version_output": "runx-cli 0.6.14", + "publisher_owner": "fengyangxxx", + "package_name": "data-subject-request", + "package_version": "sha-5e61052d6ca5", + "registry_ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "public_url": "https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5", + "pr_url": "https://github.com/runxhq/runx/pull/192", + "source_url": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", + "raw_x_yaml": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", + "raw_skill_md": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", + "verification_json": "skills/data-subject-request/artifacts/verification.json", + "publish_method": "runx registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml", + "install_command": "npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json", + "hosted_harness_status": "registry publish returned status=success and publish.status=published after hosted validation; earlier hosted harness failure was fixed before this publish artifact", + "dogfood_command": "npx -y @runxhq/cli@0.6.14 skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json -R .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --input-json request_packet= --input-json requestor_proof= --input-json policy= -i data_source_ref= -i store_id= -i aggregate_id= -i idempotency_key= --input-json expected_version=", + "receipt_ref": "runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "runx_verify_verdict": "valid=true", + "lawful_basis_verdict": "GDPR Article 17 erasure after withdrawn consent, with retention exceptions screened by policy. => eligible", + "jurisdiction_reason": "GDPR policy supplied for request dsr-2026-06-30-dogfood-001.", + "verified_requestor_ref": "acct-session:customer_7001:2026-06-30", + "identity_assertion_digest": "sha256:6f41f68e5636f1b542f47370f214d1f58870d7bc4b8a8c922fc8ab9601aa3f3c", + "scope_bounds": [ + "profile", + "support_tickets", + "marketing_preferences" + ], + "bounded_handoff": "downstream.data-store.append_event.subject.erasure for profile, marketing_preferences only", + "data_store_aggregate_id": "dsr:subject:customer_7001:request:dsr-2026-06-30-dogfood-001", + "expected_version": 0, + "idempotency_key": "dsr-2026-06-30-dogfood-001:verdict:v1", + "refused_reason": "Harness case unverified-requestor-refused-no-handoff is expected policy_denied: untrusted unsigned-email provider plus payment_methods outside CCPA scope_bounds, with no handoff.", + "harness_case_names": [ + "eligible-erasure-records-verdict", + "unverified-requestor-refused-no-handoff" + ], + "receipt_id": "sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8", + "new_user_instructions": [ + "runx add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai", + "runx skill fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --json ...", + "npx -y @runxhq/cli@0.6.14 verify sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 --receipt-dir .runx-test-receipts-data-subject-request-dogfood-postpublish-fixture --json" + ] } } diff --git a/skills/data-subject-request/artifacts/verification.json b/skills/data-subject-request/artifacts/verification.json index e150e26c..4c9d1f86 100644 --- a/skills/data-subject-request/artifacts/verification.json +++ b/skills/data-subject-request/artifacts/verification.json @@ -210,5 +210,6 @@ "new_evidence": "postpublish-dogfood-verify-runx-0.6.14-linux.json shows valid=true for the submitted receipt id", "status": "addressed" } - ] + ], + "summary": "Verification packet for Frantic #71 data-subject-request: validates exact package name/version, registry publish/read, clean install, local harness, hosted publish, post-publish dogfood receipt, runx verify, CI evidence and final-QA requirement." } From f6f7e0b4aaab880e722d57d5c36ea95a01089021 Mon Sep 17 00:00:00 2001 From: fengyangxxx <356261005@qq.com> Date: Wed, 1 Jul 2026 00:41:11 +0800 Subject: [PATCH 4/4] Clarify final payload source references --- .../artifacts/commands.md | 1 + .../artifacts/evidence.json | 22 +++++++++---------- .../data-subject-request/artifacts/report.md | 4 ++-- .../artifacts/verification.json | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/skills/data-subject-request/artifacts/commands.md b/skills/data-subject-request/artifacts/commands.md index 051f305d..75fd4187 100644 --- a/skills/data-subject-request/artifacts/commands.md +++ b/skills/data-subject-request/artifacts/commands.md @@ -1,6 +1,7 @@ # data-subject-request Frantic #71 evidence commands Final package: fengyangxxx/data-subject-request@sha-5e61052d6ca5 +Final source/raw URLs: use the exact immutable artifact_refs in the QA-reviewed Frantic payload. PR: https://github.com/runxhq/runx/pull/192 Receipt: runx:receipt:sha256:261771ae3340aa2439a152f1138b0bbd662fa177fea6da44bd07a6b1505bfde8 diff --git a/skills/data-subject-request/artifacts/evidence.json b/skills/data-subject-request/artifacts/evidence.json index eb7014fd..c8c9bb3c 100644 --- a/skills/data-subject-request/artifacts/evidence.json +++ b/skills/data-subject-request/artifacts/evidence.json @@ -61,11 +61,11 @@ }, "source": { "pr_url": "https://github.com/runxhq/runx/pull/192", - "source_url": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", - "commit_used_for_publish": "f9675dfe46709886ea009f2245145bb87f21b359", + "source_url": "exact immutable source_url delivery field for the final PR head commit", + "commit_used_for_publish": "final delivery PR head commit; see exact source_url/x_yaml/skill_md artifact_refs reviewed by QA", "branch": "fy/frantic-71-data-subject-request", - "x_yaml": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", - "skill_md": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", + "x_yaml": "exact immutable x_yaml delivery field for the final PR head commit", + "skill_md": "exact immutable skill_md delivery field for the final PR head commit", "package_paths": [ "skills/data-subject-request/X.yaml", "skills/data-subject-request/SKILL.md", @@ -275,17 +275,17 @@ }, { "name": "source_url", - "value": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", + "value": "exact immutable source_url delivery field for the final PR head commit", "evidence_ref": "GitHub fork tree" }, { "name": "raw_x_yaml", - "value": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", + "value": "exact immutable x_yaml delivery field for the final PR head commit", "evidence_ref": "raw.githubusercontent.com" }, { "name": "raw_skill_md", - "value": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", + "value": "exact immutable skill_md delivery field for the final PR head commit", "evidence_ref": "raw.githubusercontent.com" }, { @@ -490,7 +490,7 @@ "qa_required_before_submit": true, "exact_payload_must_be_recomputed_after_final_commit": true }, - "summary": "Published runx data-subject-request skill evidence for Frantic #71: runx-cli 0.6.14 publish/install/local harness/hosted publish/post-publish dogfood/receipt verify all recorded with immutable PR artifacts and no Frantic delivery submitted before QA.", + "summary": "Published runx data-subject-request skill evidence for Frantic #71: runx-cli 0.6.14 publish/install/local harness/hosted publish/post-publish dogfood/receipt verify are recorded, while final source_url/x_yaml/skill_md are the exact immutable delivery artifact fields reviewed by QA.", "observation_details": { "runx_version_output": "runx-cli 0.6.14", "publisher_owner": "fengyangxxx", @@ -499,9 +499,9 @@ "registry_ref": "fengyangxxx/data-subject-request@sha-5e61052d6ca5", "public_url": "https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5", "pr_url": "https://github.com/runxhq/runx/pull/192", - "source_url": "https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request", - "raw_x_yaml": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml", - "raw_skill_md": "https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md", + "source_url": "exact immutable source_url delivery field for the final PR head commit", + "raw_x_yaml": "exact immutable x_yaml delivery field for the final PR head commit", + "raw_skill_md": "exact immutable skill_md delivery field for the final PR head commit", "verification_json": "skills/data-subject-request/artifacts/verification.json", "publish_method": "runx registry publish ./skills/data-subject-request/SKILL.md --registry https://api.runx.ai --profile ./skills/data-subject-request/X.yaml", "install_command": "npx -y @runxhq/cli@0.6.14 add fengyangxxx/data-subject-request@sha-5e61052d6ca5 --registry https://api.runx.ai --to /tmp/runx-clean --json", diff --git a/skills/data-subject-request/artifacts/report.md b/skills/data-subject-request/artifacts/report.md index fa7cb299..2396f967 100644 --- a/skills/data-subject-request/artifacts/report.md +++ b/skills/data-subject-request/artifacts/report.md @@ -7,8 +7,8 @@ Status: ready for independent QA; not submitted to Frantic. - Owner/package/version: `fengyangxxx/data-subject-request@sha-5e61052d6ca5`. - Public registry page: https://runx.ai/x/fengyangxxx/data-subject-request@sha-5e61052d6ca5 (canonical listing also resolves at https://runx.ai/x/fengyangxxx/data-subject-request). - PR: https://github.com/runxhq/runx/pull/192. -- Source used for publish: https://github.com/fengyangxxx/runx/tree/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request. -- Raw package files for review: https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/X.yaml and https://raw.githubusercontent.com/fengyangxxx/runx/f9675dfe46709886ea009f2245145bb87f21b359/skills/data-subject-request/SKILL.md. +- Source/provenance: the exact immutable `source_url` delivery field for the final PR head commit reviewed by QA. +- Raw package files for review: the exact immutable `x_yaml` and `skill_md` delivery fields for the final PR head commit reviewed by QA. ## What the skill does diff --git a/skills/data-subject-request/artifacts/verification.json b/skills/data-subject-request/artifacts/verification.json index 4c9d1f86..3fe5f730 100644 --- a/skills/data-subject-request/artifacts/verification.json +++ b/skills/data-subject-request/artifacts/verification.json @@ -211,5 +211,5 @@ "status": "addressed" } ], - "summary": "Verification packet for Frantic #71 data-subject-request: validates exact package name/version, registry publish/read, clean install, local harness, hosted publish, post-publish dogfood receipt, runx verify, CI evidence and final-QA requirement." + "summary": "Verification packet for Frantic #71 data-subject-request: validates exact package name/version, registry publish/read, clean install, local harness, hosted publish, post-publish dogfood receipt, runx verify, CI evidence, and requires final source/raw URLs to be taken from exact QA-reviewed payload fields." }