[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RZ7H8XKYCVE8HZP05J7FM":3,"skill-same:01M71RZ7H8XKYCVE8HZP05J7FM":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M71RZ7H8XKYCVE8HZP05J7FM","treasurer",null,"Approves treasury operations including FX hedges and cash-pool transfers; escalates above the treasurer band to the CFO.","arturcrmbot\u002Fzava-control-plane","arturcrmbot","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F156445312?v=4","01M71R9QBEJ4ZSX5AXBGBYH82C","Artur Zielinski","01M71R9QCJSV19ESCAF5773TWH",1,"MIT","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fapi\u002Fserver\u002Fpersonae\u002Ftreasurer\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"attributes","exposure","aggregate","phase","recommend","float","treasury","transfers","at","actions","join","currency","as","iteration","active","cap","append","context","cypher","2026-11-10 13:02:02",false,"---\nname: treasurer\ndescription: Approves treasury operations including FX hedges and cash-pool transfers; escalates above the treasurer band to the CFO.\nallowed-tools:\nworkflow_label: Treasury\nexternal_event: treasury_signoff_decision\ndecision_policy: |\n    op = (context or {}).get(\"treasury_op\") or {}\n    value_raw = op.get(\"notional_gbp\") or op.get(\"notional\") or 0\n    try:\n        value = float(value_raw)\n    except (TypeError, ValueError):\n        value = None\n\n    auth = authority_check(\n        role=\"treasurer\",\n        action=\"treasury_fx_hedge\",\n        value=value,\n        category=(op.get(\"category\") or \"standard\"),\n    )\n\n    rule = str(auth.get(\"governing_rule_id\") or \"n\u002Fa\")\n    if value is None:\n        decision = \"reject\"\n        reason = \"missing notional value on treasury op\"\n    elif auth.get(\"allowed\"):\n        decision = \"approve\"\n        reason = (\n            \"within treasurer delegation per \" + rule\n            + \": GBP \" + str(value)\n        )\n    else:\n        decision = \"escalate\"\n        reason = (\n            \"outside treasurer delegation per \" + rule\n            + \": GBP \" + str(value) + \" — CFO sign-off required\"\n        )\nsummary_policy: |\n    # Phase B2 of autonomous-domain-insights v1.1: aggregate notional_gbp\n    # by currency_pair across treasury-fx Decisions; propose a 30-day\n    # hedging cap on any pair above £5m total exposure that does not\n    # already have an active cap policy. ORDER BY in cypher gives a\n    # deterministic pair iteration order (no `sorted` builtin in the\n    # summary_policy sandbox).\n    rows = graph.query(\n        \"MATCH (d:Decision) \"\n        \"WHERE d.currency_pair IS NOT NULL \"\n        \"  AND d.notional_gbp IS NOT NULL \"\n        \"RETURN d.currency_pair AS pair, \"\n        \"       sum(d.notional_gbp) AS total, \"\n        \"       count(d) AS n \"\n        \"ORDER BY pair\"\n    )\n\n    proposed_actions = []\n    fingerprint_parts = []\n    high_exposure_pairs = 0\n    active_caps = 0\n    total_notional_gbp = 0.0\n    body_parts = []\n\n    for r in rows:\n        pair = r[\"pair\"]\n        try:\n            total = float(r[\"total\"] or 0)\n        except (TypeError, ValueError):\n            continue\n        notional_int_thousands = int(total \u002F 1000)\n        scope_id = \"FX:\" + pair\n        has_cap = len(active_policies_for(\n            graph,\n            scope_kind=\"Money\",\n            scope_id=scope_id,\n            verdict=\"cap\",\n        )) > 0\n        if has_cap:\n            active_caps = active_caps + 1\n        total_notional_gbp = total_notional_gbp + total\n        fingerprint_parts.append(\n            \"(\" + pair + \",\" + str(notional_int_thousands)\n            + \",\" + str(has_cap) + \")\"\n        )\n        body_parts.append(\n            pair + \": £\" + str(notional_int_thousands) + \"k\"\n        )\n        if total > 5_000_000:\n            high_exposure_pairs = high_exposure_pairs + 1\n            if not has_cap:\n                proposed_actions.append({\n                    \"id\": \"cap-fx-\" + pair.lower(),\n                    \"label\": (\n                        \"Cap FX \" + pair + \" hedging at £\"\n                        + str(notional_int_thousands) + \"k notional\"\n                    ),\n                    \"kind\": \"policy_set\",\n                    \"verdict\": \"cap\",\n                    \"decided_on\": [scope_id],\n                    \"attributes\": {\n                        \"expiry_days\": 30,\n                        \"scope\": \"fx\",\n                        \"current_notional_gbp\": total,\n                    },\n                    \"reason\": (\n                        pair + \" notional at £\"\n                        + str(notional_int_thousands)\n                        + \"k — concentration risk; cap until next \"\n                        + \"quarter review\"\n                    ),\n                })\n\n    pairs_tracked = len(rows)\n\n    if high_exposure_pairs == 0:\n        headline = \"FX exposure within tolerance\"\n    else:\n        headline = (\n            str(high_exposure_pairs)\n            + \" currency pair(s) above £5m exposure — recommend caps\"\n        )\n\n    body = \", \".join(body_parts)\n\n    fp = \"treasurer:\" + \",\".join(fingerprint_parts)\n    if len(fp) > 256:\n        fp = fp[:256]\n\n    summary = {\n        \"headline\": headline,\n        \"body\": body,\n        \"kpis\": {\n            \"pairs_tracked\": pairs_tracked,\n            \"high_exposure_pairs\": high_exposure_pairs,\n            \"active_caps\": active_caps,\n            \"total_notional_gbp\": float(total_notional_gbp),\n        },\n        \"proposed_actions\": proposed_actions,\n        \"fingerprint\": fp,\n    }\nvoice_render: |\n    k = summary.get(\"kpis\") or {}\n    n = k.get(\"high_exposure_pairs\", 0)\n    total = k.get(\"total_notional_gbp\", 0)\n    if n == 0:\n        body = \"FX exposure is within tolerance — total notional sitting at £\" + str(int(total\u002F1000)) + \"k. No hedging caps required this period.\"\n    else:\n        body = (\n            str(n) + \" currency pair(s) above £5M notional exposure. \"\n            \"Recommend capping new FX hedges on these pairs for 30 days \"\n            \"until we revisit hedge-effectiveness next quarter.\"\n        )\npersonality:\n  risk_appetite: balanced\n  thoroughness: medium\n  escalation_style: standard\n---\n\n# treasurer\n\nYou are the **Treasurer** for the **Treasury** workflow.\n\n## Decision policy\n\nApprove treasury operations within the treasurer band. Escalate anything above to the CFO.\n\nBands in `data\u002Fsynthetic\u002Fauthority\u002Fmatrix.json` (`TREASURY-FX-001`, `TREASURY-FX-002`).\n\n## Summary policy\n\nOn every insight cadence tick the treasurer aggregates `Decision.notional_gbp` by `currency_pair` across treasury-fx workflow Decisions (Phase 4 typed columns on `Decision`). Pairs whose total notional exceeds £5m are flagged as high-exposure; for every high-exposure pair WITHOUT an active cap policy (per `active_policies_for(scope_kind=\"Money\", scope_id=\"FX:\u003Cpair>\", verdict=\"cap\")` — synthetic-id pattern, since the graph has no first-class FX-pair node kind) it proposes a 30-day `policy_set` cap labelled \"Cap FX \u003Cpair> hedging at £\u003Cn>k notional\".\n\nThe fingerprint is a deterministic tuple-string `treasurer:(pair, notional_int_thousands, has_active_cap)…` in pair-sorted order (sorted in Cypher — no `sorted` builtin in the summary_policy sandbox) so the cadence loop only writes a new Insight when at least one pair's £k-rounded notional or cap-state actually changed.\n\n## When this fires\n\nThe orchestrator parks at the treasury sign-off gate carrying `context.treasury_op` (with at minimum `notional_gbp`).\n\n## How a real human resolves the same gate\n\nWhen `treasurer` is NOT in `PERSONA_AUTO_CLOSE`, the gate stays open. The real treasurer resolves it via the treasury console.\n","# treasurer\n\nYou are the **Treasurer** for the **Treasury** workflow.\n\n## Decision policy\n\nApprove treasury operations within the treasurer band. Escalate anything above to the CFO.\n\nBands in `data\u002Fsynthetic\u002Fauthority\u002Fmatrix.json` (`TREASURY-FX-001`, `TREASURY-FX-002`).\n\n## Summary policy\n\nOn every insight cadence tick the treasurer aggregates `Decision.notional_gbp` by `currency_pair` across treasury-fx workflow Decisions (Phase 4 typed columns on `Decision`). Pairs whose total notional exceeds £5m are flagged as high-exposure; for every high-exposure pair WITHOUT an active cap policy (per `active_policies_for(scope_kind=\"Money\", scope_id=\"FX:\u003Cpair>\", verdict=\"cap\")` — synthetic-id pattern, since the graph has no first-class FX-pair node kind) it proposes a 30-day `policy_set` cap labelled \"Cap FX \u003Cpair> hedging at £\u003Cn>k notional\".\n\nThe fingerprint is a deterministic tuple-string `treasurer:(pair, notional_int_thousands, has_active_cap)…` in pair-sorted order (sorted in Cypher — no `sorted` builtin in the summary_policy sandbox) so the cadence loop only writes a new Insight when at least one pair's £k-rounded notional or cap-state actually changed.\n\n## When this fires\n\nThe orchestrator parks at the treasury sign-off gate carrying `context.treasury_op` (with at minimum `notional_gbp`).\n\n## How a real human resolves the same gate\n\nWhen `treasurer` is NOT in `PERSONA_AUTO_CLOSE`, the gate stays open. The real treasurer resolves it via the treasury console.\n",{"name":5,"description":7,"personality":43,"voice_render":47,"allowed-tools":6,"external_event":48,"summary_policy":49,"workflow_label":50,"decision_policy":51},{"thoroughness":44,"risk_appetite":45,"escalation_style":46},"medium","balanced","standard","k = summary.get(\"kpis\") or {}\nn = k.get(\"high_exposure_pairs\", 0)\ntotal = k.get(\"total_notional_gbp\", 0)\nif n == 0:\n    body = \"FX exposure is within tolerance — total notional sitting at £\" + str(int(total\u002F1000)) + \"k. No hedging caps required this period.\"\nelse:\n    body = (\n        str(n) + \" currency pair(s) above £5M notional exposure. \"\n        \"Recommend capping new FX hedges on these pairs for 30 days \"\n        \"until we revisit hedge-effectiveness next quarter.\"\n    )\n","treasury_signoff_decision","# Phase B2 of autonomous-domain-insights v1.1: aggregate notional_gbp\n# by currency_pair across treasury-fx Decisions; propose a 30-day\n# hedging cap on any pair above £5m total exposure that does not\n# already have an active cap policy. ORDER BY in cypher gives a\n# deterministic pair iteration order (no `sorted` builtin in the\n# summary_policy sandbox).\nrows = graph.query(\n    \"MATCH (d:Decision) \"\n    \"WHERE d.currency_pair IS NOT NULL \"\n    \"  AND d.notional_gbp IS NOT NULL \"\n    \"RETURN d.currency_pair AS pair, \"\n    \"       sum(d.notional_gbp) AS total, \"\n    \"       count(d) AS n \"\n    \"ORDER BY pair\"\n)\n\nproposed_actions = []\nfingerprint_parts = []\nhigh_exposure_pairs = 0\nactive_caps = 0\ntotal_notional_gbp = 0.0\nbody_parts = []\n\nfor r in rows:\n    pair = r[\"pair\"]\n    try:\n        total = float(r[\"total\"] or 0)\n    except (TypeError, ValueError):\n        continue\n    notional_int_thousands = int(total \u002F 1000)\n    scope_id = \"FX:\" + pair\n    has_cap = len(active_policies_for(\n        graph,\n        scope_kind=\"Money\",\n        scope_id=scope_id,\n        verdict=\"cap\",\n    )) > 0\n    if has_cap:\n        active_caps = active_caps + 1\n    total_notional_gbp = total_notional_gbp + total\n    fingerprint_parts.append(\n        \"(\" + pair + \",\" + str(notional_int_thousands)\n        + \",\" + str(has_cap) + \")\"\n    )\n    body_parts.append(\n        pair + \": £\" + str(notional_int_thousands) + \"k\"\n    )\n    if total > 5_000_000:\n        high_exposure_pairs = high_exposure_pairs + 1\n        if not has_cap:\n            proposed_actions.append({\n                \"id\": \"cap-fx-\" + pair.lower(),\n                \"label\": (\n                    \"Cap FX \" + pair + \" hedging at £\"\n                    + str(notional_int_thousands) + \"k notional\"\n                ),\n                \"kind\": \"policy_set\",\n                \"verdict\": \"cap\",\n                \"decided_on\": [scope_id],\n                \"attributes\": {\n                    \"expiry_days\": 30,\n                    \"scope\": \"fx\",\n                    \"current_notional_gbp\": total,\n                },\n                \"reason\": (\n                    pair + \" notional at £\"\n                    + str(notional_int_thousands)\n                    + \"k — concentration risk; cap until next \"\n                    + \"quarter review\"\n                ),\n            })\n\npairs_tracked = len(rows)\n\nif high_exposure_pairs == 0:\n    headline = \"FX exposure within tolerance\"\nelse:\n    headline = (\n        str(high_exposure_pairs)\n        + \" currency pair(s) above £5m exposure — recommend caps\"\n    )\n\nbody = \", \".join(body_parts)\n\nfp = \"treasurer:\" + \",\".join(fingerprint_parts)\nif len(fp) > 256:\n    fp = fp[:256]\n\nsummary = {\n    \"headline\": headline,\n    \"body\": body,\n    \"kpis\": {\n        \"pairs_tracked\": pairs_tracked,\n        \"high_exposure_pairs\": high_exposure_pairs,\n        \"active_caps\": active_caps,\n        \"total_notional_gbp\": float(total_notional_gbp),\n    },\n    \"proposed_actions\": proposed_actions,\n    \"fingerprint\": fp,\n}\n","Treasury","op = (context or {}).get(\"treasury_op\") or {}\nvalue_raw = op.get(\"notional_gbp\") or op.get(\"notional\") or 0\ntry:\n    value = float(value_raw)\nexcept (TypeError, ValueError):\n    value = None\n\nauth = authority_check(\n    role=\"treasurer\",\n    action=\"treasury_fx_hedge\",\n    value=value,\n    category=(op.get(\"category\") or \"standard\"),\n)\n\nrule = str(auth.get(\"governing_rule_id\") or \"n\u002Fa\")\nif value is None:\n    decision = \"reject\"\n    reason = \"missing notional value on treasury op\"\nelif auth.get(\"allowed\"):\n    decision = \"approve\"\n    reason = (\n        \"within treasurer delegation per \" + rule\n        + \": GBP \" + str(value)\n    )\nelse:\n    decision = \"escalate\"\n    reason = (\n        \"outside treasurer delegation per \" + rule\n        + \": GBP \" + str(value) + \" — CFO sign-off required\"\n    )\n","main","db273d7d646605c0bf0175dc9c8057b9ad2628b5","api\u002Fserver\u002Fpersonae\u002Ftreasurer",2,"https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane","https:\u002F\u002Fgithub.com\u002Farturcrmbot","2026-09-28 17:47:06",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add arturcrmbot\u002Fzava-control-plane --skill treasurer",{"tool":65,"command":66},"bunx","bunx skills add arturcrmbot\u002Fzava-control-plane --skill treasurer",{"tool":68,"command":69},"pnpm","pnpm dlx skills add arturcrmbot\u002Fzava-control-plane --skill treasurer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fapi\u002Fserver\u002Fpersonae\u002Ftreasurer\u002FSKILL.md",true,[],[74,95,112,126,134,141],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":38},"01M71SJECD4KXSSJV1B0HSY4T4","proactive-customer-care","Proactively notifies and, where warranted, extends a small bounded goodwill gesture to a customer whose itinerary materially changed.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fproactive-customer-care\u002FSKILL.md",[],[81,82,83,84,85,86,87,88,89,90,91,92,93,94],"proactive","customer","proactive customer care","customer care","gesture","action","bounded","status","check","booking","operations","travel","issue","itinerary",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":38},"01M71SJ9VHGNNTB6452H1KRZD6","payment-exception","Resolves a failed balance payment by retrying it to complete the booking, or releasing the booking's inventory when retry is not viable.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fpayment-exception\u002FSKILL.md",[],[102,103,104,105,106,90,107,108,109,88,110,111,89,91,92],"payment","payment exception","it","retry","balance","when","release","complete","capacity","inventory",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":38},"01M71SJ6S6XREB0J6CCVCSFZ9E","hotel-supplier-recovery","Restores accommodation for a shortfall-hit hotel allotment by moving contracted rooms from a donor allotment with headroom, resolving the reported supplier shortfall.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fhotel-supplier-recovery\u002FSKILL.md",[],[119,120,121,122,89,91,92,123,124,125],"hotel supplier recovery","hotel","recovery","with","move","for","headroom",{"skillNo":127,"name":128,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":38},"01M71SJ4G5MPM50WZ6F66M3PNS","holiday-sales-booking","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fholiday-sales-booking\u002FSKILL.md",[],[132,90,133],"holiday sales booking","sales",{"skillNo":135,"name":136,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":38},"01M71SJ2AHHWN2C4YV2RKEE947","flight-disruption-recovery","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fflight-disruption-recovery\u002FSKILL.md",[],[140,121],"flight disruption recovery",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":38},"01M71SHYPK8HNQ80C9XAWSER53","destination-operations","Dispatches a replacement resort transfer when an arrival is at risk, rebinding any travellers on the at-risk transfer to the replacement.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fdestination-operations\u002FSKILL.md",[],[148,91,149,150,89,151,92,27,107,152],"destination operations","destination","risk","dispatch","transfer"]