From 2ed5a0848a8353c19a0d010c29c67106e0c44fff Mon Sep 17 00:00:00 2001 From: guanchao <18612113337@163.com> Date: Thu, 15 Oct 2026 17:31:57 +0800 Subject: [PATCH] docs(pyramid): add recurring test publish payload and curl --- laf-cloud/functions/pyramid/README.md | 14 +++++++++ .../config/recurring-test.publish.json | 31 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 laf-cloud/functions/pyramid/config/recurring-test.publish.json diff --git a/laf-cloud/functions/pyramid/README.md b/laf-cloud/functions/pyramid/README.md index b1205aa..4b2b631 100644 --- a/laf-cloud/functions/pyramid/README.md +++ b/laf-cloud/functions/pyramid/README.md @@ -58,6 +58,20 @@ 部署更新已有 `pyramid/api`(包含列表提供函数),无需新增云函数或更改结算定时器。 随后发布一次完整循环配置才会启用;仅部署代码不会擅自转换旧配置或启用测试草稿。发布前需核对线上现有期次结束时间及正式奖励版本。 +#### 测试环境发布文件与 curl + +完整请求见 [recurring-test.publish.json](config/recurring-test.publish.json),包含当前 v3 草稿的四档奖励、原始目录/策略字符串及对应哈希。 +首期为北京时间 2026-10-16 21:00,每隔 7 天开启、持续 2 天,`audience: []` 表示测试环境所有满足参与条件的玩家,沿用自动分档。 +将文件的 `adminToken` 占位值替换为测试服务端 `ADMIN_TOKEN`;需已部署新版 `pyramid/api`,并确认测试服务端 `PAYMENT_APP_ENV=test`。 +在后端仓库根目录的 PowerShell 中执行: + +```powershell +curl.exe --fail-with-body --request POST "https://sor779u2w8.sealoshzh.site/pyramid/api" --header "Content-Type: application/json" --data-binary "@laf-cloud/functions/pyramid/config/recurring-test.publish.json" +``` + +响应 `code: 1` 才表示发布成功。若首期时间已过,修改 `schedule.anchorAt` 为未来时间并使用新的 `configVersion`;`effectiveFrom` 已省略,服务端自动取首期开启时间。 +遇到 `PERIOD_OVERLAP` 应选择不截断现有活动的开始时间。该请求文件仅生成并通过本地配置校验,未执行 curl 或修改测试数据库;真实令牌不要提交到 Git。 + `config/2026-09-28-test.json` 是已补齐奖励的测试期配置:`startAt:1790524800000`、`endAt:1790611200000`,即北京时间 2026-09-28 00:00(含)至 2026-09-29 00:00(不含)。前五层沿用 `pay_test`、`itemPrice:100` 分/次。每个普通格子为一百金币,每个宝箱为一百金币加一个冻结道具;第六层固定奖励为一百金币。 格子位置及升级箭头按原效果图(从下到上为第一至六层,每层从左到右编号)。`test-v2` 使用指定权重:第一层 `[49,5,4946,4946,5,49]`,第二层 `[49,4949,4,4949,49]`,第三层 `[97,9797,9,97]`,第四层 `[1,1,1]`,第五层 `[1,1]`。前三层权重总和均为一万;第四层各三分之一,第五层各二分之一。较少奖励格子的具体数量尚未指定,奖励数量仍沿用一百金币。 diff --git a/laf-cloud/functions/pyramid/config/recurring-test.publish.json b/laf-cloud/functions/pyramid/config/recurring-test.publish.json new file mode 100644 index 0000000..5d4fb56 --- /dev/null +++ b/laf-cloud/functions/pyramid/config/recurring-test.publish.json @@ -0,0 +1,31 @@ +{ + "action": "admin", + "operation": "publish", + "adminToken": "REPLACE_WITH_TEST_ADMIN_TOKEN", + "enabled": true, + "period": { + "configVersion": "pyramid_test_recurring_20261016_1", + "environment": "test", + "schedule": { + "type": "recurring", + "timezone": "Asia/Shanghai", + "anchorAt": "2026-10-16T21:00:00+08:00", + "intervalDays": 7, + "durationDays": 2 + }, + "assignmentMode": "profile_auto", + "audience": [], + "offer": { + "manifestVersion": "pyramid_manifest_20261010_1", + "catalogJson": "{\n \"schema_version\": \"pyramid_schema_1\",\n \"catalog_version\": \"pyramid_catalog_20261010_1\",\n \"policy_version\": \"pyramid_rules_1\",\n \"valuation_version\": \"pyramid_value_1\",\n \"amount_unit\": \"fen\",\n \"timezone\": \"Asia/Shanghai\",\n \"top_settlement\": \"remaining_slot_entitlements_only\",\n \"layers\": [\n {\n \"layer\": 1,\n \"weights\": [\n 49,\n 5,\n 4946,\n 4946,\n 5,\n 49\n ],\n \"advance_positions\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6\n ]\n },\n {\n \"layer\": 2,\n \"weights\": [\n 49,\n 4949,\n 4,\n 4949,\n 49\n ],\n \"advance_positions\": [\n 1,\n 5\n ]\n },\n {\n \"layer\": 3,\n \"weights\": [\n 97,\n 9797,\n 9,\n 97\n ],\n \"advance_positions\": [\n 1,\n 4\n ]\n },\n {\n \"layer\": 4,\n \"weights\": [\n 1,\n 1,\n 1\n ],\n \"advance_positions\": [\n 2\n ]\n },\n {\n \"layer\": 5,\n \"weights\": [\n 1,\n 1\n ],\n \"advance_positions\": [\n 2\n ]\n }\n ],\n \"status\": \"correction_candidate_not_deployed\",\n \"tiers\": [\n {\n \"tier_id\": 1,\n \"price_fen_by_layer\": [\n 0,\n 300,\n 800,\n 1200,\n 1800\n ],\n \"total_coin_equivalent\": 81500,\n \"slots\": [\n {\"slot_id\":\"L1P1\",\"layer\":1,\"position\":1,\"chest\":false,\"reward\":{\"hammer\":1},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P2\",\"layer\":1,\"position\":2,\"chest\":false,\"reward\":{\"coins\":250},\"coin_equivalent\":250,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P3\",\"layer\":1,\"position\":3,\"chest\":false,\"reward\":{\"freeze\":2},\"coin_equivalent\":400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P4\",\"layer\":1,\"position\":4,\"chest\":false,\"reward\":{\"coins\":350},\"coin_equivalent\":350,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P5\",\"layer\":1,\"position\":5,\"chest\":false,\"reward\":{\"wand\":1},\"coin_equivalent\":300,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P6\",\"layer\":1,\"position\":6,\"chest\":false,\"reward\":{\"infinite_minutes\":15},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P1\",\"layer\":2,\"position\":1,\"chest\":false,\"reward\":{\"coins\":1900},\"coin_equivalent\":1900,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P2\",\"layer\":2,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":10},\"coin_equivalent\":2000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P3\",\"layer\":2,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":4},\"coin_equivalent\":2400,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L2P4\",\"layer\":2,\"position\":4,\"chest\":false,\"reward\":{\"wand\":8},\"coin_equivalent\":2400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P5\",\"layer\":2,\"position\":5,\"chest\":true,\"reward\":{\"coins\":1000,\"infinite_minutes\":30},\"coin_equivalent\":2200,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L3P1\",\"layer\":3,\"position\":1,\"chest\":false,\"reward\":{\"wand\":18},\"coin_equivalent\":5400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P2\",\"layer\":3,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":25},\"coin_equivalent\":5000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P3\",\"layer\":3,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":8},\"coin_equivalent\":4800,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L3P4\",\"layer\":3,\"position\":4,\"chest\":true,\"reward\":{\"coins\":3200,\"infinite_minutes\":60},\"coin_equivalent\":5600,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L4P1\",\"layer\":4,\"position\":1,\"chest\":false,\"reward\":{\"coins\":8000},\"coin_equivalent\":8000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P2\",\"layer\":4,\"position\":2,\"chest\":false,\"reward\":{\"infinite_minutes\":180},\"coin_equivalent\":7200,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P3\",\"layer\":4,\"position\":3,\"chest\":true,\"reward\":{\"hammer\":10,\"freeze\":15},\"coin_equivalent\":9000,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P1\",\"layer\":5,\"position\":1,\"chest\":true,\"reward\":{\"hammer\":12,\"freeze\":9,\"wand\":9},\"coin_equivalent\":11700,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P2\",\"layer\":5,\"position\":2,\"chest\":true,\"reward\":{\"coins\":6600,\"infinite_minutes\":120},\"coin_equivalent\":11400,\"reward_class\":\"chest\"}\n ]\n },\n {\n \"tier_id\": 2,\n \"price_fen_by_layer\": [\n 0,\n 600,\n 1200,\n 1800,\n 3000\n ],\n \"total_coin_equivalent\": 128300,\n \"slots\": [\n {\"slot_id\":\"L1P1\",\"layer\":1,\"position\":1,\"chest\":false,\"reward\":{\"hammer\":1},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P2\",\"layer\":1,\"position\":2,\"chest\":false,\"reward\":{\"coins\":250},\"coin_equivalent\":250,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P3\",\"layer\":1,\"position\":3,\"chest\":false,\"reward\":{\"freeze\":2},\"coin_equivalent\":400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P4\",\"layer\":1,\"position\":4,\"chest\":false,\"reward\":{\"coins\":350},\"coin_equivalent\":350,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P5\",\"layer\":1,\"position\":5,\"chest\":false,\"reward\":{\"wand\":1},\"coin_equivalent\":300,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P6\",\"layer\":1,\"position\":6,\"chest\":false,\"reward\":{\"infinite_minutes\":15},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P1\",\"layer\":2,\"position\":1,\"chest\":false,\"reward\":{\"coins\":3800},\"coin_equivalent\":3800,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P2\",\"layer\":2,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":20},\"coin_equivalent\":4000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P3\",\"layer\":2,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":6},\"coin_equivalent\":3600,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L2P4\",\"layer\":2,\"position\":4,\"chest\":false,\"reward\":{\"wand\":14},\"coin_equivalent\":4200,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P5\",\"layer\":2,\"position\":5,\"chest\":true,\"reward\":{\"coins\":2000,\"infinite_minutes\":60},\"coin_equivalent\":4400,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L3P1\",\"layer\":3,\"position\":1,\"chest\":false,\"reward\":{\"wand\":25},\"coin_equivalent\":7500,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P2\",\"layer\":3,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":40},\"coin_equivalent\":8000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P3\",\"layer\":3,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":12},\"coin_equivalent\":7200,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L3P4\",\"layer\":3,\"position\":4,\"chest\":true,\"reward\":{\"coins\":3600,\"infinite_minutes\":120},\"coin_equivalent\":8400,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L4P1\",\"layer\":4,\"position\":1,\"chest\":false,\"reward\":{\"coins\":11300},\"coin_equivalent\":11300,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P2\",\"layer\":4,\"position\":2,\"chest\":false,\"reward\":{\"infinite_minutes\":300},\"coin_equivalent\":12000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P3\",\"layer\":4,\"position\":3,\"chest\":true,\"reward\":{\"hammer\":14,\"freeze\":20},\"coin_equivalent\":12400,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P1\",\"layer\":5,\"position\":1,\"chest\":true,\"reward\":{\"hammer\":18,\"freeze\":18,\"wand\":18},\"coin_equivalent\":19800,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P2\",\"layer\":5,\"position\":2,\"chest\":true,\"reward\":{\"coins\":9600,\"infinite_minutes\":240},\"coin_equivalent\":19200,\"reward_class\":\"chest\"}\n ]\n },\n {\n \"tier_id\": 3,\n \"price_fen_by_layer\": [\n 0,\n 1200,\n 1800,\n 3000,\n 4800\n ],\n \"total_coin_equivalent\": 211800,\n \"slots\": [\n {\"slot_id\":\"L1P1\",\"layer\":1,\"position\":1,\"chest\":false,\"reward\":{\"hammer\":1},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P2\",\"layer\":1,\"position\":2,\"chest\":false,\"reward\":{\"coins\":250},\"coin_equivalent\":250,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P3\",\"layer\":1,\"position\":3,\"chest\":false,\"reward\":{\"freeze\":2},\"coin_equivalent\":400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P4\",\"layer\":1,\"position\":4,\"chest\":false,\"reward\":{\"coins\":350},\"coin_equivalent\":350,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P5\",\"layer\":1,\"position\":5,\"chest\":false,\"reward\":{\"wand\":1},\"coin_equivalent\":300,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P6\",\"layer\":1,\"position\":6,\"chest\":false,\"reward\":{\"infinite_minutes\":15},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P1\",\"layer\":2,\"position\":1,\"chest\":false,\"reward\":{\"coins\":7600},\"coin_equivalent\":7600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P2\",\"layer\":2,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":40},\"coin_equivalent\":8000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P3\",\"layer\":2,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":12},\"coin_equivalent\":7200,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L2P4\",\"layer\":2,\"position\":4,\"chest\":false,\"reward\":{\"wand\":28},\"coin_equivalent\":8400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P5\",\"layer\":2,\"position\":5,\"chest\":true,\"reward\":{\"coins\":4000,\"infinite_minutes\":120},\"coin_equivalent\":8800,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L3P1\",\"layer\":3,\"position\":1,\"chest\":false,\"reward\":{\"wand\":40},\"coin_equivalent\":12000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P2\",\"layer\":3,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":60},\"coin_equivalent\":12000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P3\",\"layer\":3,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":18},\"coin_equivalent\":10800,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L3P4\",\"layer\":3,\"position\":4,\"chest\":true,\"reward\":{\"coins\":7300,\"infinite_minutes\":120},\"coin_equivalent\":12100,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L4P1\",\"layer\":4,\"position\":1,\"chest\":false,\"reward\":{\"coins\":19500},\"coin_equivalent\":19500,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P2\",\"layer\":4,\"position\":2,\"chest\":false,\"reward\":{\"infinite_minutes\":480},\"coin_equivalent\":19200,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P3\",\"layer\":4,\"position\":3,\"chest\":true,\"reward\":{\"hammer\":25,\"freeze\":30},\"coin_equivalent\":21000,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P1\",\"layer\":5,\"position\":1,\"chest\":true,\"reward\":{\"hammer\":35,\"freeze\":30,\"wand\":15},\"coin_equivalent\":31500,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P2\",\"layer\":5,\"position\":2,\"chest\":true,\"reward\":{\"coins\":16800,\"infinite_minutes\":360},\"coin_equivalent\":31200,\"reward_class\":\"chest\"}\n ]\n },\n {\n \"tier_id\": 4,\n \"price_fen_by_layer\": [\n 0,\n 1800,\n 3000,\n 4800,\n 6800\n ],\n \"total_coin_equivalent\": 322400,\n \"slots\": [\n {\"slot_id\":\"L1P1\",\"layer\":1,\"position\":1,\"chest\":false,\"reward\":{\"hammer\":1},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P2\",\"layer\":1,\"position\":2,\"chest\":false,\"reward\":{\"coins\":250},\"coin_equivalent\":250,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P3\",\"layer\":1,\"position\":3,\"chest\":false,\"reward\":{\"freeze\":2},\"coin_equivalent\":400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P4\",\"layer\":1,\"position\":4,\"chest\":false,\"reward\":{\"coins\":350},\"coin_equivalent\":350,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L1P5\",\"layer\":1,\"position\":5,\"chest\":false,\"reward\":{\"wand\":1},\"coin_equivalent\":300,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L1P6\",\"layer\":1,\"position\":6,\"chest\":false,\"reward\":{\"infinite_minutes\":15},\"coin_equivalent\":600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P1\",\"layer\":2,\"position\":1,\"chest\":false,\"reward\":{\"coins\":11400},\"coin_equivalent\":11400,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P2\",\"layer\":2,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":60},\"coin_equivalent\":12000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P3\",\"layer\":2,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":18},\"coin_equivalent\":10800,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L2P4\",\"layer\":2,\"position\":4,\"chest\":false,\"reward\":{\"wand\":42},\"coin_equivalent\":12600,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L2P5\",\"layer\":2,\"position\":5,\"chest\":true,\"reward\":{\"coins\":6000,\"infinite_minutes\":180},\"coin_equivalent\":13200,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L3P1\",\"layer\":3,\"position\":1,\"chest\":false,\"reward\":{\"wand\":65},\"coin_equivalent\":19500,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P2\",\"layer\":3,\"position\":2,\"chest\":false,\"reward\":{\"freeze\":100},\"coin_equivalent\":20000,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L3P3\",\"layer\":3,\"position\":3,\"chest\":false,\"reward\":{\"hammer\":30},\"coin_equivalent\":18000,\"reward_class\":\"reduced\"},\n {\"slot_id\":\"L3P4\",\"layer\":3,\"position\":4,\"chest\":true,\"reward\":{\"coins\":10800,\"infinite_minutes\":240},\"coin_equivalent\":20400,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L4P1\",\"layer\":4,\"position\":1,\"chest\":false,\"reward\":{\"coins\":31200},\"coin_equivalent\":31200,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P2\",\"layer\":4,\"position\":2,\"chest\":false,\"reward\":{\"infinite_minutes\":720},\"coin_equivalent\":28800,\"reward_class\":\"normal\"},\n {\"slot_id\":\"L4P3\",\"layer\":4,\"position\":3,\"chest\":true,\"reward\":{\"hammer\":40,\"freeze\":60},\"coin_equivalent\":36000,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P1\",\"layer\":5,\"position\":1,\"chest\":true,\"reward\":{\"hammer\":48,\"freeze\":40,\"wand\":24},\"coin_equivalent\":44000,\"reward_class\":\"chest\"},\n {\"slot_id\":\"L5P2\",\"layer\":5,\"position\":2,\"chest\":true,\"reward\":{\"coins\":22800,\"infinite_minutes\":480},\"coin_equivalent\":42000,\"reward_class\":\"chest\"}\n ]\n }\n ]\n}", + "policyJson": "{\n \"tier_policy_version\": \"pyramid_tier_20261010_1\",\n \"formula_id\": \"pyramid_cost_ticket_confidence_v2\",\n \"catalog_version\": \"pyramid_catalog_20261010_1\",\n \"feedback_epoch\": \"pyramid_feedback_20260929_6\",\n \"max_reference_days\": 7,\n \"budget_share\": 1,\n \"total_ticket_base\": 1,\n \"total_ticket_confidence_gain\": 2,\n \"peak_ticket_base\": 1,\n \"peak_ticket_confidence_gain\": 1,\n \"budget_to_peak_share\": 0.5,\n \"recency_soft_days\": 15,\n \"recency_soft_factor\": 0.75,\n \"returning_days\": 30,\n \"never_paid_tier\": 1,\n \"returning_tier\": 1,\n \"minimum_tier\": 1,\n \"min_remaining_hours_for_new_instance\": 2,\n \"unknown_profile_action\": \"hold_new_instance\",\n \"expected_completion_cost_fen_ceil\": [\n 7621,\n 12331,\n 20446,\n 31276\n ],\n \"peak_draw_price_fen\": [\n 1800,\n 3000,\n 4800,\n 6800\n ],\n \"evidence\": {\n \"weights\": {\n \"normal\": 1,\n \"same_activity_repeat\": 1,\n \"legacy_dominant_30\": 0.2,\n \"pass_or_month_card\": 0.25,\n \"first_purchase_discount\": 0.25,\n \"contextual_revive_or_other_mission\": 0.5,\n \"any_refunded_order\": 0,\n \"test_order\": 0\n },\n \"repeat_effective_days\": 2,\n \"q_gain\": 1,\n \"q_full_effective_days\": 4,\n \"higher_ticket_blend\": 0.5,\n \"missing_ticket_prior_fen\": 600,\n \"weighted_median_tie\": \"lower\"\n },\n \"spend\": {\n \"min_denominator_days\": 7,\n \"trend_gain\": 0.3,\n \"trend_min\": 0.75,\n \"trend_max\": 1.25\n },\n \"feedback\": {\n \"mode\": \"apply_to_new_instance\",\n \"success_anchor_days\": 30,\n \"success_anchor_require_completed\": true,\n \"success_anchor_recency_days_exclusive\": 15,\n \"failure_lookback_days\": 30,\n \"failed_instances_required\": 2,\n \"cap_valid_days\": 30,\n \"cap_use_limit\": 1,\n \"min_price_detail_views\": 1,\n \"min_remaining_hours_at_first_view\": 2,\n \"min_followup_sessions\": 2,\n \"min_session_gap_minutes\": 30,\n \"refunded_instance_action\": \"neutral\",\n \"pending_payment_action\": \"wait_reconciliation\"\n },\n \"exploration\": {\n \"probability\": 0,\n \"direction\": \"next_higher_adjacent_tier\",\n \"recency_days_exclusive\": 15,\n \"cost_allowance_multiplier\": 1.25,\n \"peak_allowance_multiplier\": 1.25,\n \"randomization\": \"server_hmac_user_campaign_experiment_version\"\n },\n \"valuation\": {\n \"coins\": 1,\n \"freeze\": 200,\n \"hammer\": 600,\n \"wand\": 300,\n \"infinite_minutes\": 40\n },\n \"reward_limits\": {\n \"non_chest_paid_min_equivalent_per_yuan\": 600,\n \"non_chest_paid_max_equivalent_per_yuan\": 800,\n \"chest_paid_min_equivalent_per_yuan\": 600,\n \"chest_paid_max_equivalent_per_yuan\": 800,\n \"require_identical_free_layer\": true,\n \"require_decreasing_layer_expected_ratio\": true,\n \"minimum_total_equivalent_per_expected_yuan\": null,\n \"total_ratio_status\": \"previous_1200_target_unmet_under_corrected_limits\"\n }\n}", + "catalogHash": "bf26b1bc70741d8b8f3f26e2e90f6331a6033300cba8fb331eed7dc5278aa307", + "policyHash": "3a7d1d00a54e76a245f4460344bb86cea9069ebc4aed88f6e78a5ec09a92bd5a", + "featureSchemaVersion": "verified_payment_features_1", + "evidenceVersion": "weighted_order_days_1", + "skuClassificationVersion": "payment_sku_evidence_1", + "resourceMappingVersion": "pyramid_resource_ids_1", + "experimentVersion": "pyramid_exploration_off_1" + } + } +}