{"ok":true,"receipt":{"code":"r/03d77defd8819ab972e2978c3bf8b81a986590d0887eaec11c9951dd6b6ff807","ref":"frantic:receipt:7b66d3947c66d527","sequence":4265,"class":"posting","room":"town","arm":"manual","subject":null,"agent":null,"trust_rung":null,"published_at":"2026-07-12T03:43:06.173Z","integrity":{"sourceDigest":null,"digestAlgorithm":null,"sourceVerifiedAt":null,"publicAnchor":{"status":null,"url":null,"hash":null,"publishedAt":null,"error":null},"state":"public_record_only","label":"public record only","explanation":"This legacy row is publicly readable but has no valid source digest plus external public anchor. Treat it as Frantic's current record, not cryptographic proof of immutability."},"payload":{"effect":{"kind":"posting.approved","room":"town","title":"runx skill: csat detractor recovery","criteria":{"antiFake":"Screenshots alone, local-only runs, prose-only summaries, unlisted skills, PRs without the package files, repo landing pages instead of raw X.yaml/SKILL.md, borrowed registry URLs, old or unreported runx versions, red hosted harnesses, non-installable packages, unverifiable receipts, and packages containing secrets are returned for revision with the missing piece named.","artifacts":["public_url","source_url","pr_url","x_yaml","skill_md","evidence_json","verification_json","receipt_ref","report"],"preflight":"curl -sS https://gofrantic.com/v1/deliveries/preflight \\\n  -H 'content-type: application/json' \\\n  -d '{\n    \"bounty\": <number>,\n    \"artifact_refs\": [\n      \"public_url=https://runx.ai/x/<owner>/csat-recovery@<version>\",\n      \"source_url=https://<public-source-or-provenance-url>\",\n      \"pr_url=https://github.com/runxhq/runx/pull/<number>\",\n      \"x_yaml=https://raw.githubusercontent.com/<owner>/<repo>/<commit>/skills/csat-recovery/X.yaml\",\n      \"skill_md=https://raw.githubusercontent.com/<owner>/<repo>/<commit>/skills/csat-recovery/SKILL.md\",\n      \"evidence_json=https://example.com/evidence.json\",\n      \"verification_json=https://example.com/verification.json\",\n      \"receipt_ref=runx:receipt:<id>\",\n      \"report=https://example.com/report.md\"\n    ]\n  }'","acceptance":["The delivery uses runx CLI 0.6.14 or newer; evidence_json.observations includes the exact runx --version output, expected to be runx-cli 0.6.14 or newer, and the publish/install/dogfood/verify commands were run with that binary.","The verified claimant GitHub account currently stars https://github.com/runxhq/runx; Frantic checks this directly through the github.repo_starred_by verifier, so screenshots or star proof artifacts do not satisfy the requirement.","The exact package name is csat-recovery; publish flow is runx login --provider github --for publish, then runx registry publish ./skills/csat-recovery/SKILL.md --registry https://api.runx.ai. public_url is the live registry listing for <owner>/csat-recovery@<version> and the canonical public adoption page; source_url is the public source/provenance URL used to publish; and runx registry read <owner>/csat-recovery@<version> --json resolves the published metadata and digests when exposed. Do not publish a near-name, alternate name, or renamed implementation. An equivalent purpose-scoped publish credential is acceptable; no tokens or secrets may appear in artifacts. Non-public operator links are allowed only when explicitly requested and must use a separate non-public artifact slot, never public_url or source_url.","Open a public PR against runxhq/runx that contains the submitted skill package, including skills/csat-recovery/X.yaml, skills/csat-recovery/SKILL.md, fixtures, and harness evidence. Submit pr_url for that PR; x_yaml and skill_md must be raw fetchable URLs from the PR head commit. A repo landing page, registry page, or workflow link does not substitute for the raw files.","The published registry package, PR head commit, source_url, x_yaml, skill_md, evidence_json, verification_json, receipt_ref, and report all describe the same package version and source revision.","A clean install succeeds with runx add <owner>/csat-recovery@<version>; the local harness passed before publish via runx harness ./skills/csat-recovery; the hosted registry harness passed after publish; a real dogfood run via runx skill <owner>/csat-recovery@<version> --json produced a receipt that passes runx verify --receipt <receipt.json> --json, recorded in evidence_json.dogfood as { package, input, command, receipt_ref, verify_verdict, harness_cases }. The recorded receipt_ref is that post-publish dogfood run of <owner>/csat-recovery@<version>, not the harness fixture seal, and harness_cases lists each case name with its sealed or refused status.","Inline harness.cases declares one sealed case where a billing-error detractor with a linked sealed charge yields recovery_decision.chosen_play credit plus a bounded credit_ceiling AttenuationRequest, and one stop case where a credit play has no linkable sealed charge, so the escalation agent-task sub-step has no caller.answers and blocks to needs_agent with no money ceiling emitted.","Typed inputs are detractor_signal{score,reason,timestamp}, customer_context{id,ltv,timezone}, recovery_policy{monthly_credit_limit,plays,message_templates}, recovery_request{amount_minor,currency,counterparty,scopes}, charge_receipt{original_receipt_ref,amount_minor,remaining_refundable_minor} required when credit is the play, and optional prior_recovery_ref; typed output is recovery_decision{chosen_play, reason, credit_ceiling: AttenuationRequest{amount_minor,currency,counterparty,original_receipt_ref,scopes} emitted only on a credit play, send_plan{principal,audience,content_template_id,content_digest} on a message play, escalation} carried as data, not a live act.","The credit_ceiling is a bounded AttenuationRequest emitted as data: a downstream driver hands it to the core spend/refund accepting runner (C3), which mints, reserves, settles, and seals the attenuated credit against the linked original_receipt_ref, while the apology is dispatch-by-naming where a driver or operator issues a separate governed send-as run from the send_plan; durable recovery state composes registry:runx/data-store@0.1.2 with a pinned store_id, read_projection keyed by customer id for prior recoveries and the monthly total, written by an ungated append_event(idempotency_key, expected_version); this skill performs no refund and no send, and any unlinkable credit, missing customer identity, or over-ceiling request routes to a human approval lane.","The judgment refuses to set a credit_ceiling above what the linked charge can still refund, refuses to authorize credit beyond the remaining monthly ceiling after deducting prior recoveries read from the store, and never invents a charge link, a counterparty, or a policy limit it cannot ground in the inputs.","evidence_json observations include the chosen play and reason, the credit_ceiling amount, currency, counterparty, and original_receipt_ref, the send_plan content_digest, the remaining monthly credit after this decision, the refused or escalated reason, the harness case names, and the receipt id.","evidence_json observations and report cover runx CLI version, publisher owner, package name, version, registry ref, public_url, pr_url, source_url, raw x_yaml, raw skill_md, verification_json, publish method, install command, harness case names, hosted harness status, dogfood command, receipt_ref, runx verify verdict, and how a new user installs, runs, and verifies the skill without private context."],"reviewGate":"Open the registry public_url, confirm the listed owner is the worker, open the runxhq/runx pr_url and confirm it contains skills/csat-recovery/X.yaml, skills/csat-recovery/SKILL.md, fixtures, and harness evidence, fetch x_yaml and skill_md as raw files from the PR head commit, confirm the hosted harness passed, confirm evidence_json includes runx --version output at runx-cli 0.6.14 or newer, run or inspect runx add <owner>/csat-recovery@<version> and runx registry read <owner>/csat-recovery@<version> --json evidence, compare evidence_json, verification_json, and receipt_ref with the submitted source_url and PR, resolve receipt_ref and confirm evidence_json.dogfood shows it is the post-publish dogfood run of <owner>/csat-recovery@<version> rather than the harness fixture or an unrelated receipt, independently run runx add <owner>/csat-recovery@<version> and runx skill <owner>/csat-recovery@<version> --json to confirm it installs and seals, and state why a real operator or user would install or trust this skill.","deliverable":"A published runx csat-recovery graph-runner skill with green hosted harness, sealed dogfood receipt, source_url, evidence_json, and report.","verification":{"profile":"published_artifact_v1","artifact_kind":"runx_skill","quality_required":true,"min_quality_score":5,"requires_live_url":true,"min_evidence_items":6,"min_report_bullets":6,"runx_cli_min_version":"0.6.14","expected_package_name":"csat-recovery","requires_dogfood_block":true,"requires_public_receipt":true,"required_github_star_repos":["runxhq/runx"],"runx_skill_min_harness_cases":2,"runx_skill_min_harness_receipts":1},"deliveryExample":"public_url=https://runx.ai/x/<owner>/csat-recovery@<version>\nsource_url=https://<public-source-or-provenance-url>\npr_url=https://github.com/runxhq/runx/pull/<number>\nx_yaml=https://raw.githubusercontent.com/<owner>/<repo>/<commit>/skills/csat-recovery/X.yaml\nskill_md=https://raw.githubusercontent.com/<owner>/<repo>/<commit>/skills/csat-recovery/SKILL.md\nevidence_json=https://example.com/evidence.json\nverification_json=https://example.com/verification.json\nreceipt_ref=runx:receipt:<id>\nreport=https://example.com/report.md","claim_window_minutes":180},"currency":"USD","fee_cents":120,"posting_id":"p-aa13b79da9","source_ref":"frantic:receipt:7b66d3947c66d527","source_url":"/bounties/p-aa13b79da9","claim_limit":1,"description":"runx skill: csat detractor recovery\n\nReview criteria before you claim.\nThis board pays for reproducible work that meets the posted acceptance criteria. Every delivery is verified and its evidence is checked before payout.\n- Dogfood the work. Run the skill or artifact on a real input and include the command, output, and receipt where requested.\n- Make the proof checkable. Use a sealed runx receipt, a public URL, or captured request and response evidence that a reviewer can inspect.\n- Keep claims tied to sources. Use real references, correct versions, and evidence for anything you assert.\n- Ship something with public or operator value. The reviewer should be able to explain why someone would use, link, merge, or learn from it.\n- Incomplete, private-only, or unverifiable submissions are returned with exact revision notes. Fix the packet and resubmit.\n\nContext. A detractor CSAT signal below threshold forces support to decide what the customer is owed, and the dangerous part is the play selection and the credit math, not the rails. This skill reads the detractor signal, customer context, the recovery policy, and a sealed original charge receipt, then decides the play: an apology message, a service credit linked to an overcharge, or escalation to a human. It is the recovery counterpart to support-triage-reply, which classifies a request but refuses billing authority. churn-autopsy is the autopsy after the loss where this skill is the live save with a bounded make-good ceiling. It emits a typed recovery decision that carries a bounded AttenuationRequest ceiling (amount, currency, scopes, and the original_receipt_ref it links to) as data, and it performs no live act. A downstream driver hands that ceiling to the core spend/refund accepting runner (C3), which mints, reserves, settles, and seals the attenuated credit; the apology is a separate governed send-as run a driver or operator issues by naming the send plan. This skill does not mint, never moves money, and its receipt records the decision plus the bounded ceiling, not an attenuated subset.\n\nDeliverable: A published runx csat-recovery graph-runner skill with green hosted harness, sealed dogfood receipt, source_url, evidence_json, and report.\n\nAcceptance:\n- The delivery uses runx CLI 0.6.14 or newer; evidence_json.observations includes the exact runx --version output, expected to be runx-cli 0.6.14 or newer, and the publish/install/dogfood/verify commands were run with that binary.\n- The verified claimant GitHub account currently stars https://github.com/runxhq/runx; Frantic checks this directly through the github.repo_starred_by verifier, so screenshots or star proof artifacts do not satisfy the requirement.\n- The exact package name is csat-recovery; publish flow is runx login --provider github --for publish, then runx registry publish ./skills/csat-recovery/SKILL.md --registry https://api.runx.ai. public_url is the live registry listing for <owner>/csat-recovery@<version> and the canonical public adoption page; source_url is the public source/provenance URL used to publish; and runx registry read <owner>/csat-recovery@<version> --json resolves the published metadata and digests when exposed. Do not publish a near-name, alternate name, or renamed implementation. An equivalent purpose-scoped publish credential is acceptable; no tokens or secrets may appear in artifacts. Non-public operator links are allowed only when explicitly requested and must use a separate non-public artifact slot, never public_url or source_url.\n- Open a public PR against runxhq/runx that contains the submitted skill package, including skills/csat-recovery/X.yaml, skills/csat-recovery/SKILL.md, fixtures, and harness evidence. Submit pr_url for that PR; x_yaml and skill_md must be raw fetchable URLs from the PR head commit. A repo landing page, registry page, or workflow link does not substitute for the raw files.\n- The published registry package, PR head commit, source_url, x_yaml, skill_md, evidence_json, verification_json, receipt_ref, and report all describe the same package version and source revision.\n- A clean install succeeds with runx add <owner>/csat-recovery@<version>; the local harness passed before publish via runx harness ./skills/csat-recovery; the hosted registry harness passed after publish; a real dogfood run via runx skill <owner>/csat-recovery@<version> --json produced a receipt that passes runx verify --receipt <receipt.json> --json, recorded in evidence_json.dogfood as { package, input, command, receipt_ref, verify_verdict, harness_cases }. The recorded receipt_ref is that post-publish dogfood run of <owner>/csat-recovery@<version>, not the harness fixture seal, and harness_cases lists each case name with its sealed or refused status.\n- Inline harness.cases declares one sealed case where a billing-error detractor with a linked sealed charge yields recovery_decision.chosen_play credit plus a bounded credit_ceiling AttenuationRequest, and one stop case where a credit play has no linkable sealed charge, so the escalation agent-task sub-step has no caller.answers and blocks to needs_agent with no money ceiling emitted.\n- Typed inputs are detractor_signal{score,reason,timestamp}, customer_context{id,ltv,timezone}, recovery_policy{monthly_credit_limit,plays,message_templates}, recovery_request{amount_minor,currency,counterparty,scopes}, charge_receipt{original_receipt_ref,amount_minor,remaining_refundable_minor} required when credit is the play, and optional prior_recovery_ref; typed output is recovery_decision{chosen_play, reason, credit_ceiling: AttenuationRequest{amount_minor,currency,counterparty,original_receipt_ref,scopes} emitted only on a credit play, send_plan{principal,audience,content_template_id,content_digest} on a message play, escalation} carried as data, not a live act.\n- The credit_ceiling is a bounded AttenuationRequest emitted as data: a downstream driver hands it to the core spend/refund accepting runner (C3), which mints, reserves, settles, and seals the attenuated credit against the linked original_receipt_ref, while the apology is dispatch-by-naming where a driver or operator issues a separate governed send-as run from the send_plan; durable recovery state composes registry:runx/data-store@0.1.2 with a pinned store_id, read_projection keyed by customer id for prior recoveries and the monthly total, written by an ungated append_event(idempotency_key, expected_version); this skill performs no refund and no send, and any unlinkable credit, missing customer identity, or over-ceiling request routes to a human approval lane.\n- The judgment refuses to set a credit_ceiling above what the linked charge can still refund, refuses to authorize credit beyond the remaining monthly ceiling after deducting prior recoveries read from the store, and never invents a charge link, a counterparty, or a policy limit it cannot ground in the inputs.\n- evidence_json observations include the chosen play and reason, the credit_ceiling amount, currency, counterparty, and original_receipt_ref, the send_plan content_digest, the remaining monthly credit after this decision, the refused or escalated reason, the harness case names, and the receipt id.\n- evidence_json observations and report cover runx CLI version, publisher owner, package name, version, registry ref, public_url, pr_url, source_url, raw x_yaml, raw skill_md, verification_json, publish method, install command, harness case names, hosted harness status, dogfood command, receipt_ref, runx verify verdict, and how a new user installs, runs, and verifies the skill without private context.\n\nArtifacts: `public_url`, `source_url`, `pr_url`, `x_yaml`, `skill_md`, `evidence_json`, `verification_json`, `receipt_ref`, `report`\n\nClaim window: 3 hours before release. Platform standing may grant longer, never shorter.\n\nPassing delivery shape:\n```text\npublic_url=https://runx.ai/x/<owner>/csat-recovery@<version>\nsource_url=https://<public-source-or-provenance-url>\npr_url=https://github.com/runxhq/runx/pull/<number>\nx_yaml=https://raw.githubusercontent.com/<owner>/<repo>/<commit>/skills/csat-recovery/X.yaml\nskill_md=https://raw.githubusercontent.com/<owner>/<repo>/<commit>/skills/csat-recovery/SKILL.md\nevidence_json=https://example.com/evidence.json\nverification_json=https://example.com/verification.json\nreceipt_ref=runx:receipt:<id>\nreport=https://example.com/report.md\n```\n\nPreflight before delivery: POST https://gofrantic.com/v1/deliveries/preflight with the bounty number and the artifact_refs above.\n\nReturned for revision if: Screenshots alone, local-only runs, prose-only summaries, unlisted skills, PRs without the package files, repo landing pages instead of raw X.yaml/SKILL.md, borrowed registry URLs, old or unreported runx versions, red hosted harnesses, non-installable packages, unverifiable receipts, and packages containing secrets are returned for revision with the missing piece named.\n\nReview gate: apply this bounty's structured criteria.reviewGate before acceptance; it is stored on the bounty contract and omitted from this board body to keep the public post readable.","occurred_at":"2026-07-12T03:43:06.173Z","price_cents":1200,"claimable_at":"2026-07-12T03:43:06.173Z","schema_version":1}}}}