@wowok/agent-mcp 3.0.4 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -20
- package/dist/customer/account-events.js +1 -1
- package/dist/evaluation/path-reasoning.d.ts +4 -2
- package/dist/evaluation/path-reasoning.js +1 -1
- package/dist/extensions/constraint-registry.d.ts +2 -2
- package/dist/extensions/constraint-registry.js +1 -1
- package/dist/extensions/custom-registry-file.d.ts +22 -0
- package/dist/extensions/custom-registry-file.js +1 -0
- package/dist/extensions/index.d.ts +2 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-pack.d.ts +7 -0
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/metric-registry.d.ts +2 -2
- package/dist/extensions/metric-registry.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/extensions/registry.d.ts +2 -2
- package/dist/extensions/registry.js +1 -1
- package/dist/extensions/types.d.ts +4 -0
- package/dist/goal/GoalEngine.d.ts +13 -1
- package/dist/goal/GoalEngine.js +1 -1
- package/dist/goal/next-steps.d.ts +12 -0
- package/dist/goal/next-steps.js +1 -0
- package/dist/goal/pursue.d.ts +18 -0
- package/dist/goal/pursue.js +1 -0
- package/dist/goal/types.d.ts +72 -0
- package/dist/goal/types.js +1 -1
- package/dist/graph/onchain/analyze.d.ts +44 -0
- package/dist/graph/onchain/analyze.js +1 -0
- package/dist/graph/onchain/analyze.spec.d.ts +1 -0
- package/dist/graph/onchain/analyze.spec.js +1 -0
- package/dist/graph/onchain/anti-cheat.d.ts +39 -0
- package/dist/graph/onchain/anti-cheat.js +1 -0
- package/dist/graph/onchain/anti-cheat.spec.d.ts +1 -0
- package/dist/graph/onchain/anti-cheat.spec.js +1 -0
- package/dist/graph/onchain/dataplane.d.ts +44 -0
- package/dist/graph/onchain/dataplane.js +1 -0
- package/dist/graph/onchain/edge-schema.d.ts +60 -0
- package/dist/graph/onchain/edge-schema.js +1 -0
- package/dist/graph/onchain/expand.d.ts +4 -0
- package/dist/graph/onchain/expand.js +1 -0
- package/dist/graph/onchain/extract.d.ts +21 -0
- package/dist/graph/onchain/extract.js +1 -0
- package/dist/graph/onchain/index.d.ts +17 -0
- package/dist/graph/onchain/index.js +1 -0
- package/dist/graph/onchain/interest.d.ts +10 -0
- package/dist/graph/onchain/interest.js +1 -0
- package/dist/graph/onchain/interest.spec.d.ts +1 -0
- package/dist/graph/onchain/interest.spec.js +1 -0
- package/dist/graph/onchain/onchain.spec.d.ts +1 -0
- package/dist/graph/onchain/onchain.spec.js +1 -0
- package/dist/graph/onchain/order-status.d.ts +53 -0
- package/dist/graph/onchain/order-status.js +1 -0
- package/dist/graph/onchain/project-relationship.d.ts +3 -0
- package/dist/graph/onchain/project-relationship.js +1 -0
- package/dist/graph/onchain/sdk-batch.d.ts +123 -0
- package/dist/graph/onchain/sdk-batch.js +1 -0
- package/dist/graph/onchain/sdk-dataplane.d.ts +43 -0
- package/dist/graph/onchain/sdk-dataplane.js +1 -0
- package/dist/graph/onchain/strategy.d.ts +54 -0
- package/dist/graph/onchain/strategy.js +1 -0
- package/dist/graph/onchain/strategy.spec.d.ts +1 -0
- package/dist/graph/onchain/strategy.spec.js +1 -0
- package/dist/graph/onchain/types.d.ts +238 -0
- package/dist/graph/onchain/types.js +1 -0
- package/dist/graph/onchain/viewport.d.ts +5 -0
- package/dist/graph/onchain/viewport.js +1 -0
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/intent/enrich.js +1 -1
- package/dist/keeper/detectors.d.ts +1 -1
- package/dist/keeper/detectors.js +1 -1
- package/dist/knowledge/account-marks.js +1 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/anti-cheat.d.ts +2 -37
- package/dist/knowledge/anti-cheat.js +1 -1
- package/dist/knowledge/contract-invariants.js +1 -1
- package/dist/knowledge/getting-started.d.ts +37 -0
- package/dist/knowledge/getting-started.js +1 -0
- package/dist/knowledge/goal-completion.d.ts +12 -0
- package/dist/knowledge/goal-completion.js +1 -1
- package/dist/knowledge/guard-render.d.ts +1 -0
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-submission-brief.d.ts +83 -0
- package/dist/knowledge/guard-submission-brief.js +1 -0
- package/dist/knowledge/guard-submission-prompt.d.ts +13 -0
- package/dist/knowledge/guard-submission-prompt.js +1 -1
- package/dist/knowledge/index.d.ts +10 -4
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.d.ts +91 -0
- package/dist/knowledge/industry-strategy.js +1 -0
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/market-metrics.d.ts +14 -3
- package/dist/knowledge/market-metrics.js +1 -1
- package/dist/knowledge/migration-preflight.js +1 -1
- package/dist/knowledge/operation-dictionary.d.ts +1 -1
- package/dist/knowledge/payment-tracker.d.ts +63 -0
- package/dist/knowledge/payment-tracker.js +1 -0
- package/dist/knowledge/recipient-constraint.d.ts +160 -0
- package/dist/knowledge/recipient-constraint.js +1 -0
- package/dist/knowledge/safety-rules.d.ts +1 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-topology.d.ts +6 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-risk-node.d.ts +3 -0
- package/dist/knowledge/service-risk-node.js +1 -0
- package/dist/knowledge/service-risk.d.ts +2 -0
- package/dist/knowledge/service-risk.js +1 -1
- package/dist/knowledge/service-templates.d.ts +2 -0
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/strategy-manuals.d.ts +17 -0
- package/dist/knowledge/strategy-manuals.js +1 -0
- package/dist/knowledge/supply-chain.d.ts +3 -1
- package/dist/knowledge/supply-chain.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +3 -118
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.d.ts +4 -0
- package/dist/knowledge/workspace-lists.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/monitor/ScopeResolver.js +1 -1
- package/dist/participation/arbitrator-interest.d.ts +2 -0
- package/dist/participation/arbitrator-interest.js +1 -1
- package/dist/participation/collaborator-interest.d.ts +2 -0
- package/dist/participation/collaborator-interest.js +1 -1
- package/dist/participation/customer-interest.d.ts +2 -0
- package/dist/participation/customer-interest.js +1 -1
- package/dist/participation/merchant-interest.d.ts +2 -0
- package/dist/participation/merchant-interest.js +1 -1
- package/dist/participation/radar-core.d.ts +15 -15
- package/dist/participation/radar-core.js +1 -1
- package/dist/participation/supplier-interest.d.ts +2 -0
- package/dist/participation/supplier-interest.js +1 -1
- package/dist/persona/analyzer.d.ts +2 -1
- package/dist/persona/bridge.d.ts +5 -1
- package/dist/persona/bridge.js +1 -1
- package/dist/persona/defaults.js +1 -1
- package/dist/persona/distill-goal.d.ts +7 -1
- package/dist/persona/distill-goal.js +1 -1
- package/dist/persona/index.d.ts +13 -3
- package/dist/persona/index.js +1 -1
- package/dist/persona/model.d.ts +12 -2
- package/dist/persona/model.js +1 -1
- package/dist/persona/overrides.d.ts +1 -0
- package/dist/persona/overrides.js +1 -1
- package/dist/persona/topology-focus.d.ts +29 -0
- package/dist/persona/topology-focus.js +1 -0
- package/dist/persona/types.d.ts +81 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/context-assembly.js +1 -1
- package/dist/playbooks/service-build/machine-nodes.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +7 -0
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
- package/dist/playbooks/service-build/pipeline-actions.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.d.ts +1 -0
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/risk-aggregator.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +4 -0
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/topology-query.d.ts +14 -0
- package/dist/playbooks/service-build/topology-query.js +1 -0
- package/dist/relationship/derivation.js +1 -1
- package/dist/role/index.d.ts +1 -0
- package/dist/role/index.js +1 -1
- package/dist/role/profiles.d.ts +26 -0
- package/dist/role/profiles.js +1 -0
- package/dist/safety/confirm-gate.d.ts +4 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/call/allocation.d.ts +6 -6
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +1 -1
- package/dist/schema/call/guard.d.ts +20 -20
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +4 -4
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/employee/index.d.ts +7 -7
- package/dist/schema/evaluation/index.d.ts +26 -13
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +53 -17
- package/dist/schema/goal/index.js +1 -1
- package/dist/schema/goal/planning.d.ts +7 -7
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +13 -6
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/industry-pack/modes.d.ts +6 -6
- package/dist/schema/intent-radar/index.d.ts +16 -16
- package/dist/schema/local/index.d.ts +8 -4
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +428 -72
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +177 -34
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +15744 -1
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +891 -24
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +168 -43
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-query/index.d.ts +16 -0
- package/dist/schema/schema-query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/strategy-review/index.d.ts +137 -0
- package/dist/schema/strategy-review/index.js +1 -0
- package/dist/schema/trust/index.d.ts +6 -6
- package/dist/schema/workflow/index.d.ts +2 -2
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +8 -4
- package/dist/schemas/account_operation.schema.json +6 -2
- package/dist/schemas/bridge_operation.schema.json +10 -10
- package/dist/schemas/evaluation_operation.output.json +24 -0
- package/dist/schemas/evaluation_operation.schema.json +7 -7
- package/dist/schemas/goal_operation.schema.json +124 -0
- package/dist/schemas/guard2file.schema.json +2 -2
- package/dist/schemas/index.json +7 -1
- package/dist/schemas/industry_pack_operation.output.json +39 -0
- package/dist/schemas/local_mark_operation.schema.json +2 -2
- package/dist/schemas/machineNode2file.schema.json +2 -2
- package/dist/schemas/messenger_operation.output.json +934 -236
- package/dist/schemas/messenger_operation.schema.json +93 -242
- package/dist/schemas/onchain_events.schema.json +1 -1
- package/dist/schemas/onchain_operations.schema.json +54 -54
- package/dist/schemas/onchain_operations_allocation.schema.json +5 -5
- package/dist/schemas/onchain_operations_arbitration.schema.json +2 -2
- package/dist/schemas/onchain_operations_contact.schema.json +2 -2
- package/dist/schemas/onchain_operations_demand.schema.json +2 -2
- package/dist/schemas/onchain_operations_gen_passport.schema.json +2 -2
- package/dist/schemas/onchain_operations_gen_proof.schema.json +2 -2
- package/dist/schemas/onchain_operations_guard.schema.json +2 -2
- package/dist/schemas/onchain_operations_machine.schema.json +8 -8
- package/dist/schemas/onchain_operations_order.schema.json +2 -2
- package/dist/schemas/onchain_operations_payment.schema.json +3 -3
- package/dist/schemas/onchain_operations_permission.schema.json +2 -2
- package/dist/schemas/onchain_operations_personal.schema.json +2 -2
- package/dist/schemas/onchain_operations_progress.schema.json +2 -2
- package/dist/schemas/onchain_operations_proof.schema.json +2 -2
- package/dist/schemas/onchain_operations_repository.schema.json +5 -5
- package/dist/schemas/onchain_operations_reward.schema.json +2 -2
- package/dist/schemas/onchain_operations_service.schema.json +5 -5
- package/dist/schemas/onchain_operations_treasury.schema.json +4 -4
- package/dist/schemas/onchain_table_data.output.json +197 -13
- package/dist/schemas/onchain_table_data.schema.json +43 -43
- package/dist/schemas/persona_operation.output.json +37778 -262
- package/dist/schemas/persona_operation.schema.json +5960 -1
- package/dist/schemas/query_toolkit.output.json +1615 -10
- package/dist/schemas/query_toolkit.schema.json +232 -42
- package/dist/schemas/schema_query.schema.json +25 -1
- package/dist/schemas/strategy_review_operation.output.json +532 -0
- package/dist/schemas/strategy_review_operation.schema.json +66 -0
- package/dist/schemas/wowok_buildin_info.output.json +188 -6
- package/dist/schemas/wowok_buildin_info.schema.json +14 -0
- package/dist/strategy/collectors.d.ts +66 -0
- package/dist/strategy/collectors.js +1 -0
- package/dist/strategy/collectors.spec.d.ts +1 -0
- package/dist/strategy/collectors.spec.js +1 -0
- package/dist/strategy/index.d.ts +5 -0
- package/dist/strategy/index.js +1 -0
- package/dist/strategy/metrics.d.ts +20 -0
- package/dist/strategy/metrics.js +1 -0
- package/dist/strategy/review.d.ts +48 -0
- package/dist/strategy/review.js +1 -0
- package/dist/strategy/scorecard.d.ts +32 -0
- package/dist/strategy/scorecard.js +1 -0
- package/dist/strategy/store.d.ts +26 -0
- package/dist/strategy/store.js +1 -0
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/goal.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/permission.js +1 -1
- package/dist/tools/handlers/persona.js +1 -1
- package/dist/tools/handlers/query.d.ts +6 -0
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/strategy-review.d.ts +2 -0
- package/dist/tools/handlers/strategy-review.js +1 -0
- package/dist/tools/handlers/watch.js +1 -1
- package/dist/tools/handlers/workflow.js +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +1 -1
- package/dist/tools/registry/agent.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/local.js +1 -1
- package/dist/tools/registry/messenger.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/rules-hook.d.ts +2 -0
- package/dist/tools/rules-hook.js +1 -1
- package/dist/tools/shared.d.ts +2 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type Industry } from "../persona/types.js";
|
|
2
|
+
import type { StrategicPosture } from "../persona/types.js";
|
|
3
|
+
export type MerchantStage = "cold_start" | "growing" | "mature" | "optimization";
|
|
4
|
+
export interface PricingModel {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
applicable_when: string;
|
|
8
|
+
upside: string;
|
|
9
|
+
risks: string;
|
|
10
|
+
wowok_levers: string[];
|
|
11
|
+
recommended?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface PosturePlaybook {
|
|
14
|
+
posture: StrategicPosture;
|
|
15
|
+
thesis: string;
|
|
16
|
+
tradeoffs: string;
|
|
17
|
+
guardrails: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface CompetitorWatch {
|
|
20
|
+
dimensions: string[];
|
|
21
|
+
cadence: "weekly" | "biweekly" | "monthly";
|
|
22
|
+
cadence_days: number;
|
|
23
|
+
differentiation: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface ChannelPriority {
|
|
26
|
+
channel: string;
|
|
27
|
+
priority: number;
|
|
28
|
+
rationale: string;
|
|
29
|
+
}
|
|
30
|
+
export interface AcquisitionStrategy {
|
|
31
|
+
channels: ChannelPriority[];
|
|
32
|
+
campaign_paradigm: string;
|
|
33
|
+
reward_orientation: string;
|
|
34
|
+
discount_orientation: string;
|
|
35
|
+
}
|
|
36
|
+
export interface UnitEconomics {
|
|
37
|
+
formula: string;
|
|
38
|
+
anchors: {
|
|
39
|
+
metric: string;
|
|
40
|
+
value: string;
|
|
41
|
+
}[];
|
|
42
|
+
target_margin_pct_min?: number;
|
|
43
|
+
cost_floor: string;
|
|
44
|
+
breakeven_note?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SuccessPattern {
|
|
47
|
+
pattern: string;
|
|
48
|
+
evidence: string;
|
|
49
|
+
}
|
|
50
|
+
export interface IndustryStrategy {
|
|
51
|
+
industry: Industry;
|
|
52
|
+
benchmark: string;
|
|
53
|
+
priority_tier: 1 | 2 | 3;
|
|
54
|
+
launch_window: string;
|
|
55
|
+
pricing: {
|
|
56
|
+
models: PricingModel[];
|
|
57
|
+
default_model_id: string;
|
|
58
|
+
};
|
|
59
|
+
postures: Record<StrategicPosture, PosturePlaybook>;
|
|
60
|
+
competitor_watch: CompetitorWatch;
|
|
61
|
+
acquisition: AcquisitionStrategy;
|
|
62
|
+
conversion_retention: string[];
|
|
63
|
+
unit_economics: UnitEconomics;
|
|
64
|
+
success_patterns: SuccessPattern[];
|
|
65
|
+
red_lines: string[];
|
|
66
|
+
sources: string[];
|
|
67
|
+
}
|
|
68
|
+
export interface StrategyMetrics {
|
|
69
|
+
order_count?: number;
|
|
70
|
+
repeat_customer_rate?: number;
|
|
71
|
+
dispute_rate?: number;
|
|
72
|
+
gmv?: number;
|
|
73
|
+
trust_score?: number;
|
|
74
|
+
completion_rate?: number;
|
|
75
|
+
}
|
|
76
|
+
export interface StrategyRecommendation {
|
|
77
|
+
industry: Industry;
|
|
78
|
+
posture: StrategicPosture;
|
|
79
|
+
stage: MerchantStage;
|
|
80
|
+
pricing_model_id: string;
|
|
81
|
+
pricing_model_name: string;
|
|
82
|
+
actions: string[];
|
|
83
|
+
}
|
|
84
|
+
export declare const INDUSTRY_STRATEGIES: IndustryStrategy[];
|
|
85
|
+
export declare function registerIndustryStrategy(strategy: IndustryStrategy): void;
|
|
86
|
+
export declare function unregisterIndustryStrategy(industry: string): boolean;
|
|
87
|
+
export declare function getIndustryStrategy(industry: string): IndustryStrategy | undefined;
|
|
88
|
+
export declare function listIndustryStrategies(): IndustryStrategy[];
|
|
89
|
+
export declare function stageFromOrderCount(orderCount: number): MerchantStage;
|
|
90
|
+
export declare function recommendStrategy(industry: string, posture?: StrategicPosture, stage?: MerchantStage, metrics?: StrategyMetrics): StrategyRecommendation | null;
|
|
91
|
+
export declare function validateStrategyLevers(strategy: IndustryStrategy): string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ROLE_MOVE_MECHANISMS}from'../role/profiles.js';import{SUPPORTED_INDUSTRIES}from'../persona/types.js';const LEVER_WHITELIST=new Set(ROLE_MOVE_MECHANISMS);export const INDUSTRY_STRATEGIES=[{'industry':'education','benchmark':'Coursera\x20/\x20Outschool','priority_tier':0x1,'launch_window':'M1–M3','pricing':{'default_model_id':'per_lesson_escrow','models':[{'id':'per_lesson_escrow','name':'Per-lesson\x20escrow\x20release','applicable_when':'Attendance-based\x20tutoring/courses\x20delivered\x20in\x20N\x20lessons\x20(the\x20core\x20education\x20fit).','upside':'Prepaid\x20tuition\x20never\x20lands\x20with\x20the\x20institution;\x20each\x20lesson\x20fee\x20releases\x20on\x20the\x20parent\x27s\x20attendance\x20signature\x20in\x20seconds;\x20withdrawal\x20refunds\x20unearned\x20lessons\x20in\x20one\x20transaction.','risks':'Requires\x20an\x20attendance-confirmable\x20scenario;\x20purely\x20recorded/self-paced\x20courses\x20are\x20a\x20mismatch\x20(route\x20to\x20subscription).','wowok_levers':['Allocator','Guard','Machine','Order'],'recommended':!![]},{'id':'package_prepaid_raterelease','name':'Package\x20price\x20with\x20rate-based\x20release','applicable_when':'30-lesson\x20packages\x20/\x20term\x20packages\x20where\x20the\x20family\x20pays\x20once\x20up\x20front.','upside':'High\x20AOV\x20(~¥3,000\x20anchor)\x20while\x20funds\x20release\x201/N\x20per\x20completed\x20lesson\x20—\x20the\x20\x27unearned\x20tuition\x20can\x20never\x20be\x20embezzled\x27\x20guarantee\x20is\x20verifiable\x20on-chain.','risks':'Must\x20declare\x20refund\x20policy\x20up\x20front;\x20setting_lock_duration\x20should\x20lock\x20the\x20fee\x20schedule\x20(default\x2030\x20days).','wowok_levers':['Allocator','Guard','CompensationFund','Arbitration']},{'id':'trial_then_enroll','name':'Trial-class\x20conversion\x20price','applicable_when':'Cold-start\x20acquisition\x20of\x20parents\x20via\x20a\x20single\x20low-commitment\x20trial\x20lesson.','upside':'Trial\x20class\x20in\x20escrow,\x20remainder\x20only\x20after\x20the\x20parent\x20signs\x20enrollment;\x20pairs\x20with\x20referral\x20reward.','risks':'Trial\x20discount\x20must\x20stay\x20above\x20hard\x20delivery\x20cost;\x20not\x20a\x20perpetual\x20loss\x20leader.','wowok_levers':['Reward','Allocator','Guard']}]},'postures':{'volume':{'posture':'volume','thesis':'Maximize\x20enrolled\x20families\x20via\x20group-buy\x20/\x20early-bird\x20and\x20KOC\x20parent\x20communities;\x20trust\x20transparency\x20is\x20the\x20conversion\x20weapon.','tradeoffs':'Lower\x20per-seat\x20margin;\x20heavier\x20campaign/operations\x20load\x20in\x20M1–M2.','guardrails':['Never\x20discount\x20below\x20per-lesson\x20delivery\x20cost','Keep\x20arbitration\x20bound\x20and\x20compensation\x20fund\x20covered\x20at\x20every\x20promo\x20tier','Per-lesson\x20escrow\x20release\x20is\x20mandatory\x20even\x20on\x20discounted\x20packages']},'balanced':{'posture':'balanced','thesis':'Mix\x20institutional\x20direct\x20sales\x20(high-AOV\x20compliance\x20positioning)\x20with\x20parent-community\x20KOC\x20growth.','tradeoffs':'Slower\x20than\x20pure\x20volume,\x20lower\x20margin\x20ceiling\x20than\x20premium\x20small-class.','guardrails':['Per-lesson\x20escrow\x20release\x20mandatory','Refund\x20policy\x20declared\x20before\x20payment','Recorded-only\x20products\x20routed\x20to\x20subscription,\x20not\x20sold\x20as\x20attendance\x20courses']},'margin':{'posture':'margin','thesis':'Sell\x20compliance\x20itself\x20to\x20mid-size\x20institutions:\x20on-chain\x20custody\x20as\x20a\x20competitive\x20moat,\x20premium\x20positioning\x20to\x20burned-by-failure\x20parents.','tradeoffs':'Long\x20BD\x20cycles\x20(¥1,500–3,000\x20cost\x20per\x20signed\x20institution),\x20few\x20but\x20large\x20accounts.','guardrails':['Do\x20not\x20soften\x20escrow/fund\x20requirements\x20to\x20win\x20a\x20large\x20account','\x27Protocol\x20custody\x27\x20claims\x20need\x20the\x20locked\x20fee\x20schedule\x20to\x20back\x20them']}},'competitor_watch':{'dimensions':['headline\x20price\x20vs\x20escrow\x20structure','arbitration\x20availability','compensation\x20fund\x20coverage','per-lesson\x20release\x20granularity','refund-window\x20terms'],'cadence':'weekly','cadence_days':0x7,'differentiation':['Compete\x20on\x20verifiable\x20fund\x20safety\x20(parents\x20can\x20read\x20the\x20Allocation\x20themselves),\x20never\x20on\x20headline\x20discount','Lead\x20with\x20\x27teacher\x20settlement\x20in\x20seconds\x27\x20to\x20attract师资\x20as\x20well\x20as\x20parents']},'acquisition':{'channels':[{'channel':'Parent-rights\x20/\x20local\x20parent\x20KOC\x20communities','priority':0x1,'rationale':'The\x20angry\x20stock\x20from\x20tuition-failure\x20cases\x20concentrates\x20here;\x20trust\x20products\x20sell\x20through\x20trusted\x20channels\x20(¥30–80\x20per\x20paying\x20parent).'},{'channel':'Institutional\x20direct\x20BD\x20(1:1)','priority':0x2,'rationale':'Supply\x20side\x20decides\x20the\x20two-sided\x20cold\x20start;\x20one\x20institution\x20brings\x20its\x20whole\x20parent\x20base.'},{'channel':'Industry\x20media\x20/\x20policy\x20white-papers','priority':0x3,'rationale':'Zero-ad\x20spend\x20endorsement\x20during\x20the\x20next\x20regulatory\x20news\x20cycle.'},{'channel':'Paid\x20ads','priority':0x4,'rationale':'Conflicts\x20with\x20the\x20trust\x20narrative;\x20do\x20not\x20use\x20within\x20the\x20first\x2090\x20days.'}],'campaign_paradigm':'Two\x2090-day\x20campaigns:\x20(A)\x20\x27tuition\x20transparency\x20experiment\x27\x20—\x20two\x20parallel\x20classes,\x20traditional\x20vs\x20escrow,\x20open\x20on-chain\x20comparison,\x20parent\x20open-day\x20live\x20withdrawal\x20refund\x20demo;\x20(B)\x20\x27regulatory\x20answer\x27\x20white-paper\x20on\x20protocol\x20custody,\x20no\x20ads.','reward_orientation':'Milestone\x20(course\x20completion)\x20reward\x20+\x20referral\x20cashback;\x20trial-class\x20discount\x20as\x20the\x20cold-start\x20hook.','discount_orientation':'Early-bird\x20and\x20group-buy\x20only\x20during\x20campaign\x20windows;\x20student-aid\x20discount\x20as\x20targeted,\x20not\x20blanket,\x20price\x20cuts.'},'conversion_retention':['Show\x20the\x20escrow\x20contract\x20balance\x20and\x20per-lesson\x20release\x20records\x20before\x20payment\x20(on-chain\x20verification\x20page).','Convert\x20trial\x20families\x20with\x20the\x20live\x20\x27unearned\x20funds\x20are\x20still\x20yours\x27\x20demonstration.','Renew\x20via\x20per-lesson\x20release\x20history\x20+\x20attendance\x20record;\x20sibling/referral\x20reward\x20beats\x20discounting.'],'unit_economics':{'formula':'extra\x20per\x20order\x20=\x20legacy\x20platform\x20fee\x20rate\x20×\x20AOV\x20−\x20(WoW\x20gas\x20+\x20keeper\x20amortization\x20+\x20one-time\x20migration\x20cost)','anchors':[{'metric':'AOV\x20anchor\x20(30-lesson\x20package)','value':'¥3,000'},{'metric':'Legacy\x20combined\x20fee','value':'Outschool\x2030%\x20≈\x20¥900/order'},{'metric':'WoW\x20per-order\x20cost\x20(N+2\x20txns)','value':'gas\x20≈\x20$0.05–2.5'},{'metric':'Extra\x20earnings\x20per\x20order','value':'≈\x20¥890'}],'target_margin_pct_min':0x19,'cost_floor':'Never\x20price\x20a\x20package\x20below\x20total\x20teacher-cost-per-lesson\x20×\x20lessons;\x20compensation\x20fund\x20must\x20stay\x20covered.','breakeven_note':'Migration/setup\x20cost\x20amortizes\x20over\x20the\x20first\x20package;\x20gas\x20is\x20negligible\x20vs\x20¥900\x20saved.'},'success_patterns':[{'pattern':'Run\x20the\x20parallel-class\x20transparency\x20experiment\x20with\x20one\x20anchor\x20institution\x20and\x20open\x20all\x20escrow\x20data.','evidence':'KPI:\x201\x20anchor,\x20≥30\x20escrow\x20orders,\x20verifiable\x20case\x20piece,\x20parent\x20NPS\x20≥60.'},{'pattern':'Sign\x20institutions\x20through\x20direct\x20BD\x20and\x20let\x20each\x20bring\x20its\x20parent\x20base.','evidence':'90-day\x20gate:\x20≥10\x20institutions\x20beyond\x20the\x20seed;\x20BD\x20cost\x20¥1,500–3,000\x20each.'},{'pattern':'Ship\x20the\x20≤10-dialogue\x20templated\x20onboarding\x20(attendance\x20guard\x20+\x20rate\x20release\x20+\x20lock\x20duration).','evidence':'K1/04\x20validated\x20education\x20shop\x20build\x20in\x2011\x20dialogues.'},{'pattern':'Hold\x20the\x2090-day\x20quality\x20gate\x20before\x20scaling\x20spend.','evidence':'Gate:\x20≥20\x20published\x20Services\x20across\x20tier-1\x20industries,\x20>25%\x20first-to-repeat\x20rate,\x20100%\x20on-chain\x20dispute\x20closure.'}],'red_lines':['Route\x20recorded/self-paced\x20courses\x20to\x20subscription\x20—\x20never\x20sell\x20them\x20as\x20attendance\x20escrow.','Never\x20imply\x20the\x20structure\x20prevents\x20bad\x20teaching;\x20it\x20prevents\x20fund\x20embezzlement\x20(honest\x20boundary).','Marketing\x20figures\x20are\x20fiat-denominated;\x20carry\x20the\x20testnet/estimate/WOW-price\x20disclaimers.'],'sources':['wiki/market/K1/05-商业化/02-六行业商业模式深度论证与落地执行手册.md\x20§3','wiki/market/K1/01-行业分析/教育-Coursera.md']},{'industry':'rental','benchmark':'Airbnb\x20/\x20Turo\x20/\x20Getaround','priority_tier':0x1,'launch_window':'M1–M3','pricing':{'default_model_id':'rent_deposit_bundled_escrow','models':[{'id':'rent_deposit_bundled_escrow','name':'Rent\x20+\x20deposit\x20bundled\x20escrow,\x20three-path\x20settlement','applicable_when':'High-value\x20low-frequency\x20rentals\x20(camera\x20gear,\x20machinery,\x20outdoor\x20equipment)\x20and\x20P2P\x20stays\x20with\x20damage\x20disputes.','upside':'Rent\x20and\x20real\x20deposit\x20(not\x20a\x20card\x20auth)\x20are\x20escrowed;\x20three\x20mutually\x20exclusive\x20Allocator\x20paths\x20(clean\x20return\x20/\x20cancellation\x20/\x20graded\x20damage)\x20settle\x20in\x20one\x20~3-second\x20transaction.','risks':'Pre-rental\x20WIP\x20baseline\x20is\x20mandatory\x20—\x20without\x20it\x20the\x20damage\x20guard\x20cannot\x20pass\x20and\x20the\x20value\x20proposition\x20collapses.','wowok_levers':['Allocator','Guard','Machine','WIP','Arbitration'],'recommended':!![]},{'id':'graded_damage_allocator','name':'Pre-agreed\x20graded\x20damage\x20deduction','applicable_when':'Continuous\x20damage\x20amounts\x20(e.g.\x20$347.50\x20claims)\x20need\x20fairness\x20ex\x20ante.','upside':'Light\x2020%\x20/\x20heavy\x2050%\x20/\x20total\x20100%\x20brackets\x20fixed\x20before\x20rental;\x20micro-arbitration\x20only\x20for\x20bracket\x20assignment.','risks':'Brackets\x20must\x20be\x20disclosed\x20and\x20accepted\x20at\x20order\x20time.','wowok_levers':['Allocator','Guard','Arbitration']},{'id':'duration_discount','name':'Long-duration\x20discount\x20ladder','applicable_when':'Idle\x20inventory\x20with\x20low\x20marginal\x20wear\x20cost.','upside':'Monthly\x2010%\x20/\x20quarterly\x2020%\x20/\x20annual\x2030%\x20ladder\x20raises\x20utilization\x20without\x20touching\x20deposit\x20safety.','risks':'Discount\x20must\x20remain\x20above\x20maintenance+depreciation\x20cost\x20per\x20period.','wowok_levers':['Reward','Allocator']}]},'postures':{'volume':{'posture':'volume','thesis':'Win\x20utilization\x20and\x20repeat\x20rentals\x20via\x20credit-accumulation\x20rewards\x20and\x20long-duration\x20discounts;\x20lead\x20supply-side\x20signup\x20with\x20deposit\x20escrow\x20as\x20the筛选器.','tradeoffs':'Thinner\x20per-rental\x20margin;\x20keeper\x20subsidy\x20in\x20seed\x20months.','guardrails':['Pre-rental\x20WIP\x20baseline\x20guard\x20never\x20skipped\x20even\x20for\x20promo\x20rentals','Deposit\x20must\x20be\x20really\x20funded\x20(no\x20zero-deposit\x20waivers\x20in\x20volume\x20mode)']},'balanced':{'posture':'balanced','thesis':'Seed\x20~10\x20vertical\x20merchants\x20with\x20templated\x20builds;\x20balance\x20utilization\x20promos\x20against\x20the\x20verified-case\x20marketing\x20asset.','tradeoffs':'Moderate\x20growth,\x20moderate\x20subsidy\x20($20/mo\x20keeper\x20per\x20seed\x20merchant).','guardrails':['All\x20three\x20settlement\x20paths\x20configured\x20on\x20every\x20published\x20service','Independent\x20arbitration\x20bound']},'margin':{'posture':'margin','thesis':'Premium\x20positioning\x20for\x20high-value\x20equipment:\x20renters\x20pay\x20for\x20real,\x20on-chain-verifiable\x20deposit\x20safety\x20and\x203-second\x20returns.','tradeoffs':'Smaller\x20renter\x20pool;\x20longer\x20trust-building\x20cycle.','guardrails':['Never\x20shorten\x20evidence\x20requirements\x20to\x20speed\x20up\x20a\x20premium\x20rental','Damage\x20brackets\x20stay\x20pre-agreed\x20—\x20no\x20discretionary\x20deductions']}},'competitor_watch':{'dimensions':['rent\x20price','whether\x20deposit\x20is\x20actually\x20held\x20(vs\x20card\x20auth)','pre-rental\x20evidence\x20requirement','refund\x20speed','arbitration\x20independence'],'cadence':'biweekly','cadence_days':0xe,'differentiation':['The\x20three\x20k1rent\x20Payment\x20transactions\x20are\x20the\x20marketing:\x20anyone\x20can\x20audit\x20them','Damage\x20claims\x20cannot\x20be\x20weaponized\x20via\x20reviews\x20—\x20settlement\x20is\x20independent\x20of\x20the\x20rating\x20system']},'acquisition':{'channels':[{'channel':'Vertical\x20communities\x20(photography\x20/\x20machinery\x20/\x20outdoor\x20KOC\x20groups)','priority':0x1,'rationale':'Damage-dispute\x20pain\x20is\x20concentrated\x20here\x20(¥50–120\x20per\x20renter-side\x20user).'},{'channel':'Competitors\x27\x20official\x20documents','priority':0x2,'rationale':'Cite\x20Airbnb\x27s\x202026\x20AI-image\x20claim\x20ban\x20and\x20Getaround\x27s\x20shutdown\x20—\x20opponent\x20copy\x20is\x20the\x20best\x20copy.'},{'channel':'On-chain\x20case\x20marketing\x20(auditable\x20rental\x20page)','priority':0x3,'rationale':'\x27Audit\x20this\x20rental\x20yourself\x27\x20open\x20day.'},{'channel':'Second-hand\x20marketplace\x20dispute\x20threads','priority':0x4,'rationale':'Intercept\x20existing\x20pain\x20(\x27this\x20dispute\x20could\x20not\x20happen\x20on\x20WoW\x27).'}],'campaign_paradigm':'(A)\x20\x27Audit\x20this\x20ledger\x20yourself\x27\x20open\x20day\x20around\x20the\x20k1rent\x2010-node\x20machine\x20+\x20three\x20payments;\x20(B)\x20recruit\x2010\x20seed\x20merchants,\x20keeper\x20+\x20first-order\x20gas\x20subsidy\x20for\x203\x20months.','reward_orientation':'Credit\x20accumulation\x20across\x20rentals\x20+\x20referral\x20cashback;\x20rewards\x20tied\x20to\x20verified\x20completed\x20rentals,\x20not\x20signups.','discount_orientation':'Duration\x20ladder\x20(monthly/quarterly/annual);\x20no\x20blanket\x20price\x20cuts.'},'conversion_retention':['Make\x20pre-rental\x20WIP\x20capture\x20a\x20guided,\x20frictionless\x20step\x20—\x20it\x20is\x20the\x20trust\x20moment,\x20not\x20paperwork.','Show\x20historical\x20settlement\x20transactions\x20to\x20first-time\x20renters\x20before\x20they\x20fund.','Re-rental\x20via\x20accumulated\x20credit;\x20long-duration\x20discount\x20ladder\x20for\x20inventory\x20utilization.'],'unit_economics':{'formula':'extra\x20per\x20order\x20=\x20legacy\x20commission\x20rate\x20×\x20rental\x20value\x20−\x20(WoW\x20gas\x20+\x20keeper\x20$5–20/mo\x20amortization)','anchors':[{'metric':'AOV\x20anchor\x20(camera,\x203\x20days)','value':'$200'},{'metric':'Legacy\x20host-side\x20commission','value':'15.5%\x20≈\x20$31/order'},{'metric':'WoW\x20full-cycle\x20cost\x20(k1rent\x20empirical)','value':'≈\x200.05\x20WOW\x20≈\x20¥0.35\x20(5–7\x20txns)'},{'metric':'Deposit\x20refund\x20speed','value':'7–15\x20business\x20days\x20→\x20≈3\x20seconds'}],'target_margin_pct_min':0x1e,'cost_floor':'Rental\x20price\x20must\x20cover\x20maintenance\x20+\x20depreciation\x20+\x20bracket-expected\x20damage;\x20deposit\x20never\x20lent\x20against.','breakeven_note':'At\x20$200\x20AOV\x20the\x20saved\x20$31\x20commission\x20dwarfs\x20gas\x20and\x20keeper\x20cost\x20from\x20the\x20first\x20order.'},'success_patterns':[{'pattern':'Publish\x20the\x20three\x20immutable\x20settlement\x20Payments\x20(clean\x20/\x20cancel\x20/\x20damage)\x20as\x20an\x20interactive\x20audit\x20page.','evidence':'KPI:\x20≥5,000\x20audit-page\x20UV,\x203\x20inbound\x20merchants,\x201\x20organic\x20KOC\x20retelling.'},{'pattern':'Onboard\x2010\x20equipment-rental\x20merchants\x20from\x20the\x20vertical\x20template\x20within\x203\x20months.','evidence':'Gate:\x2010\x20published\x20Services,\x20≥100\x20cumulative\x20orders,\x20zero\x20escalated\x20disputes\x20(all\x20closed\x20via\x20guard\x20or\x20micro-arbitration).'},{'pattern':'Enforce\x20pre-rental\x20WIP\x20baseline\x20as\x20a\x20hard\x20node,\x20turning\x20the\x2020%→70%\x20claim\x20rejection\x20curve\x20upside\x20down.','evidence':'Without\x20baseline\x20evidence\x20traditional\x20platforms\x20reject\x2020%;\x20with\x20missing-date\x20evidence\x20they\x20reject\x2070%.'},{'pattern':'Make\x20keeper\x20auto-return\x20reminders\x20standard\x20onboarding,\x20priced\x20transparently\x20at\x20$5–20/mo.','evidence':'Honest-boundary\x20requirement\x20from\x20k1rent\x20rollout.'}],'red_lines':['Never\x20claim\x20\x27contract-enforced\x27\x20arbitration\x20independence\x20without\x20negative-test\x20backing\x20(P-5\x20lesson).','Damage\x20deduction\x20without\x20pre-rental\x20baseline\x20is\x20forbidden\x20(guard\x20must\x20fail).','Never\x20hide\x20the\x20keeper\x20subscription\x20cost.'],'sources':['wiki/market/K1/05-商业化/02-六行业商业模式深度论证与落地执行手册.md\x20§4','wiki/market/K1/01-行业分析/租赁-Airbnb.md']},{'industry':'freelance','benchmark':'Upwork','priority_tier':0x2,'launch_window':'M2–M4','pricing':{'default_model_id':'milestone_escrow_accept','models':[{'id':'milestone_escrow_accept','name':'Milestone\x20escrow\x20with\x20acceptance\x20signature','applicable_when':'Project-based\x20design/translation/dev/copy\x20work\x20deliverable\x20in\x20milestones.','upside':'Funds\x20escrowed\x20at\x20signing;\x20deliver_guard_wip\x20anchors\x20each\x20delivery;\x20client\x20acceptance\x20signature\x20releases\x20in\x20seconds;\x2014-day\x20silence\x20auto-accepts\x20via\x20time\x20guard\x20+\x20keeper.','risks':'Milestones\x20must\x20be\x20objectively\x20verifiable;\x20vague\x20acceptance\x20criteria\x20invite\x20disputes.','wowok_levers':['Allocator','Guard','Machine','WIP','Progress'],'recommended':!![]},{'id':'fixed_deliverable','name':'Fixed-price\x20deliverable\x20with\x20revision\x20loops','applicable_when':'Single-deliverable\x20jobs\x20(logo,\x20translation,\x20article).','upside':'Revision\x20rounds\x20modeled\x20as\x20machine\x20loops;\x20micro-arbitration\x20available\x20at\x20ANY\x20amount.','risks':'Cap\x20revision\x20rounds\x20up\x20front\x20to\x20avoid\x20scope\x20creep.','wowok_levers':['Machine','Guard','Arbitration']},{'id':'demand_reverse_match','name':'Demand-based\x20reverse\x20bidding','applicable_when':'Client\x20posts\x20a\x20Demand\x20and\x20freelancers\x20present;\x20discovery\x20without\x20connect\x20fees.','upside':'Zero\x20bid-entry\x20cost\x20(vs\x20$48–120\x20first-order\x20Connects\x20burn)\x20and\x20~60%\x20zero-reply\x20proposals\x20avoided.','risks':'Presenter\x20quality\x20gating\x20via\x20passport/trust\x20evidence.','wowok_levers':['Demand','DemandPresenter','Passport','Guard']}]},'postures':{'volume':{'posture':'volume','thesis':'Win\x20order\x20count\x20through\x20Demand\x20participation\x20and\x20first-order\x20speed;\x20carry\x20portable\x20Passport\x20reputation\x20across\x20clients.','tradeoffs':'Smaller\x20milestones,\x20more\x20concurrent\x20clients.','guardrails':['Every\x20milestone\x20escrowed\x20before\x20work\x20starts','Never\x20start\x20work\x20on\x20an\x20unescrowed\x20\x27trusted\x20client\x27\x20promise']},'balanced':{'posture':'balanced','thesis':'Mix\x20Demand\x20bidding\x20with\x20referral\x20clients;\x20standardize\x20milestone\x20templates\x20to\x20cut\x20admin\x20time.','tradeoffs':'Moderate\x20pipeline;\x20time\x20invested\x20in\x20WIP\x20evidence\x20discipline.','guardrails':['Auto-accept\x20time\x20guard\x20configured','Arbitration\x20bound\x20even\x20on\x20small\x20jobs\x20(cost\x20is\x20trivial)']},'margin':{'posture':'margin','thesis':'Premium\x20positioning\x20via\x20public\x20on-chain\x20delivery\x20history\x20and\x20WIP\x20quality;\x20refuse\x20hourly-monitoring\x20clients.','tradeoffs':'Fewer,\x20larger\x20projects;\x20longer\x20sales\x20conversation.','guardrails':['Never\x20accept\x20work\x20that\x20requires\x20process\x20surveillance\x20(philosophy\x20mismatch)','Milestone\x20granularity\x20protects\x20margin\x20—\x20no\x20all-or-nothing\x20delivery']}},'competitor_watch':{'dimensions':['effective\x20fee\x20after\x20tiered\x20cuts','escrow\x20availability','settlement\x20speed','arbitration\x20fee\x20floor','reputation\x20portability'],'cadence':'biweekly','cadence_days':0xe,'differentiation':['Portable\x20Passport\x20credentials\x20vs\x20locked\x20JSS','Arbitration\x20at\x20sub-$700\x20values\x20—\x20the\x20exact\x20segment\x20incumbents\x20structurally\x20abandon','Outcome\x20verification\x20(WIP)\x20instead\x20of\x20screen\x20monitoring']},'acquisition':{'channels':[{'channel':'r/freelance,\x20Indie\x20Hackers,\x20nomad\x20communities','priority':0x1,'rationale':'Fee-fatigued\x20mid/long-tail\x20freelancers;\x20est.\x20$3–8\x20per\x20registered\x20freelancer.'},{'channel':'Design/translation\x20vertical\x20communities','priority':0x2,'rationale':'High\x20milestone-delivery\x20fit.'},{'channel':'Demand\x20reverse-match\x20events','priority':0x3,'rationale':'Crack\x20the\x20demand\x20side\x20with\x20real\x20bounties.'},{'channel':'KOC\x20income-transparency\x20program','priority':0x4,'rationale':'5–8\x20mid-tier\x20creators\x20publishing\x20Upwork\x20vs\x20WoW\x20income\x20with\x20auditable\x20addresses\x20after\x20≥20\x20merchants\x20exist.'}],'campaign_paradigm':'\x27$699\x20Arbitration\x20Clinic\x27\x20(M2–M3,\x20only\x20after\x20≥20\x20merchants):\x20publicly\x20resolve\x20sub-$700\x20disputes\x20on-chain,\x20weekly\x20micro-arbitration\x20documentary;\x20KOC\x20transparent-income\x20program\x20with\x20on-chain\x20settlement.','reward_orientation':'Referral\x20and\x20repeat-client\x20rewards;\x20KOC\x20payouts\x20auto-split\x20via\x20Allocation\x20after\x20verified\x20first-order\x20conversion.','discount_orientation':'No\x20fee-discounting\x20narrative\x20—\x20the\x20platform\x20fee\x20is\x20already\x20~0;\x20compete\x20on\x20escrow/arbitration\x20value.'},'conversion_retention':['Convert\x20prospects\x20by\x20showing\x20WIP\x20hashes\x20of\x20similar\x20completed\x20milestones.','Propose\x203–5\x20milestone\x20splits\x20in\x20the\x20first\x20proposal\x20—\x20it\x20signals\x20professionalism\x20and\x20de-risks\x20the\x20client.','Retain\x20via\x20Passport:\x20every\x20clean\x20completion\x20is\x20a\x20portable\x20credential,\x20explicitly\x20say\x20so\x20at\x20delivery.'],'unit_economics':{'formula':'extra\x20per\x20order\x20=\x20legacy\x20fee\x20rate\x20×\x20contract\x20value\x20+\x20avoided\x20connect/arbitration\x20fees\x20−\x20WoW\x20gas','anchors':[{'metric':'AOV\x20anchor\x20(milestone\x20contract)','value':'$1,000'},{'metric':'Legacy\x20take\x20rate','value':'Upwork\x2015.4%\x20≈\x20$154\x20(+\x20client\x203–7.99%)'},{'metric':'Bid\x20entry\x20cost','value':'Connects\x20$48–120\x20first-order;\x20~60%\x20of\x20proposals\x20get\x20no\x20reply'},{'metric':'WoW\x20cost\x20(4–8\x20txns)','value':'gas\x20≈\x20$0.01–0.6;\x20arbitration\x20≈\x20$0.01\x20vs\x20$337.50/party'},{'metric':'Settlement\x20speed','value':'up\x20to\x2027\x20days\x20→\x20seconds\x20on\x20acceptance\x20signature'}],'target_margin_pct_min':0x28,'cost_floor':'Milestone\x20price\x20must\x20cover\x20the\x20quoted\x20hours\x20at\x20the\x20freelancer\x27s\x20minimum\x20hourly\x20rate;\x20no\x20unpaid\x20spec\x20work\x20beyond\x20one\x20proposal.','breakeven_note':'One\x20$1,000\x20contract\x20saves\x20≈$153\x20—\x20adoption\x20pays\x20on\x20the\x20first\x20escrowed\x20job.'},'success_patterns':[{'pattern':'Run\x20the\x20\x27$699\x20Arbitration\x20Clinic\x27\x20with\x20≥10\x20closed\x20micro-arbitrations\x20and\x20publish\x20weekly\x20documentaries.','evidence':'KPI:\x20avg\x20read\x20≥3,000/episode;\x20arbitrator\x20pool\x20≥15.'},{'pattern':'Sign\x205–8\x20mid-tier\x20KOCs\x20with\x20income-guarantee\x20top-ups,\x20settled\x20on-chain\x20after\x20conversion.','evidence':'KPI:\x20≥30\x20registered\x20freelancers\x20per\x20KOC;\x20on-chain\x20conversion\x20≥8%.'},{'pattern':'Standardize\x20the\x2014-day\x20silence\x20auto-acceptance\x20guard\x20on\x20every\x20service.','evidence':'Eliminates\x20the\x20\x27client\x20disappears,\x20funds\x20locked\x27\x20failure\x20mode\x20without\x20weakening\x20buyer\x20protection.'},{'pattern':'Turn\x20down\x20hourly-surveillance\x20clients\x20explicitly.','evidence':'Outcome\x20verification\x20philosophy\x20is\x20the\x20differentiation\x20against\x20Work\x20Diary\x20monitoring.'}],'red_lines':['Do\x20not\x20start\x20work\x20before\x20the\x20milestone\x20is\x20escrowed.','Do\x20not\x20promote\x20reputation\x20portability\x20(Passport)\x20before\x20the\x20issuance\x20UX\x20is\x20production-ready.','Never\x20bid\x20below\x20minimum-rate\x20floor\x20to\x20win\x20volume.'],'sources':['wiki/market/K1/05-商业化/02-六行业商业模式深度论证与落地执行手册.md\x20§5','wiki/market/K1/01-行业分析/自由职业-Upwork.md']},{'industry':'travel','benchmark':'Booking\x20/\x20TUI','priority_tier':0x3,'launch_window':'M4+','pricing':{'default_model_id':'multi_segment_release','models':[{'id':'multi_segment_release','name':'Multi-leg\x20itinerary\x20with\x20per-segment\x20release','applicable_when':'Custom/multi-segment\x20packaged\x20trips\x20by\x20small\x20studios\x20(TUI-fit\x2010/10).','upside':'segment_D1..DN\x20machine;\x20each\x20segment\x27s\x20WIP\x20releases\x20its\x20fee;\x20interrupted\x20segments\x20refund\x20in\x20one\x20transaction;\x20fund\x20waterfall\x20fully\x20auditable.','risks':'Sub-providers\x20(hotels/drivers)\x20need\x20not\x20be\x20on-chain\x20initially\x20—\x20the\x20agent\x20is\x20the\x20single\x20on-chain\x20counterparty;\x20adoption\x20bottleneck\x20is\x20why\x20travel\x20is\x20tier\x203.','wowok_levers':['Machine','Allocator','Treasury','Guard','WIP'],'recommended':!![]},{'id':'agent_single_custody','name':'Agent\x20single-counterparty\x20custody','applicable_when':'Downstream\x20suppliers\x20are\x20not\x20on-chain\x20yet.','upside':'Agent↔client\x20escrow\x20closes\x20the\x20trust\x20loop\x20alone;\x20supplier\x20participation\x20grows\x20with\x20network\x20effects.','risks':'Agent\x20must\x20hold\x20correct\x20licensing\x20and\x20fund\x20the\x20compensation\x20coverage.','wowok_levers':['Allocator','Treasury','CompensationFund','Arbitration']},{'id':'weather_guarantee','name':'Weather/condition-guarded\x20pricing','applicable_when':'Weather-sensitive\x20segments\x20can\x20reference\x20an\x20evidence\x20repository.','upside':'Auto-refund\x20triggers\x20via\x20quoted\x20guard\x20+\x20repository\x20oracle\x20—\x20a\x20feature\x20no\x20OTA\x20offers.','risks':'Guard\x20trigger\x20source\x20must\x20be\x20specified\x20and\x20tested\x20before\x20sale.','wowok_levers':['Guard','Allocator','Repository']}]},'postures':{'volume':{'posture':'volume','thesis':'Postpone;\x20volume\x20play\x20only\x20after\x20tier-1/2\x20Passport\x20network\x20lowers\x20cold-start\x20cost.','tradeoffs':'High\x20coordination\x20cost\x20across\x20sub-providers.','guardrails':['Never\x20sell\x20standard\x20standalone\x20flights/hotels\x20(weak\x20WoW\x20value)','Undelivered\x20segments\x20always\x20refundable\x20via\x20the\x20interrupted\x20path']},'balanced':{'posture':'balanced','thesis':'Pilot\x20with\x202–3\x20custom-trip\x20studios\x20on\x20single-counterparty\x20custody;\x20prove\x20the\x20waterfall\x20story.','tradeoffs':'Few\x20pilots,\x20heavy\x20case-building\x20effort\x20($10–15K\x20pilot\x20budget).','guardrails':['Fund\x20waterfall\x20visible\x20to\x20the\x20buyer\x20before\x20payment','Cancellation\x20policy\x20per\x20leg\x20declared\x20up\x20front']},'margin':{'posture':'margin','thesis':'Premium\x20bespoke\x20itineraries\x20priced\x20on\x20trust\x20architecture\x20and\x20transparent\x20waterfall,\x20not\x20OTA\x20discounting.','tradeoffs':'Small\x20high-AOV\x20audience.','guardrails':['Refundable\x20vs\x20non-refundable\x20legs\x20separated\x20explicitly','Never\x20commingle\x20undelivered-segment\x20funds\x20with\x20operating\x20cash']}},'competitor_watch':{'dimensions':['effective\x20commission\x20after\x20Preferred/Genius','waterfall\x20transparency','cancellation\x20terms\x20per\x20leg','downstream\x20refund\x20handling\x20(e.g.\x20EU261\x20gaps)','settlement\x20speed'],'cadence':'monthly','cadence_days':0x1e,'differentiation':['The\x20$2,000\x20waterfall\x20split\x20across\x20hotel/guide/agent\x20is\x20inspectable\x20before\x20purchase','Pre-event\x20isolation\x20vs\x20Thomas-Cook-style\x20post-hoc\x20relief']},'acquisition':{'channels':[{'channel':'Custom-trip\x20studio\x20direct\x20partnerships','priority':0x1,'rationale':'Only\x20segment\x20with\x2010/10\x20fit;\x202–3\x20pilot\x20studios.'},{'channel':'Travel-industry\x20failure\x20news\x20cycles','priority':0x2,'rationale':'Thomas\x20Cook\x20£400M\x20/\x20pandemic\x20$35B\x20refund\x20stories\x20anchor\x20pre-isolation\x20demand.'},{'channel':'Waterfall/weather\x20demo\x20content','priority':0x3,'rationale':'Interactive\x20fund-split\x20and\x20auto-refund\x20demos.'}],'campaign_paradigm':'\x27Transparent\x20waterfall\x27\x20demo\x20($2,000\x20split\x20readable\x20on-chain)\x20+\x20weather-guard\x20auto-refund\x20demo;\x20$10–15K\x20for\x202–3\x20studio\x20pilots,\x20M4–M6.','reward_orientation':'Referral\x20commission\x20for\x20repeat/referral\x20custom\x20trips;\x20flash-sale\x20rewards\x20only\x20for\x20off-peak\x20clearance.','discount_orientation':'Early-bird\x20/\x20group\x20/\x20member\x20pricing\x20within\x20seasons;\x20never\x20discount\x20by\x20hiding\x20non-refundable\x20legs.'},'conversion_retention':['Sell\x20the\x20pre-trip\x20inspection\x20of\x20the\x20entire\x20fund\x20waterfall\x20as\x20the\x20core\x20asset.','Convert\x20with\x20the\x20interrupted-segment\x20one-transaction\x20refund\x20demo.','Re-book\x20via\x20itinerary\x20history\x20and\x20per-leg\x20transparency,\x20not\x20loyalty\x20points.'],'unit_economics':{'formula':'extra\x20per\x20trip\x20=\x20effective\x20OTA\x20commission\x20×\x20trip\x20value\x20−\x20(WoW\x20gas\x20across\x202×segments+3\x20txns)','anchors':[{'metric':'AOV\x20anchor\x20(5-segment\x20custom\x20trip)','value':'$2,000'},{'metric':'Effective\x20legacy\x20commission','value':'25–36%\x20≈\x20$350–720/trip'},{'metric':'WoW\x20cost','value':'gas\x20≈\x20$0.02–1'},{'metric':'Settlement\x20speed','value':'VCC\x202–6\x20weeks\x20→\x20per-segment\x20seconds'}],'target_margin_pct_min':0x23,'cost_floor':'Never\x20collect\x20funds\x20for\x20unbooked\x20legs\x20without\x20the\x20interrupted\x20refund\x20path;\x20compensation\x20coverage\x20sized\x20for\x20max\x20single-segment\x20value.','breakeven_note':'Gas\x20is\x20noise\x20against\x20$350–700\x20saved\x20per\x20trip;\x20the\x20binding\x20constraint\x20is\x20supplier\x20adoption,\x20not\x20economics.'},'success_patterns':[{'pattern':'Pilot\x202–3\x20custom-trip\x20studios\x20with\x20agent-only\x20custody\x20first.','evidence':'Avoids\x20the\x20sub-provider\x20on-chain\x20bottleneck\x20that\x20justifies\x20tier-3\x20timing.'},{'pattern':'Ship\x20the\x20interactive\x20$2,000\x20waterfall\x20visualization\x20as\x20the\x20sales\x20asset.','evidence':'Buys\x20on\x20chain-visible\x20split\x20—\x20unique\x20vs\x20every\x20OTA.'},{'pattern':'Use\x20a\x20weather\x20repository\x20guard\x20for\x20automatic\x20segment\x20refund\x20in\x20one\x20marketed\x20demo.','evidence':'Converts\x20an\x20abstract\x20\x27escrow\x27\x20claim\x20into\x20a\x20visible\x20guarantee.'}],'red_lines':['Do\x20not\x20enter\x20standard\x20flight/hotel\x20resale\x20—\x20WoW\x20value\x20is\x20weak\x20there.','Never\x20market\x20large\x20cross-period\x20custody\x20before\x20stablecoin\x20bridging\x20is\x20ready.','Cross-leg\x20responsibility\x20must\x20be\x20disclosed,\x20not\x20blurred.'],'sources':['wiki/market/K1/05-商业化/02-六行业商业模式深度论证与落地执行手册.md\x20§7','wiki/market/K1/01-行业分析/旅游-Booking.md']},{'industry':'retail','benchmark':'Amazon\x20/\x20Etsy','priority_tier':0x3,'launch_window':'M4+','pricing':{'default_model_id':'receipt_confirmed_escrow','models':[{'id':'receipt_confirmed_escrow','name':'Escrow\x20released\x20on\x20confirmed\x20receipt','applicable_when':'Private-traffic\x20sellers\x20(DTC\x20site\x20/\x20community\x20commerce)\x20who\x20already\x20own\x20demand.','upside':'Funds\x20release\x20seconds\x20after\x20receipt\x20guard;\x20return_auth_guard\x20gates\x20fraudulent\x20returns;\x20provenance\x20via\x20repository\x20chain.','risks':'Zero-traffic\x20sellers\x20are\x20a\x20deliberate\x20mismatch\x20—\x20WoW\x20does\x20not\x20replace\x20marketplace\x20demand\x20generation.','wowok_levers':['Allocator','Guard','Repository','Arbitration','CompensationFund'],'recommended':!![]},{'id':'member_bundle_pricing','name':'Member/bundle\x20pricing\x20for\x20private\x20communities','applicable_when':'Community-commerce\x20sellers\x20with\x20repeat\x20purchase\x20cadence.','upside':'Spend-threshold\x20and\x20member\x20pricing\x20via\x20rewards\x20instead\x20of\x20platform\x20TACoS.','risks':'Bundles\x20must\x20still\x20be\x20escrowed\x20per\x20deliverable;\x20no\x20pre-shipment\x20release.','wowok_levers':['Reward','Allocator']}]},'postures':{'volume':{'posture':'volume','thesis':'Turn\x20existing\x20private-traffic\x20flow\x20into\x20escrow\x20GMV;\x20first-order\x20and\x20spend-threshold\x20rewards\x20maximize\x20repeat.','tradeoffs':'Thin\x20unit\x20margin\x20—\x20viable\x20only\x20because\x20gas\x20is\x20<$1\x20per\x20$1,000\x20GMV.','guardrails':['Receipt\x20confirmation\x20guard\x20never\x20bypassed','Compensation\x20fund\x20coverage\x20ratio\x20default\x205×\x20max\x20single\x20order']},'balanced':{'posture':'balanced','thesis':'Pilot\x205–8\x20private-domain\x20sellers;\x20use\x20the\x20gas-bill\x20livestream\x20as\x20the\x20core\x20proof\x20asset.','tradeoffs':'Moderate\x20growth\x20gated\x20by\x20existing\x20audience\x20size.','guardrails':['Return-auth\x20evidence\x20(dual\x20signature\x20/\x20logistics\x20repository)\x20required','Configurable\x20arbitration\x20voting\x20period']},'margin':{'posture':'margin','thesis':'Premium\x20provenance/proven-authenticity\x20selling:\x20repository\x20chain\x20+\x20escrow\x20as\x20anti-counterfeit\x20proof.','tradeoffs':'Niche\x20audience;\x20authenticity\x20verification\x20operations\x20cost.','guardrails':['Never\x20claim\x20authenticity\x20beyond\x20what\x20repository\x20evidence\x20proves','No\x20reserve-period\x20exposure\x20of\x20funds\x20to\x20the\x20seller\x20pre-receipt']}},'competitor_watch':{'dimensions':['headline\x20price','settlement\x20reserve\x20policy','return-fraud\x20handling','arbitration\x20default\x20rulings','provenance\x20evidence'],'cadence':'weekly','cadence_days':0x7,'differentiation':['Settlement\x20in\x20seconds\x20vs\x2014\x20days\x20+\x20DD+90\x20reserve\x20risk','Return\x20fraud\x20requires\x20dual-signed/logistics\x20evidence\x20instead\x20of\x20A-to-z\x20default\x20buyer\x20wins','\x27You\x20pay\x2030%\x20for\x20traffic\x20or\x20trust\x20—\x20we\x20provide\x20trust,\x20you\x20bring\x20traffic\x27']},'acquisition':{'channels':[{'channel':'Existing\x20private-traffic\x20sellers\x20(DTC,\x20community,\x20We-commerce)','priority':0x1,'rationale':'\x27Have\x20traffic,\x20trust\x20is\x20expensive\x27\x20is\x20the\x20filter;\x20zero-traffic\x20sellers\x20are\x20turned\x20away\x20at\x20intake.'},{'channel':'Etsy-refugee\x20targeting','priority':0x2,'rationale':'24.2%\x20fee-increase\x20victim\x20communities.'},{'channel':'Live\x20gas-bill\x20comparison\x20events','priority':0x3,'rationale':'\x27$1,000\x20GMV\x20cost\x20teardown\x27:\x20same\x20shop,\x20WoW\x20vs\x20Amazon\x20$300–350.'}],'campaign_paradigm':'\x27$1,000\x20GMV\x20cost\x27\x20livestream\x20with\x20public\x20full-cycle\x20gas\x20accounting;\x20targeted\x20Etsy-refugee\x20recruitment;\x20$6–10K\x20pilot\x20for\x205–8\x20sellers,\x20M4–M6.','reward_orientation':'First-order\x20discount\x20+\x20spend\x20cashback\x20+\x20spend-threshold\x20rewards\x20inside\x20the\x20owned\x20community.','discount_orientation':'Threshold/limited/member\x20discounts\x20only;\x20no\x20marketplace-style\x20bidding\x20wars.'},'conversion_retention':['Make\x20receipt-confirmation\x20the\x20one-tap\x20trust\x20moment;\x20show\x20release\x20seconds\x20later.','Re-purchase\x20via\x20spend\x20cashback\x20and\x20provenance\x20certificates.','Convert\x20return-averse\x20buyers\x20with\x20the\x20return-auth\x20evidence\x20flow\x20up\x20front.'],'unit_economics':{'formula':'extra\x20per\x20$1,000\x20GMV\x20=\x20legacy\x20combined\x20burden\x20−\x20WoW\x20gas\x20(4–6\x20txns)','anchors':[{'metric':'AOV\x20anchor\x20(private\x20domain)','value':'$50'},{'metric':'Legacy\x20combined\x20burden','value':'Amazon\x2030–35%\x20≈\x20$300–350\x20per\x20$1,000\x20GMV'},{'metric':'WoW\x20cost\x20per\x20$1,000\x20GMV','value':'gas\x20≈\x20$0.01–0.5\x20(<\x20$1)'},{'metric':'Return\x20rate\x20/\x20fraud\x20share','value':'19.3%\x20returns\x20/\x209%\x20fraudulent\x20under\x20incumbent\x20flow'}],'target_margin_pct_min':0x14,'cost_floor':'Never\x20price\x20below\x20COGS\x20+\x20shipping\x20+\x20expected-return-provision;\x20fund\x20coverage\x205×\x20max\x20single\x20order.','breakeven_note':'Economics\x20work\x20at\x20almost\x20any\x20AOV;\x20traffic\x20availability\x20is\x20the\x20only\x20admission\x20criterion.'},'success_patterns':[{'pattern':'Use\x20the\x20honest-boundary\x20intake\x20questionnaire\x20to\x20reject\x20zero-traffic\x20sellers.','evidence':'Raises\x20conversion\x20quality;\x20WoW\x20does\x20not\x20sell\x20traffic\x20(40.5%\x20share\x20value\x20stays\x20with\x20Amazon).\x20'},{'pattern':'Run\x20the\x20public\x20\x27$1,000\x20GMV\x20gas\x20bill\x27\x20livestream\x20with\x20the\x20same\x20shop\x27s\x20orders.','evidence':'Contrasts\x20$300–350\x20incumbent\x20burden\x20vs\x20<$1\x20on-chain\x20cost.'},{'pattern':'Enforce\x20dual-signature/logistics\x20return\x20evidence\x20to\x20structurally\x20raise\x20fraud\x20cost.','evidence':'Targets\x20the\x209%\x20fraudulent\x20share\x20of\x20the\x2019.3%\x20return\x20rate.'},{'pattern':'Recruit\x20Etsy\x20fee-hike\x20refugees\x20directly\x20from\x20victim\x20communities.','evidence':'24.2%\x20unilateral\x20fee\x20increase\x20is\x20the\x20triggering\x20event.'}],'red_lines':['Never\x20promise\x20traffic\x20—\x20WoW\x20is\x20trust\x20infrastructure,\x20not\x20a\x20marketplace\x20demand\x20source.','No\x20auto-default\x20buyer-win\x20rulings;\x20arbitration\x20voting\x20period\x20must\x20be\x20configured.','Physical\x20authenticity\x20claims\x20require\x20repository\x20evidence.'],'sources':['wiki/market/K1/05-商业化/02-六行业商业模式深度论证与落地执行手册.md\x20§8','wiki/market/K1/01-行业分析/零售-Amazon.md']},{'industry':'subscription','benchmark':'Patreon\x20/\x20OnlyFans\x20/\x20Apple\x20IAP','priority_tier':0x2,'launch_window':'M2–M4','pricing':{'default_model_id':'per_period_signed_charge','models':[{'id':'per_period_signed_charge','name':'Per-period\x20signed\x20charge\x20with\x20delivery\x20gate','applicable_when':'Creator\x20memberships,\x20newsletters,\x20indie\x20software\x20—\x20recurring\x20digital\x20value.','upside':'charge_guard_signer\x20requires\x20explicit\x20signature\x20every\x20period;\x20deliver_guard_wip\x20blocks\x20the\x20charge\x20when\x20no\x20value\x20was\x20delivered;\x20cancel\x20is\x20one\x20signature;\x20100%\x20Allocation\x20to\x20creator.','risks':'The\x20per-period\x20signature\x20is\x20deliberate\x20friction\x20—\x20sell\x20it\x20as\x20the\x20feature;\x20do\x20not\x20sneak\x20in\x20any\x20auto-renewal\x20path.','wowok_levers':['Guard','Allocator','Machine','Reward'],'recommended':!![]},{'id':'annual_prepaid_period_release','name':'Annual\x20prepay\x20released\x20per\x20period','applicable_when':'Loyal\x20fans\x20wanting\x20a\x20yearly\x20plan;\x20creator\x20wants\x20upfront\x20cash.','upside':'Annual\x20funds\x20escrow\x20and\x20release\x20monthly\x20to\x20the\x20creator\x20—\x20prepaid\x20but\x20protected\x20if\x20the\x20creator\x20stops.','risks':'Stoppage\x20refunds\x20for\x20undelivered\x20months\x20must\x20be\x20structurally\x20guaranteed.','wowok_levers':['Allocator','Guard']},{'id':'tiered_membership','name':'Tiered\x20membership\x20with\x20escalating\x20deliverables','applicable_when':'Creators\x20with\x20multiple\x20value\x20tiers\x20(Patreon-style).','upside':'Each\x20tier\x20maps\x20to\x20its\x20own\x20delivery\x20guard;\x20upgrades/downgrades\x20take\x20effect\x20next\x20period\x20only.','risks':'Tier\x20deliverables\x20must\x20be\x20concrete\x20enough\x20for\x20the\x20delivery\x20guard\x20to\x20evaluate.','wowok_levers':['Machine','Guard','WIP']}]},'postures':{'volume':{'posture':'volume','thesis':'Subscriber\x20count\x20first\x20via\x20the\x20\x27signing\x20movement\x27\x20consumer\x20tool\x20and\x20first-month\x20pricing;\x20keep\x20100%\x20pass-through\x20as\x20the\x20wedge.','tradeoffs':'Conversion\x20funnel\x20includes\x20the\x20signature\x20friction\x20—\x20lean\x20into\x20it\x20as\x20qualification.','guardrails':['Never\x20reintroduce\x20auto-renewal\x20to\x20optimize\x20conversion','Delivery\x20gate\x20on\x20every\x20charge']},'balanced':{'posture':'balanced','thesis':'Balance\x20acquisition\x20(subscription\x20checkup\x20tool)\x20with\x20retention\x20(100%\x20arrival\x20day\x20rituals).','tradeoffs':'Moderate\x20growth;\x20investment\x20in\x20per-period\x20value\x20proof.','guardrails':['Fee\x20schedule\x20frozen\x20at\x20publish','Cancellation\x20one\x20signature,\x20no\x20retention\x20dark\x20patterns']},'margin':{'posture':'margin','thesis':'Fewer,\x20higher-paying\x20true\x20fans;\x20per-period\x20signing\x20filters\x20for\x20committed\x20members\x20and\x20supports\x20premium\x20tiers.','tradeoffs':'Smaller\x20list,\x20higher\x20ARPU.','guardrails':['No\x20IAP-style\x2030%\x20channel\x20accepted\x20—\x20direct\x20settlement\x20is\x20the\x20product','Stoppage\x20protection\x20advertised\x20and\x20enforced']}},'competitor_watch':{'dimensions':['take\x20rate\x20and\x20unilateral\x20change\x20history','charge\x20transparency','cancellation\x20click\x20count','stopped-creator\x20policy','time-to-payout'],'cadence':'weekly','cadence_days':0x7,'differentiation':['13\x20years\x20/\x20three\x20unilateral\x20Patreon\x20price\x20rises\x20are\x20structurally\x20impossible\x20(published\x20allocation\x20is\x20frozen)','Charge\x20without\x20delivery\x20cannot\x20pass\x20—\x20an\x20industry\x20blank','15-option\x20cancel\x20maze\x20→\x20one\x20signature\x20(FTC\x20$2.5B\x20settlement\x20context)']},'acquisition':{'channels':[{'channel':'Creator\x20communities\x20(Discord,\x20Patreon\x20forums)','priority':0x1,'rationale':'Survival-line\x20creators\x20($131–180\x20median\x20monthly)\x20feel\x20the\x2010–20%\x20fee\x20directly\x20($2–5\x20per\x20subscriber).'},{'channel':'Newsletter\x20/\x20indie-dev\x20circles','priority':0x2,'rationale':'Apple\x20IAP\x2030%\x20+\x2075-day\x20payout\x20float\x20pain.'},{'channel':'Hacker\x20News\x20/\x20anti-dark-pattern\x20audience','priority':0x3,'rationale':'Values\x20alignment\x20beats\x20ad\x20spend.'}],'campaign_paradigm':'\x27Signing\x20Movement\x27\x20(M2–M4):\x20consumer-side\x20subscription\x20checkup\x20widget\x20(2.5×\x20spend\x20underestimate\x20/\x2042%\x20unused\x20data)\x20+\x20creator\x20\x27100%\x20arrival\x20day\x27\x20monthly\x20chain-receipt\x20posts;\x20$4–7K,\x20keyed\x20to\x20FTC/price-hike\x20news\x20cycles.','reward_orientation':'Loyalty\x20+\x20referral\x20rewards\x20only;\x20first-month\x20price\x20as\x20the\x20single\x20acquisition\x20discount.','discount_orientation':'Annual\x20/\x20team\x20/\x20upgrade\x20discounts\x20—\x20never\x20discount\x20by\x20hiding\x20renewal\x20terms.'},'conversion_retention':['Onboard\x20creators\x20by\x20migrating\x20one\x20tier\x20first\x20and\x20showing\x20the\x20per-period\x20release\x20receipts.','Retain\x20with\x20the\x20\x27unused\x20month\x27\x20guarantee:\x20no\x20delivery\x20→\x20no\x20charge.','Convert\x20fans\x20with\x20the\x20cancellation\x20demo\x20(15\x20options\x20→\x201\x20signature).'],'unit_economics':{'formula':'extra\x20per\x20year\x20=\x20legacy\x20take\x20rate\x20×\x20annual\x20subscription\x20revenue\x20−\x20WoW\x20gas\x20(2\x20txns/period)','anchors':[{'metric':'Monthly\x20anchor','value':'$100/month\x20($1,200/year)'},{'metric':'Legacy\x20take','value':'Patreon\x2010%\x20≈\x20$10/month;\x20iOS\x20IAP\x2030%'},{'metric':'WoW\x20annual\x20cost\x20(12\x20periods)','value':'gas\x20≈\x20$0.03–2/year'},{'metric':'Payout\x20speed','value':'IAP\x20up\x20to\x2075-day\x20float\x20→\x20seconds\x20each\x20period'}],'target_margin_pct_min':0x3c,'cost_floor':'Creator\x20must\x20keep\x20delivering\x20per-period\x20value;\x20no\x20charge\x20passes\x20without\x20delivery\x20evidence.','breakeven_note':'≈$120/year\x20extra\x20on\x20a\x20single\x20$100/month\x20membership.'},'success_patterns':[{'pattern':'Ship\x20the\x20subscription-checkup\x20widget\x20before\x20creator\x20outreach.','evidence':'KPI:\x20≥20,000\x20checkups;\x20consumer\x20demand\x20pulls\x20creators.'},{'pattern':'Run\x20monthly\x20\x27100%\x20arrival\x20day\x27\x20with\x20public\x20chain\x20receipts.','evidence':'30\x20creators\x20onboard\x20target;\x20turns\x20payout\x20into\x20recurring\x20proof.'},{'pattern':'Publish\x20the\x20one-signature\x20cancellation\x20video.','evidence':'KPI:\x20≥100K\x20views\x20—\x20contrast\x20with\x20the\x204-page/6-click/15-option\x20incumbent\x20flow.'},{'pattern':'Capture\x20education\x20recorded-course\x20overflow\x20traffic.','evidence':'Routing\x20rule:\x20recorded\x20courses\x20→\x20subscription,\x20keeping\x20both\x20fits\x20clean.'}],'red_lines':['Never\x20implement\x20or\x20imply\x20auto-renewal\x20—\x20every\x20period\x20is\x20signed.','Never\x20charge\x20a\x20period\x20without\x20delivery\x20evidence.','No\x20rate\x20lock\x20claims\x20except\x20through\x20published\x20frozen\x20Allocation.'],'sources':['wiki/market/K1/05-商业化/02-六行业商业模式深度论证与落地执行手册.md\x20§6','wiki/market/K1/01-行业分析/订阅-Patreon.md']}];const STRATEGY_BY_INDUSTRY=new Map(INDUSTRY_STRATEGIES['map'](a=>[a['industry'],a]));export function registerIndustryStrategy(a){STRATEGY_BY_INDUSTRY['set'](a['industry'],a);}export function unregisterIndustryStrategy(a){const b=INDUSTRY_STRATEGIES['find'](c=>c['industry']===a);if(b)return STRATEGY_BY_INDUSTRY['set'](a,b),!![];return STRATEGY_BY_INDUSTRY['delete'](a);}export function getIndustryStrategy(a){return STRATEGY_BY_INDUSTRY['get'](a['toLowerCase']());}export function listIndustryStrategies(){return SUPPORTED_INDUSTRIES['map'](a=>STRATEGY_BY_INDUSTRY['get'](a))['filter'](a=>a!==undefined);}export function stageFromOrderCount(a){if(a>=0x32)return'optimization';if(a>=0x14)return'mature';if(a>=0x5)return'growing';return'cold_start';}export function recommendStrategy(a,b='balanced',c,d){const e=getIndustryStrategy(a);if(!e||e['pricing']['models']['length']===0x0)return null;const f=c??(d?.['order_count']!==undefined?stageFromOrderCount(d['order_count']):'cold_start');let g=e['pricing']['models']['find'](j=>j['id']===e['pricing']['default_model_id'])??e['pricing']['models'][0x0];if(b==='volume'){const j=e['pricing']['models']['find'](k=>/(?:^|_)(discount|trial|first|bundle|member)(?:_|$)/i['test'](k['id']))??g;g=j;}else{if(b==='margin'&&e['pricing']['models']['length']>0x1){const k=e['pricing']['models']['find'](l=>/premium|graded|tiered|guarantee|prepaid/i['test'](l['id']));if(k)g=k;}}const h=[],i=(l,m)=>{if(l&&h['length']<0x3)h['push'](m);};return i(f==='cold_start','Cold\x20start:\x20publish\x20the\x20service\x20with\x20the\x20\x22'+g['name']+'\x22\x20model\x20and\x20bound\x20Arbitration\x20+\x20compensation\x20fund\x20first;\x20seed\x20the\x20anchor\x20trust\x20case\x20before\x20discounting.'),d?.['dispute_rate']!==undefined&&i(d['dispute_rate']>0.05,'Dispute\x20rate\x20'+(d['dispute_rate']*0x64)['toFixed'](0x1)+'%\x20exceeds\x205%:\x20tighten\x20pre-delivery\x20evidence\x20guards\x20and\x20pause\x20promotions\x20until\x20closure\x20is\x20back\x20on-chain.'),d?.['repeat_customer_rate']!==undefined&&i(d['repeat_customer_rate']<0.25&&f!=='cold_start','Repeat\x20rate\x20'+(d['repeat_customer_rate']*0x64)['toFixed'](0x0)+'%\x20is\x20below\x20the\x2025%\x20K1\x20gate:\x20add\x20a\x20repeat/referral\x20reward\x20and\x20review\x20post-delivery\x20follow-up\x20rather\x20than\x20cutting\x20price.'),d?.['order_count']!==undefined&&i(b==='volume'&&d['order_count']>=0x5&&d['order_count']<0x32,'Growing\x20stage\x20under\x20volume\x20posture:\x20run\x20the\x20cataloged\x20acquisition\x20campaign\x20('+(e['acquisition']['channels'][0x0]?.['channel']??'top\x20channel')+')\x20with\x20reward—not\x20blanket\x20discount—orientation.'),i(h['length']===0x0,b+'\x20posture:\x20hold\x20the\x20\x22'+g['name']+'\x22\x20model,\x20run\x20the\x20'+e['competitor_watch']['cadence']+'\x20competitor\x20watch\x20('+e['competitor_watch']['dimensions']['slice'](0x0,0x3)['join'](',\x20')+'),\x20and\x20keep\x20all\x20guardrails:\x20'+e['postures'][b]['guardrails'][0x0]),{'industry':e['industry'],'posture':b,'stage':f,'pricing_model_id':g['id'],'pricing_model_name':g['name'],'actions':h['slice'](0x0,0x3)};}export function validateStrategyLevers(a){const b=[];for(const c of a['pricing']['models']){for(const d of c['wowok_levers']){!LEVER_WHITELIST['has'](d)&&b['push'](a['industry']+'.'+c['id']+':\x20unknown\x20WoW\x20lever\x20\x27'+d+'\x27');}}return b;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{query_events
|
|
1
|
+
import{query_events}from'@wowok/wowok';import{batchQueryObjectsByIds as a144a}from'../graph/onchain/sdk-batch.js';function toStr(a){if(typeof a==='string')return a;if(typeof a==='number'||typeof a==='bigint')return String(a);return undefined;}async function collectObjectIdsByEvent(a,b,c,d,e){const f=new Set();let g=null,h=![];while(f['size']<d){const i=await query_events({'type':a,'cursor':g,'limit':0x32,'order':'descending','no_cache':e,'network':c}),j=i?.['data']??[];if(j['length']===0x0)break;for(const k of j){const l=b(k);if(l)f['add'](l);}h=!!(i?.['hasNextPage']&&i?.['nextCursor']);if(!h)break;g=i?.['nextCursor']??null;}return{'ids':Array['from'](f)['slice'](0x0,d),'hasMore':h};}export async function enumerateServices(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('ServiceEvent',i=>typeof i?.['object']==='string'?i['object']:undefined,a,c,b['no_cache']),f=await a144a(d,a,b['no_cache']),g=(b['location_any']??[])['map'](i=>i['toLowerCase']()),h=f['filter'](i=>(i?.['type']??'')==='Service')['filter'](i=>{if(g['length']===0x0)return!![];const j=typeof i?.['location']==='string'?i['location']['toLowerCase']():'';return g['some'](k=>j['includes'](k));})['map'](i=>({'object':String(i['object']),'name':typeof i['name']==='string'?i['name']:undefined,'location':typeof i['location']==='string'?i['location']:'','json':{...i,'compensation_fund':toStr(i['compensation_fund']),'sales':Array['isArray'](i['sales'])?i['sales']['map'](j=>({...j,'price':toStr(j['price'])})):[]}}));return{'services':h,'total_enumerated':h['length'],'has_more':e};}export async function enumerateDemands(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('DemandChangedEvent',h=>typeof h?.['object']==='string'?h['object']:undefined,a,c,b['no_cache']),f=await a144a(d,a,b['no_cache']),g=f['filter'](h=>(h?.['type']??'')==='Demand')['map'](h=>h);return{'demands':g,'total_enumerated':g['length'],'has_more':e};}export async function enumerateArbs(a,b={}){const c=b['max_objects']??0xc8,{ids:d,hasMore:e}=await collectObjectIdsByEvent('ArbEvent',i=>typeof i?.['arb']==='string'?i['arb']:undefined,a,c,b['no_cache']),f=await a144a(d,a,b['no_cache']),g=b['status']===undefined?undefined:Array['isArray'](b['status'])?b['status']:[b['status']],h=f['filter'](i=>(i?.['type']??'')==='Arb')['map'](i=>i)['filter'](i=>b['arbitration']?i['arbitration']===b['arbitration']:!![])['filter'](i=>b['order']?i['order']===b['order']:!![])['filter'](i=>g?g['includes'](Number(i['status'])):!![]);return{'arbs':h,'total_enumerated':h['length'],'has_more':e};}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ENTRYPOINT } from "@wowok/wowok";
|
|
2
2
|
export interface MarketMetrics {
|
|
3
3
|
total_services: number;
|
|
4
4
|
active_services: number;
|
|
@@ -13,11 +13,22 @@ export declare function computeMarketMetrics(network: ENTRYPOINT, no_cache?: boo
|
|
|
13
13
|
export interface OrderFlowMetrics {
|
|
14
14
|
order_count: number;
|
|
15
15
|
gmv: string;
|
|
16
|
+
gmv_by_coin: Array<{
|
|
17
|
+
coin: string;
|
|
18
|
+
amount: string;
|
|
19
|
+
orders: number;
|
|
20
|
+
}>;
|
|
21
|
+
unclassified_orders: number;
|
|
16
22
|
top_services: Array<{
|
|
17
23
|
service: string;
|
|
18
24
|
orders: number;
|
|
19
25
|
}>;
|
|
20
|
-
window: "
|
|
26
|
+
window: "full_history" | "partial";
|
|
27
|
+
truncated: boolean;
|
|
21
28
|
computed_at: number;
|
|
22
29
|
}
|
|
23
|
-
export
|
|
30
|
+
export interface OrderFlowOptions {
|
|
31
|
+
noCache?: boolean;
|
|
32
|
+
maxPages?: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function computeOrderFlow(network: ENTRYPOINT, opts?: OrderFlowOptions): Promise<OrderFlowMetrics>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ArbStatus}from'@wowok/wowok';import{enumerateServices,enumerateDemands,enumerateArbs}from'./jsonrpc-enum.js';import{SdkDataPlane,extractCoinType}from'../graph/onchain/index.js';export async function computeMarketMetrics(a,b){const [c,d,e]=await Promise['all']([enumerateServices(a,{'no_cache':b}),enumerateDemands(a,{'no_cache':b}),enumerateArbs(a,{'no_cache':b})]),f=c['services']['filter'](k=>{const l=k['json']??{};return l['bPublished']===!![]&&l['bPaused']!==!![];}),g=d['demands']['filter'](j=>(j['presenters_count']??0x0)===0x0),h=e['arbs']['filter'](j=>{const k=Number(j['status']);return k!==ArbStatus['Finished']&&k!==ArbStatus['Withdrawn'];}),i=f['length'];return{'total_services':c['services']['length'],'active_services':i,'total_demands':d['demands']['length'],'open_demands':g['length'],'total_arbs':e['arbs']['length'],'open_arbs':h['length'],'supply_demand_ratio':i>0x0?g['length']/ i:null,'computed_at':Date['now']()};}const ORDER_FLOW_DEFAULT_PAGES=0x64,ORDER_FLOW_PAGE_SIZE=0x32;export async function computeOrderFlow(a,b){const c=new SdkDataPlane(a,{'noCache':b?.['noCache']}),d=await c['getEvents']('NewOrderEvent',{'maxPages':b?.['maxPages']??ORDER_FLOW_DEFAULT_PAGES,'limit':ORDER_FLOW_PAGE_SIZE}),e=d['events']['filter'](p=>p['type']==='NewOrderEvent'),f=[...new Set(e['map'](p=>p['service'])['filter'](p=>typeof p==='string'))],g=f['length']?await c['getObjects'](f):new Map(),h=new Map();for(const p of f){const q=g['get'](p['toLowerCase']()),r=q?extractCoinType(q['type_raw']):undefined;if(r)h['set'](p['toLowerCase'](),r);}let i=0x0n;const j=new Map(),k=new Map();let l=0x0;for(const s of e){let t=0x0n;try{t=BigInt(s['amount']),i+=t;}catch{}const u=(s['service']&&h['get'](s['service']['toLowerCase']()))??'unknown';if(u==='unknown')l++;const v=j['get'](u)??{'amount':0x0n,'orders':0x0};v['amount']+=t,v['orders']+=0x1,j['set'](u,v),s['service']&&k['set'](s['service'],(k['get'](s['service'])??0x0)+0x1);}const m=[...j['entries']()]['map'](([w,x])=>({'coin':w,'amount':x['amount']['toString'](),'orders':x['orders']}))['sort']((w,x)=>{if(w['coin']==='unknown')return 0x1;if(x['coin']==='unknown')return-0x1;const y=BigInt(w['amount']),z=BigInt(x['amount']);return y===z?0x0:y<z?0x1:-0x1;}),n=Array['from'](k['entries']())['map'](([w,x])=>({'service':w,'orders':x}))['sort']((w,x)=>x['orders']-w['orders'])['slice'](0x0,0xa);return{'order_count':e['length'],'gmv':i['toString'](),'gmv_by_coin':m,'unclassified_orders':l,'top_services':n,'window':d['truncated']?'partial':'full_history','truncated':d['truncated'],'computed_at':Date['now']()};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{fetchEntityPermission
|
|
1
|
+
import{objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{batchFetchObjectLinkerCore,fetchEntityPermission}from'../graph/onchain/sdk-batch.js';export const MIGRATION_CHECKLIST=['Payment\x20token:\x20testnet\x20always\x20settles\x20in\x20WOW;\x20on\x20mainnet\x20decide\x20whether\x20to\x20switch\x20to\x20USDT\x20/\x20USDC\x20/\x20ETH\x20/\x20BTC\x20/\x20WOW\x20(query\x20wowok_buildin_info\x20info=\x27mainnet\x20bridge\x20tokens\x27\x20for\x20each\x20token\x27s\x20exact\x20type\x20tag).','Location:\x20in-person\x20/\x20digital\x20services\x20MUST\x20set\x20a\x20correct\x20Service.location\x20(the\x20service\x20area\x20gates\x20purchase);\x20mailing\x20services\x20set\x20a\x20delivery\x20region\x20instead.','Arbitration:\x20strongly\x20recommended\x20on\x20mainnet\x20(bind\x20a\x20third-party\x20Arbitration\x20so\x20neither\x20you\x20nor\x20the\x20customer\x20controls\x20the\x20verdict);\x20optional\x20on\x20testnet.','WIP:\x20if\x20a\x20product\x20carries\x20a\x20WIP\x20file,\x20it\x20MUST\x20be\x20deployed\x20to\x20a\x20public\x20URL\x20—\x20on-chain\x20stores\x20only\x20the\x20URL\x20+\x20hash,\x20not\x20the\x20file.','Gas:\x20mainnet\x20deployment\x20needs\x20gas\x20(top\x20up\x20via\x20the\x20ETH\x20mainnet\x20bridge\x20or\x20airdrop);\x20testnet\x20is\x20free\x20via\x20the\x20faucet.'];async function snapshot(a,b,c){const d={'network':b,'has_build':![],'permissions':[],'services':[],'machines':[],'treasuries':[],'rewards':[],'contacts':[],'arbitrations':[]},e=await fetchEntityPermission(a,b,c),f=[...new Set((e?.['items']??[])['map'](h=>h['permission']))];d['permissions']=f;const g=await batchFetchObjectLinkerCore(f,b,c)['catch'](()=>undefined);for(const h of f){for(const i of g?.['get'](h)?.['items']??[]){const j=String(i?.['who']??'')['toLowerCase']();if(!j)continue;const k=objectTypeFromAddress(j);if(k===ObjectType['Service'])d['services']['push'](j);else{if(k===ObjectType['Machine'])d['machines']['push'](j);else{if(k===ObjectType['Treasury'])d['treasuries']['push'](j);else{if(k===ObjectType['Reward'])d['rewards']['push'](j);else{if(k===ObjectType['Contact'])d['contacts']['push'](j);else{if(k===ObjectType['Arbitration'])d['arbitrations']['push'](j);}}}}}}}return d['has_build']=f['length']>0x0||d['services']['length']>0x0||d['machines']['length']>0x0,d;}export async function migrationPreflight(a){const b=String(a['account']??'')['toLowerCase']();if(!b)throw new Error('migration_preflight\x20requires\x20\x27account\x27\x20(an\x20account\x20address\x20or\x20name).\x20'+'Pass\x20the\x20account\x20to\x20check\x20its\x20testnet\x20vs\x20mainnet\x20build\x20status.');const c=a['source_network']??'testnet',d=a['target_network']??'mainnet',[e,f]=await Promise['all']([snapshot(b,c,a['no_cache']),snapshot(b,d,a['no_cache'])]);return{'action':'migration_preflight','account':b,'source_network':c,'target_network':d,'source':e,'target':f,'migration_checklist':MIGRATION_CHECKLIST};}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PermissionContext } from "
|
|
1
|
+
import type { PermissionContext } from "../graph/onchain/sdk-batch.js";
|
|
2
2
|
export type OperationCategory = "permission_index" | "guard" | "special";
|
|
3
3
|
export type ComplexityLevel = "L0" | "L1" | "L2" | "L3";
|
|
4
4
|
export interface OperationComplexity {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { NewPaymentEvent, type ENTRYPOINT } from "@wowok/wowok";
|
|
2
|
+
export type PaymentRelationKind = "incoming" | "creator" | "for_object" | "for_guard" | "from_pool";
|
|
3
|
+
export declare function paymentRelations(ev: NewPaymentEvent, account: string): PaymentRelationKind[];
|
|
4
|
+
export declare function scanRecentPaymentEvents(opts: {
|
|
5
|
+
network?: ENTRYPOINT;
|
|
6
|
+
no_cache?: boolean;
|
|
7
|
+
max_events?: number;
|
|
8
|
+
since_ms?: number;
|
|
9
|
+
}): Promise<NewPaymentEvent[]>;
|
|
10
|
+
export declare function resolveBeneficialOwners(addresses: readonly string[], opts: {
|
|
11
|
+
network?: ENTRYPOINT;
|
|
12
|
+
no_cache?: boolean;
|
|
13
|
+
}): Promise<Map<string, string>>;
|
|
14
|
+
export interface ExtractionPlan {
|
|
15
|
+
holder: string;
|
|
16
|
+
holder_kind: "user" | "business_object";
|
|
17
|
+
operation: string;
|
|
18
|
+
anyone_can_submit: boolean;
|
|
19
|
+
permission_index?: number;
|
|
20
|
+
settles_to: string;
|
|
21
|
+
steps: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function extractionPlanForHolder(holder: string, concreteOwner?: string): ExtractionPlan;
|
|
24
|
+
export interface PendingWrapper {
|
|
25
|
+
wrapper_id: string;
|
|
26
|
+
payment: string;
|
|
27
|
+
amount: string;
|
|
28
|
+
version?: string;
|
|
29
|
+
digest?: string;
|
|
30
|
+
holder: string;
|
|
31
|
+
plan: ExtractionPlan;
|
|
32
|
+
}
|
|
33
|
+
export declare function pendingWrappersAt(holder: string, opts: {
|
|
34
|
+
network?: ENTRYPOINT;
|
|
35
|
+
no_cache?: boolean;
|
|
36
|
+
concreteOwner?: string;
|
|
37
|
+
}): Promise<PendingWrapper[]>;
|
|
38
|
+
export interface TrackedPaymentLeg {
|
|
39
|
+
recipient: string;
|
|
40
|
+
amount: string;
|
|
41
|
+
recipient_kind: "user" | "business_object";
|
|
42
|
+
beneficial_owner?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface TrackedPayment {
|
|
45
|
+
payment: string;
|
|
46
|
+
tx_digest: string;
|
|
47
|
+
time: number;
|
|
48
|
+
amount: string;
|
|
49
|
+
creator: string;
|
|
50
|
+
from_object?: string | null;
|
|
51
|
+
info: NewPaymentEvent["info"];
|
|
52
|
+
legs: TrackedPaymentLeg[];
|
|
53
|
+
relations: PaymentRelationKind[];
|
|
54
|
+
beneficial: boolean;
|
|
55
|
+
pending: PendingWrapper[];
|
|
56
|
+
}
|
|
57
|
+
export declare function trackAccountPayments(opts: {
|
|
58
|
+
account: string;
|
|
59
|
+
network?: ENTRYPOINT;
|
|
60
|
+
no_cache?: boolean;
|
|
61
|
+
max_events?: number;
|
|
62
|
+
include_related?: boolean;
|
|
63
|
+
}): Promise<TrackedPayment[]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{query_events,query_received,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{driveabilityOf}from'./recipient-constraint.js';const OBJECT_BATCH=0x32,EVENT_PAGE=0x32;export function paymentRelations(b,c){const d=c['toLowerCase'](),e=[];if((b['record']??[])['some'](f=>String(f['recipient'])['toLowerCase']()===d))e['push']('incoming');if(String(b['sender']??'')['toLowerCase']()===d)e['push']('creator');if(String(b['info']?.['for_object']??'')['toLowerCase']()===d)e['push']('for_object');if(String(b['info']?.['for_guard']??'')['toLowerCase']()===d)e['push']('for_guard');if(String(b['from_object']??'')['toLowerCase']()===d)e['push']('from_pool');return e;}export async function scanRecentPaymentEvents(a){const b=a['max_events']??0x64,c=[];let d,e=![];while(c['length']<b&&!e){const f=await query_events({'type':'NewPaymentEvent','order':'descending','limit':Math['min'](EVENT_PAGE,b-c['length']),'cursor':d,'network':a['network'],'no_cache':a['no_cache']}),g=f?.['data']??[];if(g['length']===0x0)break;for(const h of g){c['push'](h);if(a['since_ms']!=null&&Number(h['time']??0x0)<a['since_ms']){e=!![];break;}if(c['length']>=b)break;}if(!f?.['hasNextPage']||!f['nextCursor'])break;d=f['nextCursor'];}return c;}function isUserAddress(b){return b['startsWith']('0x00');}async function fetchObjectsInChunks(a,b){const c=[];for(let d=0x0;d<a['length'];d+=OBJECT_BATCH){const e=await query_objects({'objects':a['slice'](d,d+OBJECT_BATCH),'network':b['network'],'no_cache':b['no_cache']});c['push'](...e['objects']??[]);}return c;}export async function resolveBeneficialOwners(b,c){const d=new Map(),e=[],f=new Set();for(const n of b){const q=String(n??'')['toLowerCase']();if(!q)continue;if(isUserAddress(q)){d['set'](q,q);continue;}if(objectTypeFromAddress(q)===undefined)continue;!f['has'](q)&&(f['add'](q),e['push'](q));}if(e['length']===0x0)return d;const g=await fetchObjectsInChunks(e,c),h=new Map(),i=new Map();for(const r of g){const s=r['object']['toLowerCase']();if(r['type']===ObjectType['Order']||r['type']===ObjectType['Permission']){const t=String(r['builder']??'')['toLowerCase']();if(t)d['set'](s,t);}else{if(r['type']===ObjectType['Progress']){const u=String(r['machine']??'')['toLowerCase']();if(u)h['set'](s,u);}else{const v=String(r['permission']??'')['toLowerCase']();if(v)i['set'](s,v);}}}const j=new Map(),k=[...new Set(h['values']())];if(k['length']>0x0){const w=await fetchObjectsInChunks(k,c);for(const x of w){const y=String(x['permission']??'')['toLowerCase']();if(y)j['set'](x['object']['toLowerCase'](),y);}}const l=new Set(i['values']());for(const z of j['values']())l['add'](z);if(l['size']>0x0){const A=await fetchObjectsInChunks([...l],c),B=new Map();for(const C of A){const D=String(C['builder']??'')['toLowerCase']();if(D)B['set'](C['object']['toLowerCase'](),D);}for(const [E,F]of i){const G=B['get'](F);if(G)d['set'](E,G);}for(const [H,I]of h){const J=j['get'](I);if(!J)continue;const K=B['get'](J);if(K)d['set'](H,K);}}return d;}export function extractionPlanForHolder(a,b){const c=a['toLowerCase']();if(isUserAddress(c))return{'holder':c,'holder_kind':'user','operation':'payment::unwrap_to_myself','anyone_can_submit':![],'settles_to':c,'steps':['Call\x20payment::unwrap_to_myself<T>(wrapper),\x20signing\x20with\x20the\x20holder\x20account.','The\x20bare\x20Coin<T>\x20is\x20transferred\x20back\x20to\x20the\x20same\x20account,\x20ready\x20to\x20spend.']};const e=objectTypeFromAddress(c),f=e?driveabilityOf(e):undefined,g=f?.['receive_entries'][0x0]??String(e??'object')+'::owner_receive',i=b??f?.['funds_settle_to']??'the\x20object\x27s\x20owner';if(f?.['anyone_drivable'])return{'holder':c,'holder_kind':'business_object','operation':g,'anyone_can_submit':!![],'settles_to':i,'steps':['Obtain\x20the\x20Receiving<CoinWrapper<T>>\x20argument\x20from\x20the\x20wrapper\x27s\x20current\x20version\x20and\x20digest\x20returned\x20by\x20query_received.','Build\x20a\x20PTB\x20calling\x20'+g+'(…,\x20wrapper,\x20payment);\x20no\x20permission\x20witness\x20is\x20required.','Anyone\x20may\x20submit;\x20the\x20bare\x20Coin\x20settles\x20to\x20'+i+'.']};return{'holder':c,'holder_kind':'business_object','operation':g,'anyone_can_submit':![],...f?.['permission_index']!=null?{'permission_index':f['permission_index']}:{},'settles_to':i,'steps':['Obtain\x20the\x20Receiving<CoinWrapper<T>>\x20argument\x20from\x20the\x20wrapper\x27s\x20current\x20version\x20and\x20digest\x20returned\x20by\x20query_received.','Build\x20a\x20PTB\x20calling\x20'+g+'(…,\x20permission,\x20wrapper,\x20payment)\x20as\x20a\x20member\x20holding\x20permission\x20index\x20'+(f?.['permission_index']??'?')+',\x20or\x20the\x20*_with_passport\x20variant.','The\x20bare\x20Coin\x20settles\x20to\x20'+i+'.']};}export async function pendingWrappersAt(a,b){const c=a['toLowerCase'](),d=await query_received({'name_or_address':{'name_or_address':c},'type':'CoinWrapper','network':b['network'],'no_cache':b['no_cache']});if(!d||Array['isArray'](d)||!('received'in d))return[];return(d['received']??[])['map'](e=>({'wrapper_id':String(e['id'])['toLowerCase'](),'payment':String(e['payment'])['toLowerCase'](),'amount':String(e['balance']??'0'),'version':e['version'],'digest':e['digest'],'holder':c,'plan':extractionPlanForHolder(c,b['concreteOwner'])}));}export async function trackAccountPayments(a){const b=a['account']['toLowerCase'](),c=await scanRecentPaymentEvents({'network':a['network'],'no_cache':a['no_cache'],'max_events':a['max_events']??0x64}),d=new Set();for(const i of c)for(const j of i['record']??[])d['add'](String(j['recipient'])['toLowerCase']());const e=await resolveBeneficialOwners([...d],{'network':a['network'],'no_cache':a['no_cache']}),f=[];for(const k of c){const l=paymentRelations(k,b),m=(k['record']??[])['some'](n=>e['get'](String(n['recipient'])['toLowerCase']())===b);if(l['length']===0x0&&!m)continue;if(!m&&!a['include_related']&&(l['length']===0x0||!l['includes']('incoming')))continue;f['push']({'ev':k,'relations':l,'beneficial':m});}const g=new Set();for(const {ev:n}of f)for(const o of n['record']??[]){const p=String(o['recipient'])['toLowerCase']();if(p===b||e['get'](p)===b)g['add'](p);}const h=new Map();return await Promise['all']([...g]['map'](async q=>{try{h['set'](q,await pendingWrappersAt(q,{'network':a['network'],'no_cache':a['no_cache'],'concreteOwner':e['get'](q)}));}catch{h['set'](q,[]);}})),f['map'](({ev:q,relations:s,beneficial:t})=>{const u=q['object']['toLowerCase'](),v=[];for(const x of q['record']??[]){const y=String(x['recipient'])['toLowerCase']();if(y!==b&&e['get'](y)!==b)continue;for(const z of h['get'](y)??[]){if(z['payment']===u)v['push'](z);}}return{'payment':u,'tx_digest':String(q['id']?.['txDigest']??''),'time':Number(q['time']??0x0),'amount':String(q['amount']??'0'),'creator':String(q['sender']??'')['toLowerCase'](),'from_object':q['from_object']??null,'info':q['info'],'legs':(q['record']??[])['map'](A=>{const B=String(A['recipient'])['toLowerCase']();return{'recipient':B,'amount':String(A['amount']??'0'),'recipient_kind':isUserAddress(B)?'user':'business_object',...e['has'](B)?{'beneficial_owner':e['get'](B)}:{}};}),'relations':s,'beneficial':t,'pending':v};});}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
export type RecipientSpec = {
|
|
2
|
+
kind: "entity";
|
|
3
|
+
address: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: "signer";
|
|
6
|
+
} | {
|
|
7
|
+
kind: "submission";
|
|
8
|
+
identifier: number;
|
|
9
|
+
};
|
|
10
|
+
export type ConstraintCode = "service_binding" | "progress_node_state" | "signer_is_submitted_object_owner" | "signer_authorized_entity" | "signer_permission_member" | "time_lock" | "repository_crosscheck" | "other";
|
|
11
|
+
export interface ConstraintEvidence {
|
|
12
|
+
path: string;
|
|
13
|
+
queries: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface RecipientConstraint {
|
|
16
|
+
code: ConstraintCode;
|
|
17
|
+
slot?: number;
|
|
18
|
+
description: string;
|
|
19
|
+
evidence: ConstraintEvidence;
|
|
20
|
+
caller_constraint: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface ObjectReceiptRight {
|
|
23
|
+
object_type: "order" | "treasury" | "unknown";
|
|
24
|
+
receive_entry: string;
|
|
25
|
+
guarantee: string;
|
|
26
|
+
}
|
|
27
|
+
export type FindingSeverity = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
|
|
28
|
+
export interface RecipientFinding {
|
|
29
|
+
code: string;
|
|
30
|
+
severity: FindingSeverity;
|
|
31
|
+
title: string;
|
|
32
|
+
explanation: string;
|
|
33
|
+
evidence_paths: string[];
|
|
34
|
+
mitigation: string;
|
|
35
|
+
unavoidable: boolean;
|
|
36
|
+
}
|
|
37
|
+
export type Stakeholder = "provider" | "customer" | "caller" | "system";
|
|
38
|
+
export type PayoffPosition = "gains" | "loses" | "neutral" | "conditional";
|
|
39
|
+
export interface AllocatorPayoff {
|
|
40
|
+
caller_eligibility: string;
|
|
41
|
+
beneficial_recipient: string;
|
|
42
|
+
positions: Partial<Record<Stakeholder, PayoffPosition>>;
|
|
43
|
+
}
|
|
44
|
+
export interface RecipientModel {
|
|
45
|
+
spec: RecipientSpec;
|
|
46
|
+
slot_value_type?: number;
|
|
47
|
+
constraints: RecipientConstraint[];
|
|
48
|
+
receipt?: ObjectReceiptRight;
|
|
49
|
+
beneficial_owner: string;
|
|
50
|
+
}
|
|
51
|
+
export interface AllocatorModel {
|
|
52
|
+
guard: string;
|
|
53
|
+
recipients: RecipientModel[];
|
|
54
|
+
slots: SlotModel[];
|
|
55
|
+
payoff: AllocatorPayoff;
|
|
56
|
+
}
|
|
57
|
+
export interface GuardDef {
|
|
58
|
+
table?: GuardTableItemLike[];
|
|
59
|
+
root: unknown;
|
|
60
|
+
}
|
|
61
|
+
interface GuardTableItemLike {
|
|
62
|
+
identifier: number;
|
|
63
|
+
value_type: number | string;
|
|
64
|
+
value?: unknown;
|
|
65
|
+
name?: string;
|
|
66
|
+
b_submission?: boolean;
|
|
67
|
+
}
|
|
68
|
+
export type TriggerSource = "service_order_allocators" | "arbitration_fees" | "standalone";
|
|
69
|
+
export interface SlotUsage {
|
|
70
|
+
slot: number;
|
|
71
|
+
path: string;
|
|
72
|
+
query_id: number;
|
|
73
|
+
query_name: string;
|
|
74
|
+
convert_witness?: number | string;
|
|
75
|
+
}
|
|
76
|
+
export interface SlotModel {
|
|
77
|
+
identifier: number;
|
|
78
|
+
externally_submitted: boolean;
|
|
79
|
+
declared_value_type?: number;
|
|
80
|
+
is_address: boolean;
|
|
81
|
+
usages: SlotUsage[];
|
|
82
|
+
recipient_modes: string[];
|
|
83
|
+
constraints: RecipientConstraint[];
|
|
84
|
+
receipt?: ObjectReceiptRight;
|
|
85
|
+
beneficial_owner: string;
|
|
86
|
+
assessment: {
|
|
87
|
+
address_typed: boolean;
|
|
88
|
+
scope_bound: boolean;
|
|
89
|
+
object_receipt: boolean;
|
|
90
|
+
};
|
|
91
|
+
findings: string[];
|
|
92
|
+
}
|
|
93
|
+
export interface RecipientConstraintInput {
|
|
94
|
+
trigger_source: TriggerSource;
|
|
95
|
+
host_service?: string;
|
|
96
|
+
allocation?: string;
|
|
97
|
+
allocators: Array<{
|
|
98
|
+
guard: string;
|
|
99
|
+
sharing: Array<{
|
|
100
|
+
who: unknown;
|
|
101
|
+
sharing?: string | number;
|
|
102
|
+
mode?: string;
|
|
103
|
+
}>;
|
|
104
|
+
}>;
|
|
105
|
+
guards?: Record<string, GuardDef>;
|
|
106
|
+
}
|
|
107
|
+
export interface RecipientConstraintAudit {
|
|
108
|
+
version: string;
|
|
109
|
+
scope: {
|
|
110
|
+
trigger_source: TriggerSource;
|
|
111
|
+
host_service?: string;
|
|
112
|
+
allocation?: string;
|
|
113
|
+
};
|
|
114
|
+
allocators: AllocatorModel[];
|
|
115
|
+
findings: RecipientFinding[];
|
|
116
|
+
unavoidable: Array<{
|
|
117
|
+
code: string;
|
|
118
|
+
title: string;
|
|
119
|
+
detail: string;
|
|
120
|
+
}>;
|
|
121
|
+
safe_destination: boolean;
|
|
122
|
+
overall: FindingSeverity;
|
|
123
|
+
summary: string;
|
|
124
|
+
}
|
|
125
|
+
export declare function classifyRecipient(who: unknown): RecipientSpec | null;
|
|
126
|
+
export declare const RECIPIENT_CONSTRAINT_VERSION = "1.1.0";
|
|
127
|
+
export declare function analyzeRecipientConstraints(input: RecipientConstraintInput): RecipientConstraintAudit;
|
|
128
|
+
export declare function derivePayoffFromSharing(sharing: Array<{
|
|
129
|
+
who: unknown;
|
|
130
|
+
}>, trigger: TriggerSource, resolved?: GuardDef): AllocatorPayoff;
|
|
131
|
+
export declare function isUnboundSignerTheft(opts: {
|
|
132
|
+
recipient_is_signer: boolean;
|
|
133
|
+
caller_identity_constrained: boolean;
|
|
134
|
+
}): boolean;
|
|
135
|
+
export declare function canonicalDoctrine(code: "RC-FIND-01" | "RC-FIND-03" | "RC-FIND-06"): {
|
|
136
|
+
severity: FindingSeverity;
|
|
137
|
+
title: string;
|
|
138
|
+
mitigation: string;
|
|
139
|
+
};
|
|
140
|
+
export interface RecipientDesignOption {
|
|
141
|
+
id: "entity" | "submitted_object" | "signer" | "constrained_submission";
|
|
142
|
+
move_recipient: string;
|
|
143
|
+
semantics: string;
|
|
144
|
+
required_constraints: string[];
|
|
145
|
+
finding_if_unmet?: string;
|
|
146
|
+
}
|
|
147
|
+
export declare const RECIPIENT_DESIGN_OPTIONS: readonly RecipientDesignOption[];
|
|
148
|
+
export declare function recipientDesignGuidance(): readonly RecipientDesignOption[];
|
|
149
|
+
export type DrivableObjectType = "order" | "permission" | "service" | "treasury" | "arbitration" | "machine" | "progress" | "demand" | "contact";
|
|
150
|
+
export interface ObjectDriveability {
|
|
151
|
+
object_type: DrivableObjectType;
|
|
152
|
+
receive_entries: string[];
|
|
153
|
+
anyone_drivable: boolean;
|
|
154
|
+
permission_index?: number;
|
|
155
|
+
funds_settle_to: string;
|
|
156
|
+
rationale: string;
|
|
157
|
+
}
|
|
158
|
+
export declare const OBJECT_DRIVEABILITY: readonly ObjectDriveability[];
|
|
159
|
+
export declare function driveabilityOf(object_type: DrivableObjectType): ObjectDriveability | undefined;
|
|
160
|
+
export {};
|