@wowok/agent-mcp 3.2.4 → 3.2.7

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.
Files changed (252) hide show
  1. package/dist/chain-semantics/field-capability.js +1 -1
  2. package/dist/chain-semantics/freeze-map.js +1 -1
  3. package/dist/chain-semantics/object-graph.js +1 -1
  4. package/dist/communication/wts-attestation.js +1 -1
  5. package/dist/composition/audit.js +1 -1
  6. package/dist/composition/blueprint-view.d.ts +64 -0
  7. package/dist/composition/blueprint-view.js +1 -0
  8. package/dist/composition/compile.d.ts +3 -2
  9. package/dist/composition/compile.js +1 -1
  10. package/dist/composition/inflight.d.ts +17 -0
  11. package/dist/composition/inflight.js +1 -0
  12. package/dist/config/config-audit.spec.js +1 -1
  13. package/dist/customer/account-events.js +1 -1
  14. package/dist/customer/order-monitor.js +1 -1
  15. package/dist/evaluation/builtins/graph-service.spec.js +1 -1
  16. package/dist/evaluation/engine.js +1 -1
  17. package/dist/experience/realtime-feedback.js +1 -1
  18. package/dist/extensions/constraint-registry.d.ts +6 -1
  19. package/dist/extensions/constraint-registry.js +1 -1
  20. package/dist/extensions/index.d.ts +1 -1
  21. package/dist/extensions/index.js +1 -1
  22. package/dist/extensions/industry-pack.d.ts +6 -0
  23. package/dist/extensions/industry-pack.js +1 -1
  24. package/dist/extensions/mode-evaluator.d.ts +3 -2
  25. package/dist/extensions/mode-evaluator.js +1 -1
  26. package/dist/extensions/modes.js +1 -1
  27. package/dist/extensions/registry.d.ts +1 -2
  28. package/dist/extensions/registry.js +1 -1
  29. package/dist/graph/onchain/analyze.js +1 -1
  30. package/dist/graph/onchain/analyze.spec.js +1 -1
  31. package/dist/graph/onchain/anti-cheat.d.ts +32 -2
  32. package/dist/graph/onchain/anti-cheat.js +1 -1
  33. package/dist/graph/onchain/anti-cheat.spec.js +1 -1
  34. package/dist/graph/onchain/expand.js +1 -1
  35. package/dist/graph/onchain/exposure.js +1 -1
  36. package/dist/graph/onchain/extract.js +1 -1
  37. package/dist/graph/onchain/facts.js +1 -1
  38. package/dist/graph/onchain/graph-policy.spec.js +1 -1
  39. package/dist/graph/onchain/index.d.ts +2 -2
  40. package/dist/graph/onchain/index.js +1 -1
  41. package/dist/graph/onchain/project-relationship.js +1 -1
  42. package/dist/graph/onchain/table-ledger.spec.js +1 -1
  43. package/dist/graph/onchain/types.d.ts +3 -0
  44. package/dist/harness/recover.js +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/knowledge/arbitration-venue-order.d.ts +25 -0
  47. package/dist/knowledge/arbitration-venue-order.js +1 -0
  48. package/dist/knowledge/audit-rules.d.ts +12 -0
  49. package/dist/knowledge/audit-rules.js +1 -1
  50. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -1
  51. package/dist/knowledge/baselines/rules/allocation.json +5 -5
  52. package/dist/knowledge/baselines/rules/arb.json +1 -1
  53. package/dist/knowledge/baselines/rules/graph.json +81 -0
  54. package/dist/knowledge/baselines/rules/guard.json +9 -9
  55. package/dist/knowledge/baselines/rules/machine.json +5 -5
  56. package/dist/knowledge/baselines/rules/order.json +1 -1
  57. package/dist/knowledge/baselines/rules/plan.json +80 -2
  58. package/dist/knowledge/builtin-templates.d.ts +18 -2
  59. package/dist/knowledge/builtin-templates.js +1 -1
  60. package/dist/knowledge/discount-threshold.js +1 -1
  61. package/dist/knowledge/entity-recipient-guard.js +1 -1
  62. package/dist/knowledge/event-semantics.js +1 -1
  63. package/dist/knowledge/getting-started.js +1 -1
  64. package/dist/knowledge/guard-bindings.js +1 -1
  65. package/dist/knowledge/guard-design-patterns.js +1 -1
  66. package/dist/knowledge/guard-field-cognition.js +1 -1
  67. package/dist/knowledge/guard-ledger.js +1 -1
  68. package/dist/knowledge/guard-lint.d.ts +1 -0
  69. package/dist/knowledge/guard-lint.js +1 -1
  70. package/dist/knowledge/guard-node-gates.d.ts +4 -0
  71. package/dist/knowledge/guard-node-gates.js +1 -0
  72. package/dist/knowledge/guard-puzzle.js +1 -1
  73. package/dist/knowledge/guard-risk.js +1 -1
  74. package/dist/knowledge/guard-submission-prompt.d.ts +1 -0
  75. package/dist/knowledge/guard-submission-prompt.js +1 -1
  76. package/dist/knowledge/guard-templates.d.ts +2 -1
  77. package/dist/knowledge/guard-templates.js +1 -1
  78. package/dist/knowledge/guard-translation.js +1 -1
  79. package/dist/knowledge/index.d.ts +2 -2
  80. package/dist/knowledge/index.js +1 -1
  81. package/dist/knowledge/industry-generalizer.js +1 -1
  82. package/dist/knowledge/industry-registry.js +1 -1
  83. package/dist/knowledge/jsonrpc-enum.js +1 -1
  84. package/dist/knowledge/machine-topology.d.ts +6 -0
  85. package/dist/knowledge/machine-topology.js +1 -1
  86. package/dist/knowledge/order-ledger.js +1 -1
  87. package/dist/knowledge/reputation-rules.d.ts +3 -9
  88. package/dist/knowledge/reputation-rules.js +1 -1
  89. package/dist/knowledge/safety-rules.d.ts +10 -1
  90. package/dist/knowledge/safety-rules.js +1 -1
  91. package/dist/knowledge/scenario-modes.d.ts +2 -4
  92. package/dist/knowledge/scenario-modes.js +1 -1
  93. package/dist/knowledge/service-ledger.js +1 -1
  94. package/dist/knowledge/service-templates.js +1 -1
  95. package/dist/knowledge/settlement-semantics.d.ts +1 -0
  96. package/dist/knowledge/settlement-semantics.js +1 -0
  97. package/dist/knowledge/template-loader.d.ts +29 -2
  98. package/dist/knowledge/template-loader.js +1 -1
  99. package/dist/knowledge/template-registry.js +1 -1
  100. package/dist/knowledge/template-scanner.d.ts +14 -0
  101. package/dist/knowledge/template-scanner.js +1 -1
  102. package/dist/knowledge/template-validation.d.ts +2 -0
  103. package/dist/knowledge/template-validation.js +1 -0
  104. package/dist/knowledge/tools-reference.js +1 -1
  105. package/dist/knowledge/workflow-guidance.d.ts +1 -0
  106. package/dist/knowledge/workflow-guidance.js +1 -1
  107. package/dist/monitor/MonitorLoop.js +1 -1
  108. package/dist/participation/allocation-advice.js +1 -1
  109. package/dist/participation/customer-interest.js +1 -1
  110. package/dist/participation/radar-core.d.ts +6 -1
  111. package/dist/participation/radar-core.js +1 -1
  112. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  113. package/dist/playbooks/service-build/game-theory.d.ts +2 -2
  114. package/dist/playbooks/service-build/game-theory.js +1 -1
  115. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  116. package/dist/playbooks/service-build/merchant-guide.d.ts +79 -13
  117. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  118. package/dist/playbooks/service-build/migration-planner.d.ts +7 -0
  119. package/dist/playbooks/service-build/migration-planner.js +1 -1
  120. package/dist/playbooks/service-build/mode-actions.js +1 -1
  121. package/dist/playbooks/service-build/object-panorama.js +1 -1
  122. package/dist/playbooks/service-build/participation-radar.js +1 -1
  123. package/dist/playbooks/service-build/pipeline-actions.d.ts +1 -1
  124. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  125. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  126. package/dist/playbooks/service-build/reverse-mapping-nk4.spec.d.ts +1 -0
  127. package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +1 -0
  128. package/dist/playbooks/service-build/reverse-mapping.d.ts +24 -0
  129. package/dist/playbooks/service-build/reverse-mapping.js +1 -1
  130. package/dist/playbooks/service-build/risk-aggregator.d.ts +1 -1
  131. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  132. package/dist/playbooks/service-build/service-panorama.js +1 -1
  133. package/dist/playbooks/service-build/service-quote.js +1 -1
  134. package/dist/playbooks/service-build/service-quote.spec.js +1 -1
  135. package/dist/playbooks/service-build/workflow-design-assessment.d.ts +2 -2
  136. package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
  137. package/dist/relationship/derivation.d.ts +1 -0
  138. package/dist/review/index.js +1 -1
  139. package/dist/runtime/instance-registry.d.ts +8 -0
  140. package/dist/runtime/instance-registry.js +1 -0
  141. package/dist/safety/confirm-gate.js +1 -1
  142. package/dist/schema/benchmark-migration/index.d.ts +14 -0
  143. package/dist/schema/benchmark-migration/index.js +1 -1
  144. package/dist/schema/call/arbitration.js +1 -1
  145. package/dist/schema/call/base.d.ts +109 -0
  146. package/dist/schema/call/base.js +1 -1
  147. package/dist/schema/call/bridge.d.ts +14 -0
  148. package/dist/schema/call/contact.js +1 -1
  149. package/dist/schema/call/error-codes.d.ts +1 -1
  150. package/dist/schema/call/error-codes.js +1 -1
  151. package/dist/schema/call/guard.d.ts +7 -0
  152. package/dist/schema/call/guard.js +1 -1
  153. package/dist/schema/call/handler.js +1 -1
  154. package/dist/schema/call/machine.d.ts +7 -0
  155. package/dist/schema/call/machine.js +1 -1
  156. package/dist/schema/call/payment.js +1 -1
  157. package/dist/schema/call/permission-handler.js +1 -1
  158. package/dist/schema/call/progress.d.ts +46 -0
  159. package/dist/schema/call/progress.js +1 -1
  160. package/dist/schema/call/semantic.js +1 -1
  161. package/dist/schema/call/service.d.ts +22 -8
  162. package/dist/schema/call/service.js +1 -1
  163. package/dist/schema/common/index.js +1 -1
  164. package/dist/schema/goal/index.d.ts +11 -0
  165. package/dist/schema/goal/planning.d.ts +32 -1
  166. package/dist/schema/goal/planning.js +1 -1
  167. package/dist/schema/industry-pack/index.d.ts +40 -0
  168. package/dist/schema/industry-pack/index.js +1 -1
  169. package/dist/schema/keeper/index.d.ts +13 -0
  170. package/dist/schema/local/index.d.ts +75 -0
  171. package/dist/schema/local/index.js +1 -1
  172. package/dist/schema/messenger/index.d.ts +17 -0
  173. package/dist/schema/messenger/index.js +1 -1
  174. package/dist/schema/operations.d.ts +46 -2
  175. package/dist/schema/operations.js +1 -1
  176. package/dist/schema/query/bi.d.ts +64 -0
  177. package/dist/schema/query/bi.js +1 -1
  178. package/dist/schema/query/index.d.ts +94 -0
  179. package/dist/schema/query/index.js +1 -1
  180. package/dist/schema/schema-version.d.ts +1 -1
  181. package/dist/schema/schema-version.js +1 -1
  182. package/dist/schema/utils/permission-machine-check.js +1 -1
  183. package/dist/schema/workspace/index.d.ts +1 -1
  184. package/dist/schema-query-impl/index.js +1 -1
  185. package/dist/schemas/account_operation.output.json +45 -0
  186. package/dist/schemas/benchmark_migration_operation.output.json +24 -4
  187. package/dist/schemas/benchmark_migration_operation.schema.json +70 -0
  188. package/dist/schemas/bridge_operation.output.json +45 -0
  189. package/dist/schemas/goal_operation.schema.json +79 -1
  190. package/dist/schemas/guard2file.output.json +6 -1
  191. package/dist/schemas/guard2file.schema.json +9 -0
  192. package/dist/schemas/index.json +1 -1
  193. package/dist/schemas/industry_pack_operation.output.json +91 -0
  194. package/dist/schemas/industry_pack_operation.schema.json +19 -1
  195. package/dist/schemas/keeper_operation.output.json +44 -0
  196. package/dist/schemas/local_cache_operation.output.json +45 -0
  197. package/dist/schemas/local_history_operation.output.json +45 -0
  198. package/dist/schemas/local_info_operation.output.json +45 -0
  199. package/dist/schemas/local_mark_operation.output.json +45 -0
  200. package/dist/schemas/machineNode2file.output.json +6 -1
  201. package/dist/schemas/machineNode2file.schema.json +9 -0
  202. package/dist/schemas/messenger_operation.output.json +52 -0
  203. package/dist/schemas/monitor_events.output.json +44 -0
  204. package/dist/schemas/monitor_subscription.output.json +44 -0
  205. package/dist/schemas/onchain_events.output.json +44 -0
  206. package/dist/schemas/onchain_operations.output.json +133 -0
  207. package/dist/schemas/onchain_operations.schema.json +110 -18
  208. package/dist/schemas/onchain_operations_arbitration.schema.json +2 -1
  209. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  210. package/dist/schemas/onchain_operations_guard.schema.json +2 -2
  211. package/dist/schemas/onchain_operations_machine.schema.json +2 -2
  212. package/dist/schemas/onchain_operations_payment.schema.json +1 -1
  213. package/dist/schemas/onchain_operations_progress.schema.json +57 -0
  214. package/dist/schemas/onchain_operations_service.schema.json +44 -10
  215. package/dist/schemas/onchain_table_data.output.json +81 -13
  216. package/dist/schemas/onchain_table_data.schema.json +21 -21
  217. package/dist/schemas/query_toolkit.output.json +218 -9
  218. package/dist/schemas/query_toolkit.schema.json +50 -26
  219. package/dist/schemas/wowok_buildin_info.output.json +80 -1
  220. package/dist/schemas/wowok_buildin_info.schema.json +1 -1
  221. package/dist/tools/handlers/benchmark-migration.d.ts +3 -13
  222. package/dist/tools/handlers/benchmark-migration.js +1 -1
  223. package/dist/tools/handlers/config.js +1 -1
  224. package/dist/tools/handlers/file-export.js +1 -1
  225. package/dist/tools/handlers/industry-pack.js +1 -1
  226. package/dist/tools/handlers/messenger.js +1 -1
  227. package/dist/tools/handlers/onchain.js +1 -1
  228. package/dist/tools/handlers/query.js +1 -1
  229. package/dist/tools/handlers/review-chain.d.ts +22 -0
  230. package/dist/tools/handlers/review-chain.js +1 -0
  231. package/dist/tools/registry/agent.js +1 -1
  232. package/dist/tools/registry/business.js +1 -1
  233. package/dist/tools/registry/config.js +1 -1
  234. package/dist/tools/registry/evaluation.js +1 -1
  235. package/dist/tools/registry/files.js +1 -1
  236. package/dist/tools/registry/identity.js +1 -1
  237. package/dist/tools/registry/local.js +1 -1
  238. package/dist/tools/registry/messenger.js +1 -1
  239. package/dist/tools/registry/monitor.js +1 -1
  240. package/dist/tools/registry/onchain.js +1 -1
  241. package/dist/tools/registry/query.js +1 -1
  242. package/dist/tools/rules-hook.js +1 -1
  243. package/dist/tools/runtime-health.d.ts +10 -0
  244. package/dist/tools/runtime-health.js +1 -0
  245. package/dist/tools/upgrade-check.d.ts +10 -1
  246. package/dist/tools/upgrade-check.js +1 -1
  247. package/dist/tools/wip-deploy-assist.js +1 -1
  248. package/dist/tools/wrap.d.ts +3 -0
  249. package/dist/tools/wrap.js +1 -1
  250. package/package.json +2 -2
  251. package/dist/playbooks/service-build/semantic-graph.d.ts +0 -99
  252. package/dist/playbooks/service-build/semantic-graph.js +0 -1
@@ -1 +1 @@
1
- import{afterEach,beforeEach,describe,expect,it}from'vitest';import{existsSync,mkdtempSync,rmSync,writeFileSync}from'node:fs';import{tmpdir}from'node:os';import{join}from'node:path';import{ENTRYPOINT}from'@wowok/wowok';import{clearJudgmentLayers,clearJudgmentOverride,clearJudgmentOverrides,getJudgmentDoc,judgmentDisableTrace,judgmentLayerError,judgmentStatus,patchUserJudgmentDoc,setJudgmentIndustryOverlay,setJudgmentOverride,setJudgmentPersonaFragment}from'./judgment.js';import{checkUtilRisks}from'../knowledge/util-risk.js';import{appetiteMultiplier,evaluateOutcome,resolveInterests}from'../evaluation/game-strategy.js';import{evaluateArbGame}from'../evaluation/arbitration-game.js';import{registerDemandMatchEvaluation,matchDemandToServices}from'../evaluation/builtins/demand-match.js';import{extractDemandCapability}from'../evaluation/extract.js';import{monitorOrder}from'../customer/order-monitor.js';import{ModeEvaluator}from'../extensions/mode-evaluator.js';import{mergedBaselinesOverlay,registerIndustryBaselines}from'../extensions/industry-layers.js';import{scoreScorecard}from'../strategy/scorecard.js';import{FakeDataPlane}from'../graph/onchain/dataplane.js';import{expandTopology}from'../graph/onchain/expand.js';import{FULL,fullServiceState}from'../graph/onchain/fixtures.js';import{buildViewport}from'../graph/onchain/viewport.js';import{runAnalyzers}from'../graph/onchain/analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../graph/onchain/strategy.js';import{projectEvaluationFacts}from'../graph/onchain/facts.js';import{evaluateGraphServiceFacts,registerGraphServiceEvaluations}from'../evaluation/builtins/graph-service.js';let configDir;function writeUserDoc(a){writeFileSync(join(configDir,'judgment.json'),JSON['stringify'](a,null,0x2),'utf-8');}beforeEach(()=>{configDir=mkdtempSync(join(tmpdir(),'wowok-config-audit-')),process['env']['WOWOK_CONFIG_DIR']=configDir,registerDemandMatchEvaluation();}),afterEach(()=>{delete process['env']['WOWOK_CONFIG_DIR'];if(existsSync(configDir))rmSync(configDir,{'recursive':!![],'force':!![]});clearJudgmentOverrides(),clearJudgmentLayers();});async function projectFixture(){registerGraphServiceEvaluations();const a=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),b=await expandTopology(new FakeDataPlane(fullServiceState()),{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'edges':a['edges'],'budget':a['budget']}),c=buildViewport(b,FULL['svc'],'neutral');return projectEvaluationFacts(c,FULL['svc'],runAnalyzers(c));}const demandCap=extractDemandCapability({'object':'0xdemand','location':'Shanghai','description':'need\x20a\x20freelance\x20designer'},{'industry':'freelance','price_max':0x96n,'keywords':['design','logo'],'capabilities':{'has_arbitration':!![],'has_refund_path':!![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':!![],'has_messenger':![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]}}),inRegionService={'object':'0xgood','location':'Shanghai','description':'freelance\x20logo\x20design','sales':[{'price':'100','wip_hash':'abc'}],'arbitrations':['0xarb'],'compensation_fund':'500','bPublished':!![],'bPaused':![]},breakdownOf=(a,b)=>a['breakdown']['find'](c=>c['rule_id']===b);describe('config\x20audit\x20—\x20evaluation\x20section',()=>{it('1.\x20weights.trust_reviews\x20flows\x20into\x20the\x20aggregated\x20trust\x20total\x20(user\x20doc\x20channel)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['breakdown']['find'](d=>d['rule_id']==='trust_reviews')['weight'])['toBe'](0x23),writeUserDoc({'version':0x1,'evaluation':{'weights':{'trust_reviews':0x46}}});const c=await evaluateGraphServiceFacts(a);expect(c['trust']['breakdown']['find'](d=>d['rule_id']==='trust_reviews')['weight'])['toBe'](0x46),expect(c['trust']['total'])['toBe'](0x2f);}),it('2.\x20severity_deduction.critical\x2050→5\x20lifts\x20the\x20risk-side\x20rule\x20score\x20(session\x20override)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['risk']['breakdown']['find'](d=>d['rule_id']==='risk_fund')['score'])['toBe'](0x19),expect(setJudgmentOverride('evaluation.severity_deduction.critical',0x5))['toEqual']({'ok':!![]});const c=await evaluateGraphServiceFacts(a);expect(c['risk']['breakdown']['find'](d=>d['rule_id']==='risk_fund')['score'])['toBe'](0x46),expect(c['risk']['breakdown']['find'](d=>d['rule_id']==='risk_trust')['score'])['toBe'](0x41),expect(c['risk']['total'])['toBe'](0x56);}),it('3.\x20level_bands\x20first\x20band\x20min\x2085→30\x20flips\x20the\x20level\x20of\x20an\x20unchanged\x20score\x20(session\x20override)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['total'])['toBe'](0x31),expect(b['trust']['level'])['toBe']('high'),setJudgmentOverride('evaluation.level_bands',[{'min':0x1e,'level':'low'},{'min':0x46,'level':'medium_low'},{'min':0x32,'level':'medium_high'},{'min':0x0,'level':'high'}]);const c=await evaluateGraphServiceFacts(a);expect(c['trust']['total'])['toBe'](0x31),expect(c['trust']['level'])['toBe']('low');}),it('4.\x20grade_words.trust\x20first\x20band\x20min\x2070→20\x20flips\x20the\x20rendered\x20grade\x20word\x20(session\x20override)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['summary'])['toContain']('grade:\x20weak'),setJudgmentOverride('evaluation.grade_words.trust',[{'min':0x14,'word':'strong'},{'min':0x32,'word':'fair'},{'min':0x0,'word':'weak'}]);const c=await evaluateGraphServiceFacts(a);expect(c['trust']['summary'])['toContain']('grade:\x20strong');}),it('5.\x20dimensions.<id>.label\x20retune\x20reaches\x20the\x20live\x20summary\x20rendering\x20(industry\x20overlay\x20channel)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['summary'])['toContain']('weakest\x20Fund\x20safety'),setJudgmentIndustryOverlay({'evaluation':{'dimensions':{'trust_fund_safety':{'label':'Fund\x20Cushion','description':'audit\x20retune'}}}},'pack:audit');const c=await evaluateGraphServiceFacts(a);expect(c['trust']['summary'])['toContain']('weakest\x20Fund\x20Cushion'),expect(c['trust']['breakdown']['find'](d=>d['rule_id']==='trust_fund_safety')['dimension'])['toBe']('Fund\x20Cushion');});}),describe('config\x20audit\x20—\x20game\x20section',()=>{it('6.\x20scoring.base\x2060→80\x20lifts\x20every\x20net\x20score\x20(judgment_doc_patch\x20channel)',()=>{expect(evaluateOutcome('refund','customer')['net_score'])['toBe'](0x50);const a=patchUserJudgmentDoc({'game':{'scoring':{'base':0x50}}});expect(a['applied'])['toBe'](!![]),expect(evaluateOutcome('refund','customer')['net_score'])['toBe'](0x64);}),it('7.\x20appetite_multipliers.conservative\x201.5→0.6\x20changes\x20the\x20conservative\x20sensitivity\x20result\x20(session\x20override)',()=>{const a=evaluateOutcome('refund','merchant',{'risk_appetite':'conservative'});expect(a['risk_score'])['toBe'](0x4b),expect(a['net_score'])['toBe'](0x0),setJudgmentOverride('game.appetite_multipliers.conservative',0.6);const b=evaluateOutcome('refund','merchant',{'risk_appetite':'conservative'});expect(b['risk_score'])['toBe'](0x1e),expect(b['net_score'])['toBe'](0x1e),expect(appetiteMultiplier('conservative'))['toBe'](0.6);}),it('8.\x20role_interests.customer.prefer\x20+\x20node_advanced\x20adds\x20a\x20gain\x20(industry\x20overlay\x20channel)',()=>{const a=evaluateOutcome('advance','customer');expect(a['gains'])['toEqual']([]),expect(a['net_score'])['toBe'](0x3c),setJudgmentIndustryOverlay({'game':{'role_interests':{'customer':{'prefer':['fund_returned_to_buyer','node_advanced'],'avoid':[],'sensitivity':0x1}}}},'pack:audit');const b=evaluateOutcome('advance','customer');expect(b['gains'])['toEqual'](['node_advanced']),expect(b['net_score'])['toBe'](0x50);}),it('9.\x20a\x20new\x20keyword_rules\x20entry\x20re-anchors\x20prefer\x20on\x20a\x20matching\x20requirement\x20(user\x20doc\x20channel)',()=>{const a=resolveInterests('system',{'requirements':['please\x20test\x20it']});expect(a['prefer'])['toEqual']([]),writeUserDoc({'version':0x1,'game':{'keyword_rules':[{'id':'kw_audit_testing','keywords':['test'],'effect':'node_advanced','anchor':'prefer','when_forbidden':![]}]}});const b=resolveInterests('system',{'requirements':['please\x20test\x20it']});expect(b['prefer'])['toEqual'](['node_advanced']);}),it('10.\x20forbid_pattern\x20rewritten\x20to\x20a\x20non-matching\x20pattern\x20disarms\x20when_forbidden\x20rules\x20(user\x20doc\x20channel)',()=>{const a=resolveInterests('neutral',{'requirements':['never\x20arbitration']});expect(a['avoid'])['toContain']('arbitration_review_triggered'),writeUserDoc({'version':0x1,'game':{'forbid_pattern':'zzz_never_matches'}});const b=resolveInterests('neutral',{'requirements':['never\x20arbitration']});expect(b['avoid'])['toEqual']([]);});}),describe('config\x20audit\x20—\x20game.arb\x20section\x20(7-state\x20game)',()=>{it('11.\x20arb.scoring.per_gain\x2020→40\x20moves\x20the\x20favorability\x20of\x20a\x201-gain\x20move\x20(session\x20override)',()=>{const a=evaluateArbGame('Voting','arbitrator');expect(a['actions'][0x0]?.['gain_score'])['toBe'](0x14),expect(a['actions'][0x0]?.['favorability'])['toBe'](0x50),setJudgmentOverride('game.arb.scoring.per_gain',0x28);const b=evaluateArbGame('Voting','arbitrator');expect(b['actions'][0x0]?.['gain_score'])['toBe'](0x28),expect(b['actions'][0x0]?.['favorability'])['toBe'](0x64);}),it('12.\x20a\x20new\x20arb\x20keyword_rules\x20entry\x20re-anchors\x20a\x20perspective\x27s\x20prefer\x20(user\x20doc\x20channel)',()=>{const a=evaluateArbGame('Principal_confirming','customer',{'requirements':['expedite\x20please']});expect(a['actions'][0x0]?.['gain_score'])['toBe'](0x0),expect(a['actions'][0x0]?.['favorability'])['toBe'](0x3c),writeUserDoc({'version':0x1,'game':{'arb':{'keyword_rules':[{'id':'arb_kw_audit_expedite','keywords':['expedite'],'effect':'case_advanced','anchor':'prefer','when_forbidden':![]}]}}});const b=evaluateArbGame('Principal_confirming','customer',{'requirements':['expedite\x20please']});expect(b['actions'][0x0]?.['gain_score'])['toBe'](0x14),expect(b['actions'][0x0]?.['favorability'])['toBe'](0x50);});}),describe('config\x20audit\x20—\x20match\x20section',()=>{it('13.\x20region_scores.exact\x20100→50\x20halves\x20the\x20region\x20rule\x20score\x20(session\x20override)',async()=>{const [a]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(a['result'],'region')['score'])['toBe'](0x64),setJudgmentOverride('match.region_scores.exact',0x32);const [b]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(b['result'],'region')['score'])['toBe'](0x32),expect(b['result']['total'])['toBeLessThan'](a['result']['total']);}),it('14.\x20weights.capabilities\x2030→60\x20raises\x20its\x20renormalized\x20share\x20(session\x20override)',async()=>{const [a]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(a['result'],'capabilities')['weight'])['toBe'](0x1e),expect(a['result']['total'])['toBe'](0x43),setJudgmentOverride('match.weights.capabilities',0x3c);const [b]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(b['result'],'capabilities')['weight'])['toBe'](0x3c),expect(breakdownOf(b['result'],'region')['weight'])['toBe'](0xf),expect(b['result']['total'])['toBe'](0x4a);}),it('15.\x20trust_bands\x20second\x20band\x20score\x2060→10\x20(extracted\x20trust_score\x20is\x2050\x20→\x20band\x20#2)\x20(session\x20override)',async()=>{const [a]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(a['result'],'trust')['score'])['toBe'](0x3c),setJudgmentOverride('match.trust_bands',[{'min':0x4b,'score':0x64},{'min':0x32,'score':0xa},{'min':0x19,'score':0x1e},{'min':0x0,'score':0x0}]);const [b]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(b['result'],'trust')['score'])['toBe'](0xa);}),it('16.\x20neutral_score\x2050→10\x20changes\x20unknown-signal\x20scoring\x20(user\x20doc\x20channel)',async()=>{const a=extractDemandCapability({'object':'0xdemand','location':'Shanghai','description':'anything'},{'industry':'freelance','price_max':0x96n,'keywords':[],'capabilities':{'has_arbitration':![],'has_refund_path':![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':![],'has_messenger':![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':![],'is_paused':![]}}),[b]=await matchDemandToServices(a,[inRegionService]);expect(breakdownOf(b['result'],'tags')['score'])['toBe'](0x32),writeUserDoc({'version':0x1,'match':{'neutral_score':0xa}});const [c]=await matchDemandToServices(a,[inRegionService]);expect(breakdownOf(c['result'],'tags')['score'])['toBe'](0xa);}),it('17.\x20price_over_budget_tolerance_pct\x2010→100\x20turns\x20a\x20rejection\x20into\x20a\x20partial\x20score\x20(session\x20override)',async()=>{const a={...inRegionService,'object':'0xpricey','sales':[{'price':'200','wip_hash':'x'}]},[b]=await matchDemandToServices(demandCap,[a]);expect(breakdownOf(b['result'],'price')['score'])['toBe'](0x0),setJudgmentOverride('match.price_over_budget_tolerance_pct',0x64);const [c]=await matchDemandToServices(demandCap,[a]);expect(breakdownOf(c['result'],'price')['score'])['toBe'](0x32);}),it('18.\x20top_n\x205→2\x20caps\x20the\x20returned\x20candidate\x20count\x20(session\x20override)',async()=>{const a=[inRegionService,{...inRegionService,'object':'0xb'},{...inRegionService,'object':'0xc'}];expect((await matchDemandToServices(demandCap,a))['length'])['toBe'](0x3),setJudgmentOverride('match.top_n',0x2),expect((await matchDemandToServices(demandCap,a))['length'])['toBe'](0x2);});}),describe('config\x20audit\x20—\x20monitor\x20section',()=>{const a=0x36ee80,b=c=>({'order_id':'0xorder','service_id':'0xservice','created_at':0x64*a,'now':0x64*a,...c});it('19.\x20messenger_timeout_hours\x2024→1\x20surfaces\x20the\x20timeout\x20finding\x20(user\x20doc\x20hot\x20reload)',()=>{const c=b({'last_user_message_at':0x62*a,'has_messenger':!![]});expect(monitorOrder({'current':c})['map'](f=>f['id']))['not']['toContain']('messenger_unanswered'),writeUserDoc({'version':0x1,'monitor':{'thresholds':{'messenger_timeout_hours':0x1}}});const d=monitorOrder({'current':c}),e=d['find'](f=>f['id']==='messenger_unanswered');expect(e?.['severity'])['toBe']('high');}),it('20.\x20escalation.stall_escalation_multiplier\x202→1\x20moves\x20the\x20critical\x20escalation\x20point\x20(session\x20override)',()=>{const c=b({'current_node':'Pay','last_progress_at':0x14*a}),d=monitorOrder({'current':c})['find'](f=>f['id']==='progress_stall');expect(d?.['severity'])['toBe']('high'),setJudgmentOverride('monitor.escalation.stall_escalation_multiplier',0x1);const e=monitorOrder({'current':c})['find'](f=>f['id']==='progress_stall');expect(e?.['severity'])['toBe']('critical');}),it('21.\x20compensation_coverage_min\x201.0→5\x20surfaces\x20the\x20insufficient-coverage\x20finding\x20(session\x20override)',()=>{const c=b({'compensation_balance':0x64n,'order_amount':0x64n});expect(monitorOrder({'current':c})['map'](e=>e['id']))['not']['toContain']('compensation_insufficient'),setJudgmentOverride('monitor.thresholds.compensation_coverage_min',0x5);const d=monitorOrder({'current':c})['find'](e=>e['id']==='compensation_insufficient');expect(d?.['severity'])['toBe']('high');}),it('22.\x20explicit\x20MonitorThresholds\x20argument\x20wins\x20over\x20the\x20document\x20(caller\x20precedence)',()=>{const c=b({'last_user_message_at':0x62*a,'has_messenger':!![]});setJudgmentOverride('monitor.thresholds.messenger_timeout_hours',0x1),expect(monitorOrder({'current':c})['map'](d=>d['id']))['toContain']('messenger_unanswered'),expect(monitorOrder({'current':c,'thresholds':{'messenger_timeout_hours':0x48}})['map'](d=>d['id']))['not']['toContain']('messenger_unanswered'),clearJudgmentOverride('monitor.thresholds.messenger_timeout_hours');});}),describe('config\x20audit\x20—\x20mode\x20section',()=>{it('23.\x20appetite_thresholds.conservative.max_risk\x2030→99\x20flips\x20the\x20risk\x20recommendation\x20(session\x20override)',()=>{const a={'getCard':f=>({'constraints':{},'risk_profile':{'funds_risk':'medium'}})},b=new ModeEvaluator(a),c={'name':'audit_mode','traits':[],'machine_shape':{},'capabilities_used':['cap_audit'],'risk_appetite':'conservative','risk_constraints':{}},d=b['evaluateMode'](c);expect(d['risk_score'])['toBe'](0x3c),expect(d['recommendations']['join']('\x0a'))['toContain']('exceeds\x20conservative\x20mode\x20threshold\x2030'),setJudgmentOverride('mode.appetite_thresholds.conservative.max_risk',0x63);const e=b['evaluateMode'](c);expect(e['risk_score'])['toBe'](0x3c),expect(e['recommendations']['join']('\x0a'))['not']['toContain']('exceeds');});}),describe('config\x20audit\x20—\x20scorecard\x20section',()=>{function a(c){return{'account':'0xshop','industry':'education','network':'testnet','collected_at':0x0,'metrics':c,'unavailable':[],'errors':[]};}const b=(c,d)=>({'id':c,'source':'market_operations','status':'ok','value':d,'collected_at':0x0});it('24.\x20metrics.order_count.good_threshold\x2020→1\x20drives\x20the\x20metric\x20to\x20full\x20score\x20(session\x20override)',()=>{const d=a([b('order_count',0x1)]),e=scoreScorecard(d,'balanced');expect(e['metric_scores'][0x0]?.['score'])['toBe'](0x0),expect(e['overall'])['toBe'](0x0),setJudgmentOverride('scorecard.metrics.order_count.good_threshold',0x1);const f=scoreScorecard(d,'balanced');expect(f['metric_scores'][0x0]?.['score'])['toBe'](0x64),expect(f['overall'])['toBe'](0x64);}),it('25.\x20metrics.completion_rate.weight\x20posture\x20retune\x20changes\x20the\x20normalized\x20overall\x20(session\x20override)',()=>{const d=a([b('order_count',0x5),b('completion_rate',0.75)]),e=scoreScorecard(d,'margin');expect(e['metric_scores'][0x1]?.['weight'])['toBe'](0.15),expect(e['overall'])['toBe'](0x26),setJudgmentOverride('scorecard.metrics.completion_rate.weight',{'volume':0.15,'balanced':0.2,'margin':0.9});const f=scoreScorecard(d,'margin');expect(f['metric_scores'][0x1]?.['weight'])['toBe'](0.9),expect(f['overall'])['toBe'](0x2f);}),it('26.\x20shop_evidence_metrics\x20cleared\x20→\x20market-only\x20evidence\x20yields\x20a\x20null\x20overall\x20(session\x20override)',()=>{const d=a([b('order_count',0x14),b('supply_demand_ratio',0x2)]),e=scoreScorecard(d,'balanced');expect(e['overall'])['toBe'](0x5e),setJudgmentOverride('scorecard.shop_evidence_metrics',[]);const f=scoreScorecard(d,'balanced');expect(f['overall'])['toBeNull']();});}),describe('config\x20audit\x20—\x20rules\x20section\x20(declarative\x20rule\x20book)',()=>{it('27.\x20a\x20retuned\x20case\x20level\x20low→high\x20changes\x20the\x20finding\x20severity\x20(user\x20doc\x20channel)',()=>{const a=checkUtilRisks({'large_util_import':!![]})['find'](c=>c['id']==='R-UTIL-03');expect(a?.['level'])['toBe']('low'),writeUserDoc({'version':0x1,'rules':{'domains':{'util':{'rules':[{'rule_id':'R-UTIL-03','cases':[{'when':{'field':'large_util_import','op':'eq','value':!![]},'level':'high','title':'AUDIT:\x20util\x20import\x20retuned\x20to\x20high','description':'Audit-rewritten\x20description\x20for\x20R-UTIL-03.'}]}]}}}});const b=checkUtilRisks({'large_util_import':!![]})['find'](c=>c['id']==='R-UTIL-03');expect(b?.['level'])['toBe']('high'),expect(b?.['title'])['toContain']('AUDIT');}),it('28.\x20enabled:false\x20via\x20the\x20industry\x20layer\x20silences\x20the\x20finding\x20AND\x20leaves\x20a\x20disable\x20trace',()=>{expect(checkUtilRisks({'large_util_import':!![],'expects_util_events':!![]})['map'](a=>a['id']))['toEqual'](['R-UTIL-03','R-UTIL-04']),expect(setJudgmentIndustryOverlay({'rules':{'domains':{'util':{'rules':[{'rule_id':'R-UTIL-03','enabled':![]}]}}}},'pack:audit')['ok'])['toBe'](!![]),expect(checkUtilRisks({'large_util_import':!![],'expects_util_events':!![]})['map'](a=>a['id']))['toEqual'](['R-UTIL-04']),expect(judgmentDisableTrace())['toEqual']([{'layer':'pack:audit','domain':'util','rule_id':'R-UTIL-03'}]);}),it('29.\x20case.title/description\x20rewording\x20is\x20visible\x20in\x20the\x20finding\x20text\x20(user\x20doc\x20channel)',()=>{const a=checkUtilRisks({'bcs_manually_synced':!![]})['find'](c=>c['id']==='R-UTIL-05');expect(a?.['title'])['toContain']('SDK\x20BCS\x20structures\x20must\x20stay\x20in\x20sync'),writeUserDoc({'version':0x1,'rules':{'domains':{'util':{'rules':[{'rule_id':'R-UTIL-05','cases':[{'when':{'field':'bcs_manually_synced','op':'eq','value':!![]},'level':'medium','title':'AUDIT:\x20hand-maintained\x20BCS\x20layouts\x20drift\x20from\x20Move\x20structs','description':'Audit-rewritten\x20description\x20for\x20R-UTIL-05.'}]}]}}}});const b=checkUtilRisks({'bcs_manually_synced':!![]})['find'](c=>c['id']==='R-UTIL-05');expect(b?.['title'])['toContain']('AUDIT:\x20hand-maintained\x20BCS'),expect(b?.['description'])['toContain']('Audit-rewritten\x20description\x20for\x20R-UTIL-05.');});}),describe('config\x20audit\x20—\x20layer\x20chain\x20and\x20composition',()=>{it('30.\x20precedence\x20chain:\x20industry\x20X=61\x20<\x20persona\x20X=62\x20<\x20user\x20doc\x20X=63,\x20unwinding\x20in\x20reverse',()=>{expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3c),setJudgmentIndustryOverlay({'game':{'scoring':{'base':0x3d}}},'pack:x'),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3d),setJudgmentPersonaFragment({'game':{'scoring':{'base':0x3e}}},'persona:y'),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3e),writeUserDoc({'version':0x1,'game':{'scoring':{'base':0x3f}}}),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3f),expect(evaluateOutcome('refund','customer')['net_score'])['toBe'](0x53),rmSync(join(configDir,'judgment.json')),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3e),setJudgmentPersonaFragment(null),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3d),setJudgmentIndustryOverlay(null),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3c);}),it('31.\x20mergedBaselinesOverlay:\x20the\x20later\x20industry\x20in\x20the\x20list\x20wins,\x20and\x20the\x20merged\x20overlay\x20drives\x20the\x20engine',()=>{registerIndustryBaselines({'category':'audit-a','fragment':{'monitor':{'thresholds':{'messenger_timeout_hours':0x1}}}}),registerIndustryBaselines({'category':'audit-b','fragment':{'monitor':{'thresholds':{'messenger_timeout_hours':0x2}}}});const a=mergedBaselinesOverlay(['audit-a','audit-b']);expect(a['monitor']?.['thresholds']?.['messenger_timeout_hours'])['toBe'](0x2),expect(setJudgmentIndustryOverlay(mergedBaselinesOverlay(['audit-a','audit-b']),'merged:audit')['ok'])['toBe'](!![]),expect(getJudgmentDoc()['monitor']['thresholds']['messenger_timeout_hours'])['toBe'](0x2);const b=0x36ee80,c={'order_id':'0xorder','service_id':'0xs','created_at':0x64*b,'now':0x64*b,'last_user_message_at':98.5*b,'has_messenger':!![]};expect(monitorOrder({'current':c})['map'](d=>d['id']))['not']['toContain']('messenger_unanswered');}),it('32.\x20an\x20invalid\x20persona\x20fragment\x20is\x20rejected,\x20the\x20layer\x20error\x20is\x20visible,\x20the\x20last\x20good\x20stays\x20in\x20force',()=>{expect(setJudgmentPersonaFragment({'game':{'scoring':{'base':0x46}}},'persona:audit')['ok'])['toBe'](!![]),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x46);const a=setJudgmentPersonaFragment({'game':{'scoring':{'bse':0x1}}},'persona:audit');expect(a['ok'])['toBe'](![]),expect(judgmentLayerError('persona'))['toContain']('bse'),expect(judgmentStatus()['layer_errors']['persona'])['toContain']('bse'),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x46);}),it('33.\x20severity_deduction\x20×\x20level_bands\x20combo:\x20a\x20big\x20deduction\x20pushes\x20the\x20score\x20across\x20a\x20band\x20boundary',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['risk']['total'])['toBe'](0x4a),expect(b['risk']['level'])['toBe']('medium_low'),setJudgmentOverride('evaluation.severity_deduction.high',0x50);const c=await evaluateGraphServiceFacts(a);expect(c['risk']['total'])['toBe'](0x39),expect(c['risk']['level'])['toBe']('medium_high');});}),describe('config\x20audit\x20—\x20rejection\x20semantics',()=>{it('34a.\x20user-document\x20guardrails:\x20typoed\x20weight,\x20invented\x20rule\x20id,\x20non-enum\x20severity\x20word',()=>{writeUserDoc({'version':0x1,'evaluation':{'weights':{'trust_revews':0x32}}}),getJudgmentDoc(),expect(judgmentStatus()['last_reload_error'])['toContain']('unknown\x20dimension\x20\x27trust_revews\x27'),expect(getJudgmentDoc()['evaluation']['weights']['trust_reviews'])['toBe'](0x23),writeUserDoc({'version':0x1,'rules':{'domains':{'service':{'rules':[{'rule_id':'R-S-9-99','enabled':![]}]}}}}),getJudgmentDoc(),expect(judgmentStatus()['last_reload_error'])['toContain']('unknown\x20rule\x20\x27R-S-9-99\x27'),writeUserDoc({'version':0x1,'evaluation':{'severity_deduction':{'warning':0x19}}}),getJudgmentDoc(),expect(judgmentStatus()['last_reload_error'])['toMatch'](/warning/i),expect(getJudgmentDoc()['evaluation']['severity_deduction']['critical'])['toBe'](0x32);}),it('34b.\x20judgment_set\x20guardrails:\x20type\x20mismatch\x20and\x20unknown\x20path\x20are\x20rejected',()=>{expect(setJudgmentOverride('evaluation.weights.trust_reviews','high')['ok'])['toBe'](![]),expect(setJudgmentOverride('evaluation.weights.does_not_exist',0x1)['ok'])['toBe'](![]),expect(getJudgmentDoc()['evaluation']['weights']['trust_reviews'])['toBe'](0x23);});});
1
+ import{afterEach,beforeEach,describe,expect,it}from'vitest';import{existsSync,mkdtempSync,rmSync,writeFileSync}from'node:fs';import{tmpdir}from'node:os';import{join}from'node:path';import{ENTRYPOINT}from'@wowok/wowok';import{clearJudgmentLayers,clearJudgmentOverride,clearJudgmentOverrides,getJudgmentDoc,judgmentDisableTrace,judgmentLayerError,judgmentStatus,patchUserJudgmentDoc,setJudgmentIndustryOverlay,setJudgmentOverride,setJudgmentPersonaFragment}from'./judgment.js';import{checkUtilRisks}from'../knowledge/util-risk.js';import{appetiteMultiplier,evaluateOutcome,resolveInterests}from'../evaluation/game-strategy.js';import{evaluateArbGame}from'../evaluation/arbitration-game.js';import{registerDemandMatchEvaluation,matchDemandToServices}from'../evaluation/builtins/demand-match.js';import{extractDemandCapability}from'../evaluation/extract.js';import{monitorOrder}from'../customer/order-monitor.js';import{ModeEvaluator}from'../extensions/mode-evaluator.js';import{mergedBaselinesOverlay,registerIndustryBaselines}from'../extensions/industry-layers.js';import{scoreScorecard}from'../strategy/scorecard.js';import{FakeDataPlane}from'../graph/onchain/dataplane.js';import{expandTopology}from'../graph/onchain/expand.js';import{FULL,fullServiceState}from'../graph/onchain/fixtures.js';import{buildViewport}from'../graph/onchain/viewport.js';import{runAnalyzers}from'../graph/onchain/analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../graph/onchain/strategy.js';import{projectEvaluationFacts}from'../graph/onchain/facts.js';import{evaluateGraphServiceFacts,registerGraphServiceEvaluations}from'../evaluation/builtins/graph-service.js';let configDir;function writeUserDoc(a){writeFileSync(join(configDir,'judgment.json'),JSON['stringify'](a,null,0x2),'utf-8');}beforeEach(()=>{configDir=mkdtempSync(join(tmpdir(),'wowok-config-audit-')),process['env']['WOWOK_CONFIG_DIR']=configDir,registerDemandMatchEvaluation();}),afterEach(()=>{delete process['env']['WOWOK_CONFIG_DIR'];if(existsSync(configDir))rmSync(configDir,{'recursive':!![],'force':!![]});clearJudgmentOverrides(),clearJudgmentLayers();});async function projectFixture(){registerGraphServiceEvaluations();const a=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),b=await expandTopology(new FakeDataPlane(fullServiceState()),{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'edges':a['edges'],'budget':a['budget']}),c=buildViewport(b,FULL['svc'],'neutral');return projectEvaluationFacts(c,FULL['svc'],runAnalyzers(c));}const demandCap=extractDemandCapability({'object':'0xdemand','location':'Shanghai','description':'need\x20a\x20freelance\x20designer'},{'industry':'freelance','price_max':0x96n,'keywords':['design','logo'],'capabilities':{'has_arbitration':!![],'has_refund_path':!![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':!![],'has_messenger':![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]}}),inRegionService={'object':'0xgood','location':'Shanghai','description':'freelance\x20logo\x20design','sales':[{'price':'100','wip_hash':'abc'}],'arbitrations':['0xarb'],'compensation_fund':'500','bPublished':!![],'bPaused':![]},breakdownOf=(a,b)=>a['breakdown']['find'](c=>c['rule_id']===b);describe('config\x20audit\x20—\x20evaluation\x20section',()=>{it('1.\x20weights.trust_reviews\x20flows\x20into\x20the\x20aggregated\x20trust\x20total\x20(user\x20doc\x20channel)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['breakdown']['find'](d=>d['rule_id']==='trust_reviews')['weight'])['toBe'](0x23),writeUserDoc({'version':0x1,'evaluation':{'weights':{'trust_reviews':0x46}}});const c=await evaluateGraphServiceFacts(a);expect(c['trust']['breakdown']['find'](d=>d['rule_id']==='trust_reviews')['weight'])['toBe'](0x46),expect(c['trust']['total'])['toBe'](0x2f);}),it('2.\x20severity_deduction.critical\x2050→5\x20lifts\x20the\x20risk-side\x20rule\x20score\x20(session\x20override)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['risk']['breakdown']['find'](d=>d['rule_id']==='risk_fund')['score'])['toBe'](0x19),expect(setJudgmentOverride('evaluation.severity_deduction.critical',0x5))['toEqual']({'ok':!![]});const c=await evaluateGraphServiceFacts(a);expect(c['risk']['breakdown']['find'](d=>d['rule_id']==='risk_fund')['score'])['toBe'](0x46),expect(c['risk']['breakdown']['find'](d=>d['rule_id']==='risk_trust')['score'])['toBe'](0x41),expect(c['risk']['total'])['toBe'](0x56);}),it('3.\x20level_bands\x20first\x20band\x20min\x2085→30\x20flips\x20the\x20level\x20of\x20an\x20unchanged\x20score\x20(session\x20override)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['total'])['toBe'](0x31),expect(b['trust']['level'])['toBe']('high'),setJudgmentOverride('evaluation.level_bands',[{'min':0x1e,'level':'low'},{'min':0x46,'level':'medium_low'},{'min':0x32,'level':'medium_high'},{'min':0x0,'level':'high'}]);const c=await evaluateGraphServiceFacts(a);expect(c['trust']['total'])['toBe'](0x31),expect(c['trust']['level'])['toBe']('low');}),it('4.\x20grade_words.trust\x20first\x20band\x20min\x2070→20\x20flips\x20the\x20rendered\x20grade\x20word\x20(session\x20override)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['summary'])['toContain']('grade:\x20weak'),setJudgmentOverride('evaluation.grade_words.trust',[{'min':0x14,'word':'strong'},{'min':0x32,'word':'fair'},{'min':0x0,'word':'weak'}]);const c=await evaluateGraphServiceFacts(a);expect(c['trust']['summary'])['toContain']('grade:\x20strong');}),it('5.\x20dimensions.<id>.label\x20retune\x20reaches\x20the\x20live\x20summary\x20rendering\x20(industry\x20overlay\x20channel)',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['trust']['summary'])['toContain']('weakest\x20Fund\x20safety'),setJudgmentIndustryOverlay({'evaluation':{'dimensions':{'trust_fund_safety':{'label':'Fund\x20Cushion','description':'audit\x20retune'}}}},'pack:audit');const c=await evaluateGraphServiceFacts(a);expect(c['trust']['summary'])['toContain']('weakest\x20Fund\x20Cushion'),expect(c['trust']['breakdown']['find'](d=>d['rule_id']==='trust_fund_safety')['dimension'])['toBe']('Fund\x20Cushion');});}),describe('config\x20audit\x20—\x20game\x20section',()=>{it('6.\x20scoring.base\x2060→80\x20lifts\x20every\x20net\x20score\x20(judgment_doc_patch\x20channel)',()=>{expect(evaluateOutcome('refund','customer')['net_score'])['toBe'](0x50);const a=patchUserJudgmentDoc({'game':{'scoring':{'base':0x50}}});expect(a['applied'])['toBe'](!![]),expect(evaluateOutcome('refund','customer')['net_score'])['toBe'](0x64);}),it('7.\x20appetite_multipliers.conservative\x201.5→0.6\x20changes\x20the\x20conservative\x20sensitivity\x20result\x20(session\x20override)',()=>{const a=evaluateOutcome('refund','merchant',{'risk_appetite':'conservative'});expect(a['risk_score'])['toBe'](0x4b),expect(a['net_score'])['toBe'](0x0),setJudgmentOverride('game.appetite_multipliers.conservative',0.6);const b=evaluateOutcome('refund','merchant',{'risk_appetite':'conservative'});expect(b['risk_score'])['toBe'](0x1e),expect(b['net_score'])['toBe'](0x1e),expect(appetiteMultiplier('conservative'))['toBe'](0.6);}),it('8.\x20role_interests.customer.prefer\x20+\x20node_advanced\x20adds\x20a\x20gain\x20(industry\x20overlay\x20channel)',()=>{const a=evaluateOutcome('advance','customer');expect(a['gains'])['toEqual']([]),expect(a['net_score'])['toBe'](0x3c),setJudgmentIndustryOverlay({'game':{'role_interests':{'customer':{'prefer':['fund_returned_to_buyer','node_advanced'],'avoid':[],'sensitivity':0x1}}}},'pack:audit');const b=evaluateOutcome('advance','customer');expect(b['gains'])['toEqual'](['node_advanced']),expect(b['net_score'])['toBe'](0x50);}),it('9.\x20a\x20new\x20keyword_rules\x20entry\x20re-anchors\x20prefer\x20on\x20a\x20matching\x20requirement\x20(user\x20doc\x20channel)',()=>{const a=resolveInterests('system',{'requirements':['please\x20test\x20it']});expect(a['prefer'])['toEqual']([]),writeUserDoc({'version':0x1,'game':{'keyword_rules':[{'id':'kw_audit_testing','keywords':['test'],'effect':'node_advanced','anchor':'prefer','when_forbidden':![]}]}});const b=resolveInterests('system',{'requirements':['please\x20test\x20it']});expect(b['prefer'])['toEqual'](['node_advanced']);}),it('10.\x20forbid_pattern\x20rewritten\x20to\x20a\x20non-matching\x20pattern\x20disarms\x20when_forbidden\x20rules\x20(user\x20doc\x20channel)',()=>{const a=resolveInterests('neutral',{'requirements':['never\x20arbitration']});expect(a['avoid'])['toContain']('arbitration_review_triggered'),writeUserDoc({'version':0x1,'game':{'forbid_pattern':'zzz_never_matches'}});const b=resolveInterests('neutral',{'requirements':['never\x20arbitration']});expect(b['avoid'])['toEqual']([]);});}),describe('config\x20audit\x20—\x20game.arb\x20section\x20(7-state\x20game)',()=>{it('11.\x20arb.scoring.per_gain\x2020→40\x20moves\x20the\x20favorability\x20of\x20a\x201-gain\x20move\x20(session\x20override)',()=>{const a=evaluateArbGame('Voting','arbitrator');expect(a['actions'][0x0]?.['gain_score'])['toBe'](0x14),expect(a['actions'][0x0]?.['favorability'])['toBe'](0x50),setJudgmentOverride('game.arb.scoring.per_gain',0x28);const b=evaluateArbGame('Voting','arbitrator');expect(b['actions'][0x0]?.['gain_score'])['toBe'](0x28),expect(b['actions'][0x0]?.['favorability'])['toBe'](0x64);}),it('12.\x20a\x20new\x20arb\x20keyword_rules\x20entry\x20re-anchors\x20a\x20perspective\x27s\x20prefer\x20(user\x20doc\x20channel)',()=>{const a=evaluateArbGame('Principal_confirming','customer',{'requirements':['expedite\x20please']});expect(a['actions'][0x0]?.['gain_score'])['toBe'](0x0),expect(a['actions'][0x0]?.['favorability'])['toBe'](0x3c),writeUserDoc({'version':0x1,'game':{'arb':{'keyword_rules':[{'id':'arb_kw_audit_expedite','keywords':['expedite'],'effect':'case_advanced','anchor':'prefer','when_forbidden':![]}]}}});const b=evaluateArbGame('Principal_confirming','customer',{'requirements':['expedite\x20please']});expect(b['actions'][0x0]?.['gain_score'])['toBe'](0x14),expect(b['actions'][0x0]?.['favorability'])['toBe'](0x50);});}),describe('config\x20audit\x20—\x20match\x20section',()=>{it('13.\x20region_scores.exact\x20100→50\x20halves\x20the\x20region\x20rule\x20score\x20(session\x20override)',async()=>{const [a]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(a['result'],'region')['score'])['toBe'](0x64),setJudgmentOverride('match.region_scores.exact',0x32);const [b]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(b['result'],'region')['score'])['toBe'](0x32),expect(b['result']['total'])['toBeLessThan'](a['result']['total']);}),it('14.\x20weights.capabilities\x2030→60\x20raises\x20its\x20renormalized\x20share\x20(session\x20override)',async()=>{const [a]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(a['result'],'capabilities')['weight'])['toBe'](0x1e),expect(a['result']['total'])['toBe'](0x43),setJudgmentOverride('match.weights.capabilities',0x3c);const [b]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(b['result'],'capabilities')['weight'])['toBe'](0x3c),expect(breakdownOf(b['result'],'region')['weight'])['toBe'](0xf),expect(b['result']['total'])['toBe'](0x4a);}),it('15.\x20trust_bands\x20second\x20band\x20score\x2060→10\x20(extracted\x20trust_score\x20is\x2050\x20→\x20band\x20#2)\x20(session\x20override)',async()=>{const [a]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(a['result'],'trust')['score'])['toBe'](0x3c),setJudgmentOverride('match.trust_bands',[{'min':0x4b,'score':0x64},{'min':0x32,'score':0xa},{'min':0x19,'score':0x1e},{'min':0x0,'score':0x0}]);const [b]=await matchDemandToServices(demandCap,[inRegionService]);expect(breakdownOf(b['result'],'trust')['score'])['toBe'](0xa);}),it('16.\x20neutral_score\x2050→10\x20changes\x20unknown-signal\x20scoring\x20(user\x20doc\x20channel)',async()=>{const a=extractDemandCapability({'object':'0xdemand','location':'Shanghai','description':'anything'},{'industry':'freelance','price_max':0x96n,'keywords':[],'capabilities':{'has_arbitration':![],'has_refund_path':![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':![],'has_messenger':![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':![],'is_paused':![]}}),[b]=await matchDemandToServices(a,[inRegionService]);expect(breakdownOf(b['result'],'tags')['score'])['toBe'](0x32),writeUserDoc({'version':0x1,'match':{'neutral_score':0xa}});const [c]=await matchDemandToServices(a,[inRegionService]);expect(breakdownOf(c['result'],'tags')['score'])['toBe'](0xa);}),it('17.\x20price_over_budget_tolerance_pct\x2010→100\x20turns\x20a\x20rejection\x20into\x20a\x20partial\x20score\x20(session\x20override)',async()=>{const a={...inRegionService,'object':'0xpricey','sales':[{'price':'200','wip_hash':'x'}]},[b]=await matchDemandToServices(demandCap,[a]);expect(breakdownOf(b['result'],'price')['score'])['toBe'](0x0),setJudgmentOverride('match.price_over_budget_tolerance_pct',0x64);const [c]=await matchDemandToServices(demandCap,[a]);expect(breakdownOf(c['result'],'price')['score'])['toBe'](0x32);}),it('18.\x20top_n\x205→2\x20caps\x20the\x20returned\x20candidate\x20count\x20(session\x20override)',async()=>{const a=[inRegionService,{...inRegionService,'object':'0xb'},{...inRegionService,'object':'0xc'}];expect((await matchDemandToServices(demandCap,a))['length'])['toBe'](0x3),setJudgmentOverride('match.top_n',0x2),expect((await matchDemandToServices(demandCap,a))['length'])['toBe'](0x2);});}),describe('config\x20audit\x20—\x20monitor\x20section',()=>{const a=0x36ee80,b=c=>({'order_id':'0xorder','service_id':'0xservice','created_at':0x64*a,'now':0x64*a,...c});it('19.\x20messenger_timeout_hours\x2024→1\x20surfaces\x20the\x20timeout\x20finding\x20(user\x20doc\x20hot\x20reload)',()=>{const c=b({'last_user_message_at':0x62*a,'has_messenger':!![]});expect(monitorOrder({'current':c})['map'](f=>f['id']))['not']['toContain']('messenger_unanswered'),writeUserDoc({'version':0x1,'monitor':{'thresholds':{'messenger_timeout_hours':0x1}}});const d=monitorOrder({'current':c}),e=d['find'](f=>f['id']==='messenger_unanswered');expect(e?.['severity'])['toBe']('high');}),it('20.\x20escalation.stall_escalation_multiplier\x202→1\x20moves\x20the\x20critical\x20escalation\x20point\x20(session\x20override)',()=>{const c=b({'current_node':'Pay','last_progress_at':0x14*a}),d=monitorOrder({'current':c})['find'](f=>f['id']==='progress_stall');expect(d?.['severity'])['toBe']('high'),setJudgmentOverride('monitor.escalation.stall_escalation_multiplier',0x1);const e=monitorOrder({'current':c})['find'](f=>f['id']==='progress_stall');expect(e?.['severity'])['toBe']('critical');}),it('21.\x20compensation_coverage_min\x201.0→5\x20surfaces\x20the\x20insufficient-coverage\x20finding\x20(session\x20override)',()=>{const c=b({'compensation_balance':0x12cn,'order_amount':0x64n});expect(monitorOrder({'current':c})['map'](e=>e['id']))['not']['toContain']('compensation_insufficient'),setJudgmentOverride('monitor.thresholds.compensation_coverage_min',0x5);const d=monitorOrder({'current':c})['find'](e=>e['id']==='compensation_insufficient');expect(d?.['severity'])['toBe']('high');}),it('22.\x20explicit\x20MonitorThresholds\x20argument\x20wins\x20over\x20the\x20document\x20(caller\x20precedence)',()=>{const c=b({'last_user_message_at':0x62*a,'has_messenger':!![]});setJudgmentOverride('monitor.thresholds.messenger_timeout_hours',0x1),expect(monitorOrder({'current':c})['map'](d=>d['id']))['toContain']('messenger_unanswered'),expect(monitorOrder({'current':c,'thresholds':{'messenger_timeout_hours':0x48}})['map'](d=>d['id']))['not']['toContain']('messenger_unanswered'),clearJudgmentOverride('monitor.thresholds.messenger_timeout_hours');});}),describe('config\x20audit\x20—\x20mode\x20section',()=>{it('23.\x20appetite_thresholds.conservative.max_risk\x2030→99\x20flips\x20the\x20risk\x20recommendation\x20(session\x20override)',()=>{const a={'getCard':f=>({'constraints':{},'risk_profile':{'funds_risk':'medium'}})},b=new ModeEvaluator(a),c={'name':'audit_mode','traits':[],'machine_shape':{},'capabilities_used':['cap_audit'],'risk_appetite':'conservative','risk_constraints':{}},d=b['evaluateMode'](c);expect(d['risk_score'])['toBe'](0x3c),expect(d['recommendations']['join']('\x0a'))['toContain']('exceeds\x20conservative\x20mode\x20threshold\x2030'),setJudgmentOverride('mode.appetite_thresholds.conservative.max_risk',0x63);const e=b['evaluateMode'](c);expect(e['risk_score'])['toBe'](0x3c),expect(e['recommendations']['join']('\x0a'))['not']['toContain']('exceeds');});}),describe('config\x20audit\x20—\x20scorecard\x20section',()=>{function a(c){return{'account':'0xshop','industry':'education','network':'testnet','collected_at':0x0,'metrics':c,'unavailable':[],'errors':[]};}const b=(c,d)=>({'id':c,'source':'market_operations','status':'ok','value':d,'collected_at':0x0});it('24.\x20metrics.order_count.good_threshold\x2020→1\x20drives\x20the\x20metric\x20to\x20full\x20score\x20(session\x20override)',()=>{const d=a([b('order_count',0x1)]),e=scoreScorecard(d,'balanced');expect(e['metric_scores'][0x0]?.['score'])['toBe'](0x0),expect(e['overall'])['toBe'](0x0),setJudgmentOverride('scorecard.metrics.order_count.good_threshold',0x1);const f=scoreScorecard(d,'balanced');expect(f['metric_scores'][0x0]?.['score'])['toBe'](0x64),expect(f['overall'])['toBe'](0x64);}),it('25.\x20metrics.completion_rate.weight\x20posture\x20retune\x20changes\x20the\x20normalized\x20overall\x20(session\x20override)',()=>{const d=a([b('order_count',0x5),b('completion_rate',0.75)]),e=scoreScorecard(d,'margin');expect(e['metric_scores'][0x1]?.['weight'])['toBe'](0.15),expect(e['overall'])['toBe'](0x26),setJudgmentOverride('scorecard.metrics.completion_rate.weight',{'volume':0.15,'balanced':0.2,'margin':0.9});const f=scoreScorecard(d,'margin');expect(f['metric_scores'][0x1]?.['weight'])['toBe'](0.9),expect(f['overall'])['toBe'](0x2f);}),it('26.\x20shop_evidence_metrics\x20cleared\x20→\x20market-only\x20evidence\x20yields\x20a\x20null\x20overall\x20(session\x20override)',()=>{const d=a([b('order_count',0x14),b('supply_demand_ratio',0x2)]),e=scoreScorecard(d,'balanced');expect(e['overall'])['toBe'](0x5e),setJudgmentOverride('scorecard.shop_evidence_metrics',[]);const f=scoreScorecard(d,'balanced');expect(f['overall'])['toBeNull']();});}),describe('config\x20audit\x20—\x20rules\x20section\x20(declarative\x20rule\x20book)',()=>{it('27.\x20a\x20retuned\x20case\x20level\x20low→high\x20changes\x20the\x20finding\x20severity\x20(user\x20doc\x20channel)',()=>{const a=checkUtilRisks({'large_util_import':!![]})['find'](c=>c['id']==='R-UTIL-03');expect(a?.['level'])['toBe']('low'),writeUserDoc({'version':0x1,'rules':{'domains':{'util':{'rules':[{'rule_id':'R-UTIL-03','cases':[{'when':{'field':'large_util_import','op':'eq','value':!![]},'level':'high','title':'AUDIT:\x20util\x20import\x20retuned\x20to\x20high','description':'Audit-rewritten\x20description\x20for\x20R-UTIL-03.'}]}]}}}});const b=checkUtilRisks({'large_util_import':!![]})['find'](c=>c['id']==='R-UTIL-03');expect(b?.['level'])['toBe']('high'),expect(b?.['title'])['toContain']('AUDIT');}),it('28.\x20enabled:false\x20via\x20the\x20industry\x20layer\x20silences\x20the\x20finding\x20AND\x20leaves\x20a\x20disable\x20trace',()=>{expect(checkUtilRisks({'large_util_import':!![],'expects_util_events':!![]})['map'](a=>a['id']))['toEqual'](['R-UTIL-03','R-UTIL-04']),expect(setJudgmentIndustryOverlay({'rules':{'domains':{'util':{'rules':[{'rule_id':'R-UTIL-03','enabled':![]}]}}}},'pack:audit')['ok'])['toBe'](!![]),expect(checkUtilRisks({'large_util_import':!![],'expects_util_events':!![]})['map'](a=>a['id']))['toEqual'](['R-UTIL-04']),expect(judgmentDisableTrace())['toEqual']([{'layer':'pack:audit','domain':'util','rule_id':'R-UTIL-03'}]);}),it('29.\x20case.title/description\x20rewording\x20is\x20visible\x20in\x20the\x20finding\x20text\x20(user\x20doc\x20channel)',()=>{const a=checkUtilRisks({'bcs_manually_synced':!![]})['find'](c=>c['id']==='R-UTIL-05');expect(a?.['title'])['toContain']('SDK\x20BCS\x20structures\x20must\x20stay\x20in\x20sync'),writeUserDoc({'version':0x1,'rules':{'domains':{'util':{'rules':[{'rule_id':'R-UTIL-05','cases':[{'when':{'field':'bcs_manually_synced','op':'eq','value':!![]},'level':'medium','title':'AUDIT:\x20hand-maintained\x20BCS\x20layouts\x20drift\x20from\x20Move\x20structs','description':'Audit-rewritten\x20description\x20for\x20R-UTIL-05.'}]}]}}}});const b=checkUtilRisks({'bcs_manually_synced':!![]})['find'](c=>c['id']==='R-UTIL-05');expect(b?.['title'])['toContain']('AUDIT:\x20hand-maintained\x20BCS'),expect(b?.['description'])['toContain']('Audit-rewritten\x20description\x20for\x20R-UTIL-05.');});}),describe('config\x20audit\x20—\x20layer\x20chain\x20and\x20composition',()=>{it('30.\x20precedence\x20chain:\x20industry\x20X=61\x20<\x20persona\x20X=62\x20<\x20user\x20doc\x20X=63,\x20unwinding\x20in\x20reverse',()=>{expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3c),setJudgmentIndustryOverlay({'game':{'scoring':{'base':0x3d}}},'pack:x'),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3d),setJudgmentPersonaFragment({'game':{'scoring':{'base':0x3e}}},'persona:y'),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3e),writeUserDoc({'version':0x1,'game':{'scoring':{'base':0x3f}}}),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3f),expect(evaluateOutcome('refund','customer')['net_score'])['toBe'](0x53),rmSync(join(configDir,'judgment.json')),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3e),setJudgmentPersonaFragment(null),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3d),setJudgmentIndustryOverlay(null),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3c);}),it('31.\x20mergedBaselinesOverlay:\x20the\x20later\x20industry\x20in\x20the\x20list\x20wins,\x20and\x20the\x20merged\x20overlay\x20drives\x20the\x20engine',()=>{registerIndustryBaselines({'category':'audit-a','fragment':{'monitor':{'thresholds':{'messenger_timeout_hours':0x1}}}}),registerIndustryBaselines({'category':'audit-b','fragment':{'monitor':{'thresholds':{'messenger_timeout_hours':0x2}}}});const a=mergedBaselinesOverlay(['audit-a','audit-b']);expect(a['monitor']?.['thresholds']?.['messenger_timeout_hours'])['toBe'](0x2),expect(setJudgmentIndustryOverlay(mergedBaselinesOverlay(['audit-a','audit-b']),'merged:audit')['ok'])['toBe'](!![]),expect(getJudgmentDoc()['monitor']['thresholds']['messenger_timeout_hours'])['toBe'](0x2);const b=0x36ee80,c={'order_id':'0xorder','service_id':'0xs','created_at':0x64*b,'now':0x64*b,'last_user_message_at':98.5*b,'has_messenger':!![]};expect(monitorOrder({'current':c})['map'](d=>d['id']))['not']['toContain']('messenger_unanswered');}),it('32.\x20an\x20invalid\x20persona\x20fragment\x20is\x20rejected,\x20the\x20layer\x20error\x20is\x20visible,\x20the\x20last\x20good\x20stays\x20in\x20force',()=>{expect(setJudgmentPersonaFragment({'game':{'scoring':{'base':0x46}}},'persona:audit')['ok'])['toBe'](!![]),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x46);const a=setJudgmentPersonaFragment({'game':{'scoring':{'bse':0x1}}},'persona:audit');expect(a['ok'])['toBe'](![]),expect(judgmentLayerError('persona'))['toContain']('bse'),expect(judgmentStatus()['layer_errors']['persona'])['toContain']('bse'),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x46);}),it('33.\x20severity_deduction\x20×\x20level_bands\x20combo:\x20a\x20big\x20deduction\x20pushes\x20the\x20score\x20across\x20a\x20band\x20boundary',async()=>{const a=await projectFixture(),b=await evaluateGraphServiceFacts(a);expect(b['risk']['total'])['toBe'](0x4a),expect(b['risk']['level'])['toBe']('medium_low'),setJudgmentOverride('evaluation.severity_deduction.high',0x50);const c=await evaluateGraphServiceFacts(a);expect(c['risk']['total'])['toBe'](0x39),expect(c['risk']['level'])['toBe']('medium_high');});}),describe('config\x20audit\x20—\x20rejection\x20semantics',()=>{it('34a.\x20user-document\x20guardrails:\x20typoed\x20weight,\x20invented\x20rule\x20id,\x20non-enum\x20severity\x20word',()=>{writeUserDoc({'version':0x1,'evaluation':{'weights':{'trust_revews':0x32}}}),getJudgmentDoc(),expect(judgmentStatus()['last_reload_error'])['toContain']('unknown\x20dimension\x20\x27trust_revews\x27'),expect(getJudgmentDoc()['evaluation']['weights']['trust_reviews'])['toBe'](0x23),writeUserDoc({'version':0x1,'rules':{'domains':{'service':{'rules':[{'rule_id':'R-S-9-99','enabled':![]}]}}}}),getJudgmentDoc(),expect(judgmentStatus()['last_reload_error'])['toContain']('unknown\x20rule\x20\x27R-S-9-99\x27'),writeUserDoc({'version':0x1,'evaluation':{'severity_deduction':{'warning':0x19}}}),getJudgmentDoc(),expect(judgmentStatus()['last_reload_error'])['toMatch'](/warning/i),expect(getJudgmentDoc()['evaluation']['severity_deduction']['critical'])['toBe'](0x32);}),it('34b.\x20judgment_set\x20guardrails:\x20type\x20mismatch\x20and\x20unknown\x20path\x20are\x20rejected',()=>{expect(setJudgmentOverride('evaluation.weights.trust_reviews','high')['ok'])['toBe'](![]),expect(setJudgmentOverride('evaluation.weights.does_not_exist',0x1)['ok'])['toBe'](![]),expect(getJudgmentDoc()['evaluation']['weights']['trust_reviews'])['toBe'](0x23);});});
@@ -1 +1 @@
1
- import{watch_conversations,query_events,query_objects}from'@wowok/wowok';import{computeReviewStats,detectReviewManipulation,filterVerifiedReviews}from'../knowledge/reputation-rules.js';import{pendingWrappersAt,trackAccountPayments}from'../knowledge/payment-tracker.js';const watchers=new Map();export function registerAccountEventWatcher(a){if(!a['id']||watchers['has'](a['id']))return![];return watchers['set'](a['id'],a),!![];}export function unregisterAccountEventWatcher(a){return watchers['delete'](a);}export function listAccountEventWatchers(){return Array['from'](watchers['values']());}const PRIORITY_RANK={'required':0x4,'recommended':0x3,'info':0x2,'reminder':0x1};export async function runAccountEventWatchers(a,b){const c=[],d=b&&b['length']>0x0?new Set(b):undefined;for(const g of watchers['values']()){if(d&&!d['has'](g['id']))continue;if(g['applies']&&!await g['applies'](a))continue;try{c['push'](...await g['watch'](a));}catch{}}const f=new Map();for(const h of c)f['set'](h['id'],h);return Array['from'](f['values']())['sort']((i,j)=>PRIORITY_RANK[j['priority']]-PRIORITY_RANK[i['priority']]||j['timestamp']-i['timestamp']);}registerAccountEventWatcher({'id':'messenger_unread','description':'Unread\x20encrypted\x20messages\x20needing\x20attention','watch':async({account:a})=>{const b=await watch_conversations({'account':a,'unreadOnly':!![],'previewMessageCount':0x1,'skipAutoMarkViewed':!![]});return b['map'](d=>({'id':'messenger_unread:'+d['peerAddress'],'category':'messenger_unread','priority':'reminder','title':'Unread\x20messages\x20from\x20'+d['peerAddress'],'message':d['unreadCount']+'\x20unread\x20message(s)'+(d['lastMessagePreview']?'\x20—\x20\x22'+d['lastMessagePreview']+'\x22':''),'action':'View\x20and\x20reply\x20via\x20messenger_operation','object_ref':d['peerAddress'],'timestamp':Date['now']()}));}});function toCollectionEvent(a){const b=a['plan']['holder_kind']==='business_object';return{'id':'order_collection:'+a['wrapper_id'],'category':'order_collection','priority':'recommended','title':b?'Payment\x20awaiting\x20extraction\x20at\x20object\x20'+a['holder']:'Payment\x20awaiting\x20unwrap\x20in\x20your\x20account','message':'CoinWrapper\x20'+a['wrapper_id']+'\x20(payment\x20'+a['payment']+',\x20amount\x20'+a['amount']+')\x20is\x20held\x20by\x20'+a['holder']+'.\x20'+('Drive\x20'+a['plan']['operation']+(a['plan']['anyone_can_submit']?'\x20—\x20anyone\x20may\x20submit\x20the\x20transaction':'')+';\x20')+('the\x20bare\x20Coin\x20settles\x20to\x20'+a['plan']['settles_to']+'.\x20'+a['plan']['steps']['join']('\x20')),'action':'Extract\x20via\x20'+a['plan']['operation'],'object_ref':a['wrapper_id'],'timestamp':Date['now']()};}registerAccountEventWatcher({'id':'order_collection','description':'CoinWrappers\x20awaiting\x20extraction\x20at\x20the\x20account\x20or\x20at\x20objects\x20the\x20account\x20beneficially\x20owns','watch':async({account:a,network:b})=>{if(!a)return[];const c=new Map();try{for(const d of await pendingWrappersAt(a,{'network':b})){c['set'](d['wrapper_id'],toCollectionEvent(d));}}catch{}try{const e=await trackAccountPayments({'account':a,'network':b,'max_events':0x64});for(const f of e){for(const g of f['pending']){if(!c['has'](g['wrapper_id']))c['set'](g['wrapper_id'],toCollectionEvent(g));}}}catch{}return Array['from'](c['values']());}}),registerAccountEventWatcher({'id':'demand_presented','description':'A\x20service\x20presented\x20against\x20one\x20of\x20my\x20demands','watch':async({account:a,network:b})=>{if(!a)return[];const c=await query_events({'type':'DemandPresentEvent','order':'descending','limit':0x14,'network':b,'no_cache':!![]}),d=[];for(const e of c?.['data']??[]){const f=e['demand'];if(!f)continue;try{const g=await query_objects({'objects':[f],'network':b,'no_cache':!![]}),h=g['objects']?.[0x0],i=typeof h?.['owner']==='string'?h['owner']:h?.['owner']?.['AddressOwner'];i&&i['toLowerCase']()===a['toLowerCase']()&&d['push']({'id':'demand_presented:'+f+':'+(e['service']??'?'),'category':'demand_presented','priority':'info','title':'New\x20service\x20presented\x20on\x20your\x20demand','message':'A\x20service\x20('+(e['service']??'unknown')+')\x20presented\x20against\x20demand\x20'+f+(e['recommend']?'\x20—\x20\x22'+e['recommend']+'\x22':''),'action':'Review\x20the\x20presenter\x20via\x20onchain_table_data\x20(demand\x20presenter\x20item)','object_ref':f,'timestamp':Number(e['time']??Date['now']())});}catch{}}return d;}}),registerAccountEventWatcher({'id':'reputation_integrity','description':'Review-reputation\x20analysis\x20for\x20supplied\x20review\x20rows:\x20verification,\x20stats,\x20and\x20manipulation\x20detection\x20(knowledge/reputation-rules)','applies':({reviews:a})=>Array['isArray'](a)&&a['length']>0x0,'watch':async({reviews:a,order_history:b})=>{const c=a??[],d=b&&b['length']>0x0?filterVerifiedReviews(c,b):c,e=computeReviewStats(d),f=detectReviewManipulation(d),g=[];return f['suspicious']&&g['push']({'id':'reputation_integrity:manipulation','category':'reputation_integrity','priority':'required','title':'Suspicious\x20review\x20activity\x20detected','message':'Manipulation\x20signals:\x20'+f['reasons']['join'](';\x20')+'.\x20Stats:\x20'+e['likes']+'\x20likes\x20/\x20'+e['dislikes']+'\x20dislikes\x20across\x20'+e['total']+'\x20reviews\x20('+e['verifiedCount']+'\x20verified).','action':'Cross-check\x20reviewer\x20addresses\x20against\x20completed\x20orders\x20before\x20trusting\x20the\x20review\x20aggregate','timestamp':Date['now']()}),e['total']>=0x5&&e['verifiedCount']/e['total']<0.3&&g['push']({'id':'reputation_integrity:unverified','category':'reputation_integrity','priority':'recommended','title':'Reviews\x20are\x20dominated\x20by\x20unverified\x20submissions','message':'Only\x20'+e['verifiedCount']+'/'+e['total']+'\x20reviews\x20carry\x20a\x20completed-order\x20credential\x20—\x20the\x20aggregate\x20may\x20reflect\x20spam\x20rather\x20than\x20real\x20buyers.','action':'Bind\x20a\x20review\x20Guard\x20(verified-buyer\x20check)\x20to\x20the\x20ReviewRepository\x20—\x20see\x20knowledge/reputation-rules\x20buildReviewRepositorySetup','timestamp':Date['now']()}),e['recentTrend']==='declining'&&g['push']({'id':'reputation_integrity:declining','category':'reputation_integrity','priority':'info','title':'Review\x20trend\x20is\x20declining','message':'Recent\x20like-rate\x20is\x20materially\x20below\x20the\x20earlier\x20period\x20('+Math['round'](e['likeRate']*0x64)+'%\x20overall,\x20top\x20tags:\x20'+(e['topTags']['map'](h=>h['tag'])['join'](',\x20')||'none')+').','action':'Inspect\x20recent\x20dislike\x20tags\x20for\x20recurring\x20complaint\x20themes','timestamp':Date['now']()}),g;}});
1
+ import{watch_conversations,query_events,query_objects}from'@wowok/wowok';import{computeReviewStats,detectReviewManipulation,filterVerifiedReviews}from'../knowledge/reputation-rules.js';import{pendingWrappersAt,trackAccountPayments}from'../knowledge/payment-tracker.js';const watchers=new Map();export function registerAccountEventWatcher(a){if(!a['id']||watchers['has'](a['id']))return![];return watchers['set'](a['id'],a),!![];}export function unregisterAccountEventWatcher(a){return watchers['delete'](a);}export function listAccountEventWatchers(){return Array['from'](watchers['values']());}const PRIORITY_RANK={'required':0x4,'recommended':0x3,'info':0x2,'reminder':0x1};export async function runAccountEventWatchers(a,b){const c=[],d=b&&b['length']>0x0?new Set(b):undefined;for(const g of watchers['values']()){if(d&&!d['has'](g['id']))continue;if(g['applies']&&!await g['applies'](a))continue;try{c['push'](...await g['watch'](a));}catch{}}const f=new Map();for(const h of c)f['set'](h['id'],h);return Array['from'](f['values']())['sort']((i,j)=>PRIORITY_RANK[j['priority']]-PRIORITY_RANK[i['priority']]||j['timestamp']-i['timestamp']);}registerAccountEventWatcher({'id':'messenger_unread','description':'Unread\x20encrypted\x20messages\x20needing\x20attention','watch':async({account:a})=>{const b=await watch_conversations({'account':a,'unreadOnly':!![],'previewMessageCount':0x1,'skipAutoMarkViewed':!![]});return b['map'](d=>({'id':'messenger_unread:'+d['peerAddress'],'category':'messenger_unread','priority':'reminder','title':'Unread\x20messages\x20from\x20'+d['peerAddress'],'message':d['unreadCount']+'\x20unread\x20message(s)'+(d['lastMessagePreview']?'\x20—\x20\x22'+d['lastMessagePreview']+'\x22':''),'action':'View\x20and\x20reply\x20via\x20messenger_operation','object_ref':d['peerAddress'],'timestamp':Date['now']()}));}});function toCollectionEvent(a){const b=a['plan']['holder_kind']==='business_object';return{'id':'order_collection:'+a['wrapper_id'],'category':'order_collection','priority':'recommended','title':b?'Payment\x20awaiting\x20extraction\x20at\x20object\x20'+a['holder']:'Payment\x20awaiting\x20unwrap\x20in\x20your\x20account','message':'CoinWrapper\x20'+a['wrapper_id']+'\x20(payment\x20'+a['payment']+',\x20amount\x20'+a['amount']+')\x20is\x20held\x20by\x20'+a['holder']+'.\x20'+('Drive\x20'+a['plan']['operation']+(a['plan']['anyone_can_submit']?'\x20—\x20anyone\x20may\x20submit\x20the\x20transaction':'')+';\x20')+('the\x20bare\x20Coin\x20settles\x20to\x20'+a['plan']['settles_to']+'.\x20'+a['plan']['steps']['join']('\x20')),'action':'Extract\x20via\x20'+a['plan']['operation'],'object_ref':a['wrapper_id'],'timestamp':Date['now']()};}registerAccountEventWatcher({'id':'order_collection','description':'CoinWrappers\x20awaiting\x20extraction\x20at\x20the\x20account\x20or\x20at\x20objects\x20the\x20account\x20beneficially\x20owns','watch':async({account:a,network:b})=>{if(!a)return[];const c=new Map();try{for(const d of await pendingWrappersAt(a,{'network':b})){c['set'](d['wrapper_id'],toCollectionEvent(d));}}catch{}try{const e=await trackAccountPayments({'account':a,'network':b,'max_events':0x64});for(const f of e){for(const g of f['pending']){if(!c['has'](g['wrapper_id']))c['set'](g['wrapper_id'],toCollectionEvent(g));}}}catch{}return Array['from'](c['values']());}}),registerAccountEventWatcher({'id':'demand_presented','description':'A\x20service\x20presented\x20against\x20one\x20of\x20my\x20demands','watch':async({account:a,network:b})=>{if(!a)return[];const c=await query_events({'type':'DemandPresentEvent','order':'descending','limit':0x14,'network':b,'no_cache':!![]}),d=[];for(const e of c?.['data']??[]){const f=e['demand'];if(!f)continue;try{const g=await query_objects({'objects':[f],'network':b,'no_cache':!![]}),h=g['objects']?.[0x0],i=typeof h?.['owner']==='string'?h['owner']:h?.['owner']?.['AddressOwner'];i&&i['toLowerCase']()===a['toLowerCase']()&&d['push']({'id':'demand_presented:'+f+':'+(e['service']??'?'),'category':'demand_presented','priority':'info','title':'New\x20service\x20presented\x20on\x20your\x20demand','message':'A\x20service\x20('+(e['service']??'unknown')+')\x20presented\x20against\x20demand\x20'+f+(e['recommend']?'\x20—\x20\x22'+e['recommend']+'\x22':''),'action':'Review\x20the\x20presenter\x20via\x20onchain_table_data\x20(demand\x20presenter\x20item)','object_ref':f,'timestamp':Number(e['time']??Date['now']())});}catch{}}return d;}}),registerAccountEventWatcher({'id':'reputation_integrity','description':'Review-reputation\x20analysis\x20for\x20supplied\x20review\x20rows:\x20verification,\x20stats,\x20and\x20manipulation\x20detection\x20(knowledge/reputation-rules)','applies':({reviews:a})=>Array['isArray'](a)&&a['length']>0x0,'watch':async({reviews:a,order_history:b})=>{const c=a??[],d=b&&b['length']>0x0?filterVerifiedReviews(c,b):c,e=computeReviewStats(d),f=detectReviewManipulation(d),g=[];return f['suspicious']&&g['push']({'id':'reputation_integrity:manipulation','category':'reputation_integrity','priority':'required','title':'Suspicious\x20review\x20activity\x20detected','message':'Manipulation\x20signals:\x20'+f['reasons']['join'](';\x20')+'.\x20Stats:\x20'+e['likes']+'\x20likes\x20/\x20'+e['dislikes']+'\x20dislikes\x20across\x20'+e['total']+'\x20reviews\x20('+e['verifiedCount']+'\x20verified).','action':'Cross-check\x20reviewer\x20addresses\x20against\x20completed\x20orders\x20before\x20trusting\x20the\x20review\x20aggregate','timestamp':Date['now']()}),e['total']>=0x5&&e['verifiedCount']/e['total']<0.3&&g['push']({'id':'reputation_integrity:unverified','category':'reputation_integrity','priority':'recommended','title':'Reviews\x20are\x20dominated\x20by\x20unverified\x20submissions','message':'Only\x20'+e['verifiedCount']+'/'+e['total']+'\x20reviews\x20carry\x20a\x20completed-order\x20credential\x20—\x20the\x20aggregate\x20may\x20reflect\x20spam\x20rather\x20than\x20real\x20buyers.','action':'Declare\x20the\x20review\x20rail\x20in\x20the\x20service\x20build\x20(review_mode\x20\x27review\x27\x20or\x20\x27review_reward\x27)\x20so\x20the\x20build\x20plan\x20emits\x20the\x20review\x20Repository\x20with\x20the\x20verified-buyer\x20write\x20credential\x20(AR-1)\x20—\x20manual\x20Guard/Repository\x20assembly\x20is\x20deprecated','timestamp':Date['now']()}),e['recentTrend']==='declining'&&g['push']({'id':'reputation_integrity:declining','category':'reputation_integrity','priority':'info','title':'Review\x20trend\x20is\x20declining','message':'Recent\x20like-rate\x20is\x20materially\x20below\x20the\x20earlier\x20period\x20('+Math['round'](e['likeRate']*0x64)+'%\x20overall,\x20top\x20tags:\x20'+(e['topTags']['map'](h=>h['tag'])['join'](',\x20')||'none')+').','action':'Inspect\x20recent\x20dislike\x20tags\x20for\x20recurring\x20complaint\x20themes','timestamp':Date['now']()}),g;}});
@@ -1 +1 @@
1
- import{CUSTOMER_INTELLIGENCE_VERSION}from'./types.js';import{severityRank}from'../config/severity.js';import{getJudgmentDoc}from'../config/judgment.js';import{formatAmountText}from'../knowledge/fund-layer.js';function monitorParams(){return getJudgmentDoc()['monitor'];}export function monitorOrder(a){const b=[],c=monitorParams(),d={...c['thresholds'],...a['thresholds']??{}},e=c['escalation'],f=a['current'];if(f['completed'])return b['push'](...detectPostCompletionAlerts(f,d)),sortAlerts(b);if(f['refunded'])return b['push']({'id':'refund_received','category':'refund_received','severity':'info','title':'Refund\x20received','message':'Order\x20'+f['order_id']+'\x20refund\x20has\x20been\x20received','timestamp':f['now'],'order_id':f['order_id'],'service_id':f['service_id']}),sortAlerts(b);return b['push'](...detectProgressStall(f,a['previous'],d,e)),b['push'](...detectCompensationChange(f,a['previous'],d,e)),b['push'](...detectMessengerTimeout(f,d,e)),f['pending_user_action']&&b['push']({'id':'user_action_required','category':'user_action_required','severity':'info','title':'Waiting\x20for\x20user\x20action','message':'Order\x20'+f['order_id']+'\x20advanced\x20to\x20node\x20'+(f['current_node']??'unknown')+';\x20your\x20action\x20is\x20required\x20to\x20continue','action':'View\x20the\x20Machine\x20node\x20requirements\x20and\x20submit\x20the\x20corresponding\x20Guard\x20submission','timestamp':f['now'],'order_id':f['order_id'],'service_id':f['service_id'],'node':f['current_node']}),sortAlerts(b);}function detectProgressStall(a,b,c,d){const e=[];if(!a['current_node'])return e;const f=a['last_progress_at']??a['created_at'],g=a['now']-f,h=g/0x36ee80,i=a['expected_progress_hours']??d['default_expected_progress_hours'],j=c['progress_stall_hours']>0x0?c['progress_stall_hours']:i*d['stall_expected_multiplier'];if(h>j){const k=h>j*d['stall_escalation_multiplier']?'critical':'high';e['push']({'id':'progress_stall','category':'progress_stall','severity':k,'title':k==='critical'?'Order\x20severely\x20stalled':'Order\x20progress\x20stalled','message':'Order\x20has\x20been\x20stuck\x20at\x20node\x20'+a['current_node']+'\x20for\x20over\x20'+Math['round'](h)+'\x20hours\x20(expected\x20'+i+'\x20hours)','action':k==='critical'?'Recommend\x20contacting\x20the\x20merchant\x20immediately\x20via\x20Messenger;\x20if\x20the\x20merchant\x20remains\x20unresponsive,\x20consider\x20initiating\x20arbitration':'Recommend\x20contacting\x20the\x20merchant\x20via\x20Messenger\x20to\x20ask\x20about\x20progress','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'node':a['current_node'],'metric':{'label':'Stall\x20duration','value':Math['round'](h),'threshold':Math['round'](j),'unit':'hours'}});}if(b&&b['previous_node']===a['current_node']){const l=a['now']-b['snapshot_at'],m=l/0x36ee80;m>i&&e['push']({'id':'node_unchanged','category':'progress_stall','severity':'high','title':'Node\x20unchanged','message':'Since\x20the\x20last\x20check\x20('+Math['round'](m)+'\x20hours),\x20the\x20order\x20is\x20still\x20at\x20'+a['current_node'],'action':'Confirm\x20whether\x20this\x20is\x20expected;\x20if\x20not,\x20contact\x20the\x20merchant','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'node':a['current_node'],'metric':{'label':'Node\x20stay\x20duration','value':Math['round'](m),'threshold':Math['round'](i),'unit':'hours'}});}return e;}function detectCompensationChange(a,b,c,d){const e=[];if(a['compensation_balance']===undefined)return e;if(a['order_amount']!==undefined&&a['order_amount']>0x0n){const f=Number(a['compensation_balance']*0x64n/a['order_amount'])/0x64;if(f<c['compensation_coverage_min']){const g=f<d['ratio_critical_threshold']?'critical':'high';e['push']({'id':'compensation_insufficient','category':'compensation_insufficient','severity':g,'title':'Compensation\x20fund\x20coverage\x20insufficient','message':'Merchant\x20compensation\x20fund\x20covers\x20only\x20'+Math['round'](f*0x64)+'%\x20of\x20the\x20order\x20amount\x20(required\x20'+Math['round'](c['compensation_coverage_min']*0x64)+'%):\x20fund\x20'+formatAmountText(a['compensation_balance'],a['token']?.['decimals'],a['token']?.['symbol'])+'\x20vs\x20order\x20'+formatAmountText(a['order_amount'],a['token']?.['decimals'],a['token']?.['symbol']),'action':'Require\x20the\x20merchant\x20to\x20top\x20up\x20the\x20compensation\x20fund\x20before\x20ordering,\x20or\x20negotiate\x20higher\x20coverage\x20via\x20Messenger','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Compensation\x20coverage','value':Math['round'](f*0x64),'threshold':Math['round'](c['compensation_coverage_min']*0x64),'unit':'%'}});}}if(b&&b['previous_compensation_balance']!==undefined){const h=b['previous_compensation_balance'];if(h>0x0n&&a['compensation_balance']<h){const i=Number((h-a['compensation_balance'])*0x64n/h)/0x64;if(i>=c['compensation_drop_ratio']){const j=i>=d['ratio_critical_threshold']?'critical':'high';e['push']({'id':'compensation_drop','category':'compensation_drop','severity':j,'title':'Compensation\x20fund\x20balance\x20dropped\x20significantly','message':'Merchant\x20compensation\x20fund\x20dropped\x20from\x20'+formatAmountText(h,a['token']?.['decimals'],a['token']?.['symbol'])+'\x20to\x20'+formatAmountText(a['compensation_balance'],a['token']?.['decimals'],a['token']?.['symbol'])+'\x20(down\x20'+Math['round'](i*0x64)+'%)','action':'Immediately\x20ask\x20the\x20merchant\x20for\x20the\x20reason;\x20if\x20it\x20keeps\x20dropping,\x20the\x20merchant\x20may\x20be\x20processing\x20payouts\x20for\x20other\x20orders,\x20which\x20is\x20a\x20risk','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Compensation\x20drop\x20ratio','value':Math['round'](i*0x64),'threshold':Math['round'](c['compensation_drop_ratio']*0x64),'unit':'%'}});}}}return e;}function detectMessengerTimeout(a,b,c){const d=[];if(a['has_messenger']===![])return d['push']({'id':'no_messenger_channel','category':'messenger_timeout','severity':'info','title':'Merchant\x20has\x20no\x20Messenger\x20channel','message':'Merchant\x20has\x20not\x20configured\x20Messenger;\x20no\x20way\x20to\x20negotiate\x20online\x20or\x20get\x20post-sale\x20support','action':'Confirm\x20other\x20contact\x20methods\x20before\x20ordering;\x20recommend\x20requiring\x20the\x20merchant\x20to\x20configure\x20Messenger','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id']}),d;if(a['last_user_message_at']&&!a['last_merchant_reply_at']){const e=a['now']-a['last_user_message_at'],f=e/0x36ee80;if(f>b['messenger_timeout_hours']){const g=f>b['messenger_timeout_hours']*c['messenger_escalation_multiplier']?'critical':'high';d['push']({'id':'messenger_unanswered','category':'messenger_timeout','severity':g,'title':'Merchant\x20Messenger\x20no\x20reply','message':'Merchant\x20has\x20not\x20replied\x20to\x20your\x20Messenger\x20message\x20for\x20'+Math['round'](f)+'\x20hours','action':a['has_arbitration']?'Consider\x20initiating\x20an\x20arbitration\x20application\x20(arbitration\x20window\x20is\x20limited)':'Merchant\x20has\x20no\x20arbitration\x20configured;\x20recommend\x20urging\x20via\x20other\x20contact\x20methods;\x20if\x20there\x20is\x20no\x20response,\x20funds\x20may\x20be\x20frozen','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'No-reply\x20duration','value':Math['round'](f),'threshold':Math['round'](b['messenger_timeout_hours']),'unit':'hours'}});}}if(a['last_merchant_reply_at']&&a['last_user_message_at']&&a['last_user_message_at']>a['last_merchant_reply_at']){const h=a['now']-a['last_user_message_at'],i=h/0x36ee80;i>b['messenger_timeout_hours']&&d['push']({'id':'messenger_re_unanswered','category':'messenger_timeout','severity':'high','title':'Merchant\x20did\x20not\x20reply\x20again','message':'The\x20merchant\x20has\x20not\x20replied\x20to\x20your\x20message\x20from\x20'+Math['round'](i)+'\x20hours\x20ago','action':'Send\x20a\x20follow-up\x20message;\x20if\x20the\x20merchant\x20remains\x20unresponsive,\x20consider\x20arbitration','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Re-no-reply\x20duration','value':Math['round'](i),'threshold':Math['round'](b['messenger_timeout_hours']),'unit':'hours'}});}return d;}function detectPostCompletionAlerts(a,b){const c=[];return a['review_window_days']!==undefined&&a['review_window_days']>0x0&&(a['review_window_days']<=b['review_window_closing_days']?c['push']({'id':'review_window_closing','category':'review_window','severity':'info','title':'Review\x20window\x20about\x20to\x20close','message':'The\x20review\x20window\x20will\x20close\x20in\x20'+a['review_window_days']+'\x20day(s)','action':'Submit\x20a\x20review\x20as\x20soon\x20as\x20possible\x20(evidence\x20can\x20be\x20submitted\x20together\x20if\x20available)','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Remaining\x20days','value':a['review_window_days'],'threshold':b['review_window_closing_days'],'unit':'days'}}):c['push']({'id':'review_reminder','category':'review_window','severity':'info','title':'Order\x20completed','message':'Order\x20completed;\x20review\x20window\x20has\x20'+a['review_window_days']+'\x20day(s)\x20remaining','action':'Submit\x20a\x20review\x20to\x20help\x20other\x20users\x20decide','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id']})),a['arb_window_days']!==undefined&&a['arb_window_days']>0x0&&(a['arb_window_days']<=b['arb_window_closing_days']&&c['push']({'id':'arb_window_closing','category':'arb_window','severity':'high','title':'Arbitration\x20application\x20window\x20about\x20to\x20close','message':'The\x20arbitration\x20application\x20window\x20will\x20close\x20in\x20'+a['arb_window_days']+'\x20day(s)','action':'If\x20there\x20are\x20unresolved\x20disputes,\x20initiate\x20an\x20arbitration\x20application\x20immediately','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Remaining\x20days','value':a['arb_window_days'],'threshold':b['arb_window_closing_days'],'unit':'days'}})),c;}export function sortAlerts(a){return[...a]['sort']((c,d)=>severityRank(d['severity'])-severityRank(c['severity']));}export{CUSTOMER_INTELLIGENCE_VERSION};
1
+ import{CUSTOMER_INTELLIGENCE_VERSION}from'./types.js';import{severityRank}from'../config/severity.js';import{getJudgmentDoc}from'../config/judgment.js';import{formatAmountText}from'../knowledge/fund-layer.js';import{MAX_INDEMNITY_MULTIPLE}from'../knowledge/onchain-constants.js';function monitorParams(){return getJudgmentDoc()['monitor'];}export function monitorOrder(a){const b=[],c=monitorParams(),d={...c['thresholds'],...a['thresholds']??{}},e=c['escalation'],f=a['current'];if(f['completed'])return b['push'](...detectPostCompletionAlerts(f,d)),sortAlerts(b);if(f['refunded'])return b['push']({'id':'refund_received','category':'refund_received','severity':'info','title':'Refund\x20received','message':'Order\x20'+f['order_id']+'\x20refund\x20has\x20been\x20received','timestamp':f['now'],'order_id':f['order_id'],'service_id':f['service_id']}),sortAlerts(b);return b['push'](...detectProgressStall(f,a['previous'],d,e)),b['push'](...detectCompensationChange(f,a['previous'],d,e)),b['push'](...detectMessengerTimeout(f,d,e)),f['pending_user_action']&&b['push']({'id':'user_action_required','category':'user_action_required','severity':'info','title':'Waiting\x20for\x20user\x20action','message':'Order\x20'+f['order_id']+'\x20advanced\x20to\x20node\x20'+(f['current_node']??'unknown')+';\x20your\x20action\x20is\x20required\x20to\x20continue','action':'View\x20the\x20Machine\x20node\x20requirements\x20and\x20submit\x20the\x20corresponding\x20Guard\x20submission','timestamp':f['now'],'order_id':f['order_id'],'service_id':f['service_id'],'node':f['current_node']}),sortAlerts(b);}function detectProgressStall(a,b,c,d){const e=[];if(!a['current_node'])return e;const f=a['last_progress_at']??a['created_at'],g=a['now']-f,h=g/0x36ee80,i=a['expected_progress_hours']??d['default_expected_progress_hours'],j=c['progress_stall_hours']>0x0?c['progress_stall_hours']:i*d['stall_expected_multiplier'];if(h>j){const k=h>j*d['stall_escalation_multiplier']?'critical':'high';e['push']({'id':'progress_stall','category':'progress_stall','severity':k,'title':k==='critical'?'Order\x20severely\x20stalled':'Order\x20progress\x20stalled','message':'Order\x20has\x20been\x20stuck\x20at\x20node\x20'+a['current_node']+'\x20for\x20over\x20'+Math['round'](h)+'\x20hours\x20(expected\x20'+i+'\x20hours)','action':k==='critical'?'Recommend\x20contacting\x20the\x20merchant\x20immediately\x20via\x20Messenger;\x20if\x20the\x20merchant\x20remains\x20unresponsive,\x20consider\x20initiating\x20arbitration':'Recommend\x20contacting\x20the\x20merchant\x20via\x20Messenger\x20to\x20ask\x20about\x20progress','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'node':a['current_node'],'metric':{'label':'Stall\x20duration','value':Math['round'](h),'threshold':Math['round'](j),'unit':'hours'}});}if(b&&b['previous_node']===a['current_node']){const l=a['now']-b['snapshot_at'],m=l/0x36ee80;m>i&&e['push']({'id':'node_unchanged','category':'progress_stall','severity':'high','title':'Node\x20unchanged','message':'Since\x20the\x20last\x20check\x20('+Math['round'](m)+'\x20hours),\x20the\x20order\x20is\x20still\x20at\x20'+a['current_node'],'action':'Confirm\x20whether\x20this\x20is\x20expected;\x20if\x20not,\x20contact\x20the\x20merchant','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'node':a['current_node'],'metric':{'label':'Node\x20stay\x20duration','value':Math['round'](m),'threshold':Math['round'](i),'unit':'hours'}});}return e;}function detectCompensationChange(a,b,c,d){const e=[];if(a['compensation_balance']===undefined)return e;if(a['order_amount']!==undefined&&a['order_amount']>0x0n){const f=a['order_amount']*BigInt(MAX_INDEMNITY_MULTIPLE),g=Number(a['compensation_balance']*0x64n/f)/0x64;if(g<c['compensation_coverage_min']){const h=g<d['ratio_critical_threshold']?'critical':'high';e['push']({'id':'compensation_insufficient','category':'compensation_insufficient','severity':h,'title':'Compensation\x20fund\x20coverage\x20insufficient','message':'Merchant\x20compensation\x20fund\x20covers\x20only\x20'+Math['round'](g*0x64)+'%\x20of\x20the\x20award\x20ceiling\x20('+MAX_INDEMNITY_MULTIPLE+'x\x20order\x20amount,\x20MAX_INDEMNITY_MULTIPLE;\x20required\x20'+Math['round'](c['compensation_coverage_min']*0x64)+'%):\x20fund\x20'+formatAmountText(a['compensation_balance'],a['token']?.['decimals'],a['token']?.['symbol'])+'\x20vs\x20ceiling\x20'+formatAmountText(f,a['token']?.['decimals'],a['token']?.['symbol']),'action':'Require\x20the\x20merchant\x20to\x20top\x20up\x20the\x20compensation\x20fund\x20before\x20ordering,\x20or\x20negotiate\x20higher\x20coverage\x20via\x20Messenger','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Compensation\x20coverage','value':Math['round'](g*0x64),'threshold':Math['round'](c['compensation_coverage_min']*0x64),'unit':'%'}});}}if(b&&b['previous_compensation_balance']!==undefined){const i=b['previous_compensation_balance'];if(i>0x0n&&a['compensation_balance']<i){const j=Number((i-a['compensation_balance'])*0x64n/ i)/0x64;if(j>=c['compensation_drop_ratio']){const k=j>=d['ratio_critical_threshold']?'critical':'high';e['push']({'id':'compensation_drop','category':'compensation_drop','severity':k,'title':'Compensation\x20fund\x20balance\x20dropped\x20significantly','message':'Merchant\x20compensation\x20fund\x20dropped\x20from\x20'+formatAmountText(i,a['token']?.['decimals'],a['token']?.['symbol'])+'\x20to\x20'+formatAmountText(a['compensation_balance'],a['token']?.['decimals'],a['token']?.['symbol'])+'\x20(down\x20'+Math['round'](j*0x64)+'%)','action':'Immediately\x20ask\x20the\x20merchant\x20for\x20the\x20reason;\x20if\x20it\x20keeps\x20dropping,\x20the\x20merchant\x20may\x20be\x20processing\x20payouts\x20for\x20other\x20orders,\x20which\x20is\x20a\x20risk','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Compensation\x20drop\x20ratio','value':Math['round'](j*0x64),'threshold':Math['round'](c['compensation_drop_ratio']*0x64),'unit':'%'}});}}}return e;}function detectMessengerTimeout(a,b,c){const d=[];if(a['has_messenger']===![])return d['push']({'id':'no_messenger_channel','category':'messenger_timeout','severity':'info','title':'Merchant\x20has\x20no\x20Messenger\x20channel','message':'Merchant\x20has\x20not\x20configured\x20Messenger;\x20no\x20way\x20to\x20negotiate\x20online\x20or\x20get\x20post-sale\x20support','action':'Confirm\x20other\x20contact\x20methods\x20before\x20ordering;\x20recommend\x20requiring\x20the\x20merchant\x20to\x20configure\x20Messenger','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id']}),d;if(a['last_user_message_at']&&!a['last_merchant_reply_at']){const e=a['now']-a['last_user_message_at'],f=e/0x36ee80;if(f>b['messenger_timeout_hours']){const g=f>b['messenger_timeout_hours']*c['messenger_escalation_multiplier']?'critical':'high';d['push']({'id':'messenger_unanswered','category':'messenger_timeout','severity':g,'title':'Merchant\x20Messenger\x20no\x20reply','message':'Merchant\x20has\x20not\x20replied\x20to\x20your\x20Messenger\x20message\x20for\x20'+Math['round'](f)+'\x20hours','action':a['has_arbitration']?'Consider\x20initiating\x20an\x20arbitration\x20application\x20(arbitration\x20window\x20is\x20limited)':'Merchant\x20has\x20no\x20arbitration\x20configured;\x20recommend\x20urging\x20via\x20other\x20contact\x20methods;\x20if\x20there\x20is\x20no\x20response,\x20funds\x20may\x20be\x20frozen','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'No-reply\x20duration','value':Math['round'](f),'threshold':Math['round'](b['messenger_timeout_hours']),'unit':'hours'}});}}if(a['last_merchant_reply_at']&&a['last_user_message_at']&&a['last_user_message_at']>a['last_merchant_reply_at']){const h=a['now']-a['last_user_message_at'],i=h/0x36ee80;i>b['messenger_timeout_hours']&&d['push']({'id':'messenger_re_unanswered','category':'messenger_timeout','severity':'high','title':'Merchant\x20did\x20not\x20reply\x20again','message':'The\x20merchant\x20has\x20not\x20replied\x20to\x20your\x20message\x20from\x20'+Math['round'](i)+'\x20hours\x20ago','action':'Send\x20a\x20follow-up\x20message;\x20if\x20the\x20merchant\x20remains\x20unresponsive,\x20consider\x20arbitration','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Re-no-reply\x20duration','value':Math['round'](i),'threshold':Math['round'](b['messenger_timeout_hours']),'unit':'hours'}});}return d;}function detectPostCompletionAlerts(a,b){const c=[];return a['review_window_days']!==undefined&&a['review_window_days']>0x0&&(a['review_window_days']<=b['review_window_closing_days']?c['push']({'id':'review_window_closing','category':'review_window','severity':'info','title':'Review\x20window\x20about\x20to\x20close','message':'The\x20review\x20window\x20will\x20close\x20in\x20'+a['review_window_days']+'\x20day(s)','action':'Submit\x20a\x20review\x20as\x20soon\x20as\x20possible\x20(evidence\x20can\x20be\x20submitted\x20together\x20if\x20available)','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Remaining\x20days','value':a['review_window_days'],'threshold':b['review_window_closing_days'],'unit':'days'}}):c['push']({'id':'review_reminder','category':'review_window','severity':'info','title':'Order\x20completed','message':'Order\x20completed;\x20review\x20window\x20has\x20'+a['review_window_days']+'\x20day(s)\x20remaining','action':'Submit\x20a\x20review\x20to\x20help\x20other\x20users\x20decide','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id']})),a['arb_window_days']!==undefined&&a['arb_window_days']>0x0&&(a['arb_window_days']<=b['arb_window_closing_days']&&c['push']({'id':'arb_window_closing','category':'arb_window','severity':'high','title':'Arbitration\x20application\x20window\x20about\x20to\x20close','message':'The\x20arbitration\x20application\x20window\x20will\x20close\x20in\x20'+a['arb_window_days']+'\x20day(s)','action':'If\x20there\x20are\x20unresolved\x20disputes,\x20initiate\x20an\x20arbitration\x20application\x20immediately','timestamp':a['now'],'order_id':a['order_id'],'service_id':a['service_id'],'metric':{'label':'Remaining\x20days','value':a['arb_window_days'],'threshold':b['arb_window_closing_days'],'unit':'days'}})),c;}export function sortAlerts(a){return[...a]['sort']((c,d)=>severityRank(d['severity'])-severityRank(c['severity']));}export{CUSTOMER_INTELLIGENCE_VERSION};
@@ -1 +1 @@
1
- import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../../graph/onchain/dataplane.js';import{expandTopology}from'../../graph/onchain/expand.js';import{FULL,GAP,fullServiceState,gapServiceState,truncatedServiceState}from'../../graph/onchain/fixtures.js';import{buildViewport}from'../../graph/onchain/viewport.js';import{runAnalyzers}from'../../graph/onchain/analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../../graph/onchain/strategy.js';import{projectEvaluationFacts as a35a}from'../../graph/onchain/facts.js';import{evaluateGraphServiceFacts,GRAPH_RULE_INPUT_FACTS,registerGraphServiceEvaluations}from'./graph-service.js';async function evalState(a,b){registerGraphServiceEvaluations();const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=a35a(e,b,runAnalyzers(e));return{'projected':f,'r':await evaluateGraphServiceFacts(f)};}const scoreOf=(a,b,c)=>a[b]['breakdown']['find'](d=>d['rule_id']===c);describe('graph\x20service\x20evaluation\x20—\x20fully\x20hooked\x20shop\x20(TR-14.1)',()=>{it('scores\x20all\x20nine\x20dimensions\x20from\x20material\x20facts\x20with\x20no\x20default-low\x20deductions',async()=>{const {r:a}=await evalState(fullServiceState(),FULL['svc']);expect(a['unverified'])['toEqual']([]),expect(a['completeness'])['toBe'](0x64);const c=scoreOf(a,'trust','trust_arbitration');expect(c['score'])['toBe'](0x64),expect(c['matched'])['toEqual'](expect['arrayContaining'](['arbitrator\x20roster\x20configured','arbitration\x20fee\x20funded','arbitration\x20active'])),expect(c['reason'])['toContain']('Arbitration\x2020/20'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fulfillment')['score'])['toBe'](0x19);const d=scoreOf(a,'trust','trust_fund_safety');expect(d['score'])['toBe'](0x0),expect(d['mismatched'])['toContain']('compensation\x20fund\x20below\x20the\x20statutory\x203x\x20exposure\x20ceiling'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x64),expect(a['trust']['total'])['toBe'](0x31);const e=scoreOf(a,'risk','risk_fund');expect(e['score'])['toBeLessThan'](0x64),expect(e['mismatched'])['toContain']('Payout\x20exposure:\x20compensation\x20fund\x20is\x20below\x20the\x203x\x20ceiling\x20of\x20windowed\x20order\x20amounts'),expect(e['mismatched']?.['some'](h=>h['startsWith']('R2:')))['toBe'](![]),expect(e['finding_refs']?.['map'](h=>h['id']))['toContain']('R2:'+FULL['svc']['toLowerCase']());const f=scoreOf(a,'risk','risk_trust');expect(f['score'])['toBeLessThan'](0x64),expect(f['mismatched']?.['some'](h=>h['startsWith']('R1:')))['toBe'](![]),expect(f['mismatched']?.['length'])['toBeGreaterThan'](0x0),expect(f['finding_refs']?.['some'](h=>h['id']['startsWith']('R1:')))['toBe'](!![]);for(const h of[...a['trust']['breakdown'],...a['risk']['breakdown']]){for(const i of h['mismatched']??[])expect(i)['not']['toContain']('::node::');}expect(scoreOf(a,'risk','risk_workflow')['score'])['toBe'](0x64),expect(scoreOf(a,'risk','risk_behavior')['score'])['toBe'](0x64);for(const j of[...a['trust']['breakdown'],...a['risk']['breakdown']]){const k=(j['reason']??'')['toLowerCase']();expect(k)['not']['toContain']('no\x20data'),expect(k)['not']['toContain']('default\x20low');}const g=a['trust']['trace']['filter'](l=>l['kind']==='rule'&&l['detail']['startsWith']('score='));expect(g['map'](l=>l['id']))['toEqual'](expect['arrayContaining'](Object['keys'](GRAPH_RULE_INPUT_FACTS)['filter'](l=>l['startsWith']('trust_'))));}),it('keeps\x20the\x20injection\x20+\x20requirement\x20mechanisms\x20working',async()=>{const {projected:a}=await evalState(fullServiceState(),FULL['svc']),b=await evaluateGraphServiceFacts(a,{'overrides':{'rules':{'trust_arbitration':{'weight':0x28}}}});expect(b['trust']['total'])['toBe'](0x3a);const c=await evaluateGraphServiceFacts(a,{'requirements':[{'rule_id':'trust_fund_safety','condition':'require'}]});expect(c['trust']['blocked'])['toBe'](!![]),expect(c['trust']['red_flags']['length'])['toBeGreaterThan'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20configured-empty\x20shell\x20(TR-14.1)',()=>{it('scores\x20verified\x20absence\x20as\x20a\x20configured\x20fact\x20and\x20excludes\x20only\x20the\x20gap\x20dimension',async()=>{const {r:a}=await evalState(gapServiceState(),GAP['svc']),b=scoreOf(a,'trust','trust_arbitration');expect(b['score'])['toBe'](0x0),expect(b['reason'])['toContain']('verified\x20absence'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x32),expect(a['unverified'])['toEqual'](['risk_workflow']),expect(scoreOf(a,'risk','risk_workflow'))['toBeUndefined'](),expect(a['risk']['unverified'])['toEqual'](['risk_workflow']),expect(a['trust']['unverified'])['toEqual'](['risk_workflow']);const c=a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']==='risk_workflow');expect(c?.['detail'])['toContain']('not\x20applicable'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fund_safety')['score'])['toBe'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20truncated\x20order\x20window\x20(TR-14.1)',()=>{it('excludes\x20the\x20unverifiable\x20dimensions\x20and\x20renormalizes\x20the\x20weighted\x20total',async()=>{const {r:a}=await evalState(truncatedServiceState(),FULL['svc']);expect(a['unverified'])['toEqual'](expect['arrayContaining'](['trust_fulfillment','trust_fund_safety','risk_fund','risk_behavior'])),expect(scoreOf(a,'trust','trust_fulfillment'))['toBeUndefined'](),expect(scoreOf(a,'trust','trust_fund_safety'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_fund'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_behavior'))['toBeUndefined'](),expect(a['trust']['total'])['toBe'](0x44);for(const b of['trust_fulfillment','trust_fund_safety']){expect(a['trust']['trace']['find'](c=>c['kind']==='rule'&&c['id']===b)?.['detail'])['toContain']('not\x20applicable');}for(const c of['risk_fund','risk_behavior']){expect(a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']===c)?.['detail'])['toContain']('not\x20applicable');}});}),describe('graph\x20service\x20evaluation\x20—\x20scoring\x20report\x20(TR-14.2)',()=>{it('renders\x20a\x20per-dimension\x20report\x20with\x20score,\x20weight,\x20state,\x20confidence\x20and\x20evidence',async()=>{const {projected:a,r:c}=await evalState(fullServiceState(),FULL['svc']),d=new Map(a['facts']['map'](g=>[g['key'],g])),e=[];for(const g of['trust','risk']){const h=c[g];e['push'](g['toUpperCase']()+'\x20'+h['total']+'/100\x20('+h['level']+')\x20—\x20'+h['summary']);for(const i of h['breakdown']){const j=GRAPH_RULE_INPUT_FACTS[i['rule_id']]??[],k=j['map'](o=>o+':state='+(d['get'](o)?.['state']??'missing')),l=j['map'](o=>d['get'](o)?.['provenance']['confidence']??'missing'),n=j['map'](o=>d['get'](o)?.['evidence']??'missing')['join']('\x20');e['push'](i['rule_id']+':\x20score='+i['score']+'\x20weight='+i['weight']+'\x20'+k['join'](',')+'\x20confidence='+[...new Set(l)]['join']('+')+'\x20evidence=\x22'+n+'\x22');}}expect(e)['toHaveLength'](0xb);const f=e['filter'](o=>o['includes']('score='));expect(f)['toHaveLength'](0x9);for(const o of f){expect(o)['toMatch'](/weight=\d+/),expect(o)['toContain']('state=present'),expect(o)['toMatch'](/confidence=(exact|bounded|windowed|derived)/);const p=o['match'](/evidence="(.*)"/);expect(p,o)['not']['toBeNull'](),expect(p[0x1]['length'],o)['toBeGreaterThan'](0x0);}expect(c['trust']['summary'])['toContain']('weakest\x20Fund\x20safety'),expect(c['trust']['summary'])['not']['toContain']('trust_fund_safety'),expect(c['trust']['summary'])['toMatch'](/grade: (strong|fair|weak)/),expect(c['trust']['summary'])['toContain']('Compensation\x20fund');});});
1
+ import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../../graph/onchain/dataplane.js';import{expandTopology}from'../../graph/onchain/expand.js';import{FULL,GAP,fullServiceState,gapServiceState,truncatedServiceState}from'../../graph/onchain/fixtures.js';import{buildViewport}from'../../graph/onchain/viewport.js';import{runAnalyzers}from'../../graph/onchain/analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../../graph/onchain/strategy.js';import{projectEvaluationFacts as a37a}from'../../graph/onchain/facts.js';import{evaluateGraphServiceFacts,GRAPH_RULE_INPUT_FACTS,registerGraphServiceEvaluations}from'./graph-service.js';async function evalState(a,b){registerGraphServiceEvaluations();const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=a37a(e,b,runAnalyzers(e));return{'projected':f,'r':await evaluateGraphServiceFacts(f)};}const scoreOf=(a,b,c)=>a[b]['breakdown']['find'](d=>d['rule_id']===c);describe('graph\x20service\x20evaluation\x20—\x20fully\x20hooked\x20shop\x20(TR-14.1)',()=>{it('scores\x20all\x20nine\x20dimensions\x20from\x20material\x20facts\x20with\x20no\x20default-low\x20deductions',async()=>{const {r:a}=await evalState(fullServiceState(),FULL['svc']);expect(a['unverified'])['toEqual']([]),expect(a['completeness'])['toBe'](0x64);const c=scoreOf(a,'trust','trust_arbitration');expect(c['score'])['toBe'](0x64),expect(c['matched'])['toEqual'](expect['arrayContaining'](['arbitrator\x20roster\x20configured','arbitration\x20fee\x20funded','arbitration\x20active'])),expect(c['reason'])['toContain']('Arbitration\x2020/20'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fulfillment')['score'])['toBe'](0x19);const d=scoreOf(a,'trust','trust_fund_safety');expect(d['score'])['toBe'](0x0),expect(d['mismatched'])['toContain']('compensation\x20fund\x20below\x20the\x20statutory\x203x\x20exposure\x20ceiling'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x64),expect(a['trust']['total'])['toBe'](0x31);const e=scoreOf(a,'risk','risk_fund');expect(e['score'])['toBeLessThan'](0x64),expect(e['mismatched'])['toContain']('Payout\x20exposure:\x20compensation\x20fund\x20is\x20below\x20the\x203x\x20ceiling\x20of\x20windowed\x20order\x20amounts'),expect(e['mismatched']?.['some'](h=>h['startsWith']('R2:')))['toBe'](![]),expect(e['finding_refs']?.['map'](h=>h['id']))['toContain']('R2:'+FULL['svc']['toLowerCase']());const f=scoreOf(a,'risk','risk_trust');expect(f['score'])['toBeLessThan'](0x64),expect(f['mismatched']?.['some'](h=>h['startsWith']('R1:')))['toBe'](![]),expect(f['mismatched']?.['length'])['toBeGreaterThan'](0x0),expect(f['finding_refs']?.['some'](h=>h['id']['startsWith']('R1:')))['toBe'](!![]);for(const h of[...a['trust']['breakdown'],...a['risk']['breakdown']]){for(const i of h['mismatched']??[])expect(i)['not']['toContain']('::node::');}expect(scoreOf(a,'risk','risk_workflow')['score'])['toBe'](0x64),expect(scoreOf(a,'risk','risk_behavior')['score'])['toBe'](0x64);for(const j of[...a['trust']['breakdown'],...a['risk']['breakdown']]){const k=(j['reason']??'')['toLowerCase']();expect(k)['not']['toContain']('no\x20data'),expect(k)['not']['toContain']('default\x20low');}const g=a['trust']['trace']['filter'](l=>l['kind']==='rule'&&l['detail']['startsWith']('score='));expect(g['map'](l=>l['id']))['toEqual'](expect['arrayContaining'](Object['keys'](GRAPH_RULE_INPUT_FACTS)['filter'](l=>l['startsWith']('trust_'))));}),it('keeps\x20the\x20injection\x20+\x20requirement\x20mechanisms\x20working',async()=>{const {projected:a}=await evalState(fullServiceState(),FULL['svc']),b=await evaluateGraphServiceFacts(a,{'overrides':{'rules':{'trust_arbitration':{'weight':0x28}}}});expect(b['trust']['total'])['toBe'](0x3a);const c=await evaluateGraphServiceFacts(a,{'requirements':[{'rule_id':'trust_fund_safety','condition':'require'}]});expect(c['trust']['blocked'])['toBe'](!![]),expect(c['trust']['red_flags']['length'])['toBeGreaterThan'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20configured-empty\x20shell\x20(TR-14.1)',()=>{it('scores\x20verified\x20absence\x20as\x20a\x20configured\x20fact\x20and\x20excludes\x20only\x20the\x20gap\x20dimension',async()=>{const {r:a}=await evalState(gapServiceState(),GAP['svc']),b=scoreOf(a,'trust','trust_arbitration');expect(b['score'])['toBe'](0x0),expect(b['reason'])['toContain']('verified\x20absence'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x32),expect(a['unverified'])['toEqual'](['risk_workflow']),expect(scoreOf(a,'risk','risk_workflow'))['toBeUndefined'](),expect(a['risk']['unverified'])['toEqual'](['risk_workflow']),expect(a['trust']['unverified'])['toEqual'](['risk_workflow']);const c=a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']==='risk_workflow');expect(c?.['detail'])['toContain']('not\x20applicable'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fund_safety')['score'])['toBe'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20truncated\x20order\x20window\x20(TR-14.1)',()=>{it('excludes\x20the\x20unverifiable\x20dimensions\x20and\x20renormalizes\x20the\x20weighted\x20total',async()=>{const {r:a}=await evalState(truncatedServiceState(),FULL['svc']);expect(a['unverified'])['toEqual'](expect['arrayContaining'](['trust_fulfillment','trust_fund_safety','risk_fund','risk_behavior'])),expect(scoreOf(a,'trust','trust_fulfillment'))['toBeUndefined'](),expect(scoreOf(a,'trust','trust_fund_safety'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_fund'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_behavior'))['toBeUndefined'](),expect(a['trust']['total'])['toBe'](0x44);for(const b of['trust_fulfillment','trust_fund_safety']){expect(a['trust']['trace']['find'](c=>c['kind']==='rule'&&c['id']===b)?.['detail'])['toContain']('not\x20applicable');}for(const c of['risk_fund','risk_behavior']){expect(a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']===c)?.['detail'])['toContain']('not\x20applicable');}});}),describe('graph\x20service\x20evaluation\x20—\x20scoring\x20report\x20(TR-14.2)',()=>{it('renders\x20a\x20per-dimension\x20report\x20with\x20score,\x20weight,\x20state,\x20confidence\x20and\x20evidence',async()=>{const {projected:a,r:c}=await evalState(fullServiceState(),FULL['svc']),d=new Map(a['facts']['map'](g=>[g['key'],g])),e=[];for(const g of['trust','risk']){const h=c[g];e['push'](g['toUpperCase']()+'\x20'+h['total']+'/100\x20('+h['level']+')\x20—\x20'+h['summary']);for(const i of h['breakdown']){const j=GRAPH_RULE_INPUT_FACTS[i['rule_id']]??[],k=j['map'](o=>o+':state='+(d['get'](o)?.['state']??'missing')),l=j['map'](o=>d['get'](o)?.['provenance']['confidence']??'missing'),n=j['map'](o=>d['get'](o)?.['evidence']??'missing')['join']('\x20');e['push'](i['rule_id']+':\x20score='+i['score']+'\x20weight='+i['weight']+'\x20'+k['join'](',')+'\x20confidence='+[...new Set(l)]['join']('+')+'\x20evidence=\x22'+n+'\x22');}}expect(e)['toHaveLength'](0xb);const f=e['filter'](o=>o['includes']('score='));expect(f)['toHaveLength'](0x9);for(const o of f){expect(o)['toMatch'](/weight=\d+/),expect(o)['toContain']('state=present'),expect(o)['toMatch'](/confidence=(exact|bounded|windowed|derived)/);const p=o['match'](/evidence="(.*)"/);expect(p,o)['not']['toBeNull'](),expect(p[0x1]['length'],o)['toBeGreaterThan'](0x0);}expect(c['trust']['summary'])['toContain']('weakest\x20Fund\x20safety'),expect(c['trust']['summary'])['not']['toContain']('trust_fund_safety'),expect(c['trust']['summary'])['toMatch'](/grade: (strong|fair|weak)/),expect(c['trust']['summary'])['toContain']('Compensation\x20fund');});});
@@ -1 +1 @@
1
- import{REQUIREMENT_PASS_THRESHOLD,effectiveWeight,isDataSourceEnabled,isRuleEnabled,normalizeInjection}from'./user-injection.js';import{levelFromScore as a41a}from'./standards.js';export function levelFromScore(a){return a41a(a);}function appliesTo(a,b){if(!a||a['length']===0x0)return!![];return a['includes'](b);}export class EvaluationEngine{static ['instance']=null;['dataSources']=new Map();['rules']=new Map();static['Instance'](){return!EvaluationEngine['instance']&&(EvaluationEngine['instance']=new EvaluationEngine()),EvaluationEngine['instance'];}['registerDataSource'](a){if(!a['id']||this['dataSources']['has'](a['id']))return![];return this['dataSources']['set'](a['id'],a),!![];}['unregisterDataSource'](a){return this['dataSources']['delete'](a);}['registerRule'](a){if(!a['id']||this['rules']['has'](a['id']))return![];return this['rules']['set'](a['id'],a),!![];}['unregisterRule'](a){return this['rules']['delete'](a);}['getRule'](a){return this['rules']['get'](a);}['listRules'](){return Array['from'](this['rules']['values']());}['getDataSource'](a){return this['dataSources']['get'](a);}['listDataSources'](){return Array['from'](this['dataSources']['values']());}async['evaluate'](a,b,c){const d=normalizeInjection(c),e={'evaluation_id':a,'entities':b,'facts':{},'injection':d,'now':Date['now']()},f=[],g=Array['from'](this['dataSources']['values']())['filter'](m=>appliesTo(m['evaluation_ids'],a))['sort']((m,n)=>(m['priority']??0x0)-(n['priority']??0x0));for(const m of g){if(!isDataSourceEnabled(m['id'],d)){f['push']({'kind':'override','id':m['id'],'detail':'data\x20source\x20disabled\x20by\x20user\x20override'});continue;}if(m['isEnabled']&&!m['isEnabled'](e))continue;const n=await m['extract'](e);Object['assign'](e['facts'],n),f['push']({'kind':'data_source','id':m['id'],'detail':'extracted\x20'+Object['keys'](n)['length']+'\x20fact(s)'});}const h=[],i=[];for(const o of this['rules']['values']()){if(!appliesTo(o['evaluation_ids'],a))continue;if(!isRuleEnabled(o['id'],d)){f['push']({'kind':'override','id':o['id'],'detail':'rule\x20disabled\x20by\x20user\x20override'});continue;}if(o['isEnabled']&&!o['isEnabled'](e))continue;const p=o['evaluate'](e);if(!p){f['push']({'kind':'rule','id':o['id'],'detail':'not\x20applicable\x20—\x20excluded\x20from\x20weighted\x20aggregation'});continue;}const q=effectiveWeight(o,d);h['push']({'rule_id':o['id'],'dimension':o['dimension'],'score':p['score'],'weight':q,'weight_source':q!==o['weight']?'override':'default','reason':p['reason'],'matched':p['matched'],'mismatched':p['mismatched'],'finding_refs':p['finding_refs'],'red_flag':p['red_flag']}),p['red_flag']&&i['push'](p['reason']??o['id']+'\x20triggered\x20a\x20hard\x20block'),f['push']({'kind':'rule','id':o['id'],'detail':'score='+p['score']+'\x20weight='+q});}const j=aggregateScore(h);let k=i['length']>0x0;for(const r of d['requirements']??[]){const s=h['find'](t=>t['rule_id']===r['rule_id']);if(r['condition']==='require')(!s||s['score']<REQUIREMENT_PASS_THRESHOLD||s['red_flag'])&&(k=!![],i['push'](r['note']??'Requirement\x20requires\x20rule\x20\x27'+r['rule_id']+'\x27\x20to\x20pass'));else r['condition']==='forbid'&&(s&&s['red_flag']&&(k=!![],i['push'](r['note']??'Requirement\x20forbids\x20rule\x20\x27'+r['rule_id']+'\x27\x20from\x20triggering')));}const l=e['facts']['summary']??buildSummary(a,j,h,i,k);return{'evaluation_id':a,'total':j,'level':levelFromScore(j),'breakdown':h,'red_flags':i,'blocked':k,'trace':f,'summary':l,'criterionScores':e['facts']['criterionScores'],'findings':e['facts']['findings'],'strengths':e['facts']['strengths'],'needsLlm':e['facts']['needsLlm'],'llmPrompt':e['facts']['llmPrompt']};}}function aggregateScore(a){if(a['length']===0x0)return 0x0;let c=0x0,d=0x0;for(const e of a){c+=e['score']*e['weight'],d+=e['weight'];}if(d<=0x0)return 0x0;return clamp(Math['round'](c/d),0x0,0x64);}function clamp(a,b,c){return Math['max'](b,Math['min'](c,a));}function buildSummary(a,b,c,d,e){const f=['Evaluation\x20\x27'+a+'\x27:\x20score\x20'+b+'/100'];return e?f['push']('BLOCKED\x20('+d['length']+'\x20red\x20flag(s))'):f['push'](c['length']+'\x20rule(s)\x20evaluated'),f['join']('\x20—\x20');}export function getEvaluationEngine(){return EvaluationEngine['Instance']();}
1
+ import{REQUIREMENT_PASS_THRESHOLD,effectiveWeight,isDataSourceEnabled,isRuleEnabled,normalizeInjection}from'./user-injection.js';import{levelFromScore as a43a}from'./standards.js';export function levelFromScore(a){return a43a(a);}function appliesTo(a,b){if(!a||a['length']===0x0)return!![];return a['includes'](b);}export class EvaluationEngine{static ['instance']=null;['dataSources']=new Map();['rules']=new Map();static['Instance'](){return!EvaluationEngine['instance']&&(EvaluationEngine['instance']=new EvaluationEngine()),EvaluationEngine['instance'];}['registerDataSource'](a){if(!a['id']||this['dataSources']['has'](a['id']))return![];return this['dataSources']['set'](a['id'],a),!![];}['unregisterDataSource'](a){return this['dataSources']['delete'](a);}['registerRule'](a){if(!a['id']||this['rules']['has'](a['id']))return![];return this['rules']['set'](a['id'],a),!![];}['unregisterRule'](a){return this['rules']['delete'](a);}['getRule'](a){return this['rules']['get'](a);}['listRules'](){return Array['from'](this['rules']['values']());}['getDataSource'](a){return this['dataSources']['get'](a);}['listDataSources'](){return Array['from'](this['dataSources']['values']());}async['evaluate'](a,b,c){const d=normalizeInjection(c),e={'evaluation_id':a,'entities':b,'facts':{},'injection':d,'now':Date['now']()},f=[],g=Array['from'](this['dataSources']['values']())['filter'](m=>appliesTo(m['evaluation_ids'],a))['sort']((m,n)=>(m['priority']??0x0)-(n['priority']??0x0));for(const m of g){if(!isDataSourceEnabled(m['id'],d)){f['push']({'kind':'override','id':m['id'],'detail':'data\x20source\x20disabled\x20by\x20user\x20override'});continue;}if(m['isEnabled']&&!m['isEnabled'](e))continue;const n=await m['extract'](e);Object['assign'](e['facts'],n),f['push']({'kind':'data_source','id':m['id'],'detail':'extracted\x20'+Object['keys'](n)['length']+'\x20fact(s)'});}const h=[],i=[];for(const o of this['rules']['values']()){if(!appliesTo(o['evaluation_ids'],a))continue;if(!isRuleEnabled(o['id'],d)){f['push']({'kind':'override','id':o['id'],'detail':'rule\x20disabled\x20by\x20user\x20override'});continue;}if(o['isEnabled']&&!o['isEnabled'](e))continue;const p=o['evaluate'](e);if(!p){f['push']({'kind':'rule','id':o['id'],'detail':'not\x20applicable\x20—\x20excluded\x20from\x20weighted\x20aggregation'});continue;}const q=effectiveWeight(o,d);h['push']({'rule_id':o['id'],'dimension':o['dimension'],'score':p['score'],'weight':q,'weight_source':q!==o['weight']?'override':'default','reason':p['reason'],'matched':p['matched'],'mismatched':p['mismatched'],'finding_refs':p['finding_refs'],'red_flag':p['red_flag']}),p['red_flag']&&i['push'](p['reason']??o['id']+'\x20triggered\x20a\x20hard\x20block'),f['push']({'kind':'rule','id':o['id'],'detail':'score='+p['score']+'\x20weight='+q});}const j=aggregateScore(h);let k=i['length']>0x0;for(const r of d['requirements']??[]){const s=h['find'](t=>t['rule_id']===r['rule_id']);if(r['condition']==='require')(!s||s['score']<REQUIREMENT_PASS_THRESHOLD||s['red_flag'])&&(k=!![],i['push'](r['note']??'Requirement\x20requires\x20rule\x20\x27'+r['rule_id']+'\x27\x20to\x20pass'));else r['condition']==='forbid'&&(s&&s['red_flag']&&(k=!![],i['push'](r['note']??'Requirement\x20forbids\x20rule\x20\x27'+r['rule_id']+'\x27\x20from\x20triggering')));}const l=e['facts']['summary']??buildSummary(a,j,h,i,k);return{'evaluation_id':a,'total':j,'level':levelFromScore(j),'breakdown':h,'red_flags':i,'blocked':k,'trace':f,'summary':l,'criterionScores':e['facts']['criterionScores'],'findings':e['facts']['findings'],'strengths':e['facts']['strengths'],'needsLlm':e['facts']['needsLlm'],'llmPrompt':e['facts']['llmPrompt']};}}function aggregateScore(a){if(a['length']===0x0)return 0x0;let c=0x0,d=0x0;for(const e of a){c+=e['score']*e['weight'],d+=e['weight'];}if(d<=0x0)return 0x0;return clamp(Math['round'](c/d),0x0,0x64);}function clamp(a,b,c){return Math['max'](b,Math['min'](c,a));}function buildSummary(a,b,c,d,e){const f=['Evaluation\x20\x27'+a+'\x27:\x20score\x20'+b+'/100'];return e?f['push']('BLOCKED\x20('+d['length']+'\x20red\x20flag(s))'):f['push'](c['length']+'\x20rule(s)\x20evaluated'),f['join']('\x20—\x20');}export function getEvaluationEngine(){return EvaluationEngine['Instance']();}
@@ -1 +1 @@
1
- import{distillIntent,extractSignals}from'./intent-distill.js';import{getProfile,updateFromOperation}from'./user-profile.js';import{findMatches,recordSignature}from'./experience-reuse.js';import{EXPERIENCE_LAYER_VERSION}from'./types.js';import{isEnabled as a63a}from'../config/index.js';import{recordIndustrySignal}from'../knowledge/flywheel-loop.js';export{EXPERIENCE_LAYER_VERSION};export function getExperienceFeedback(a,b,c){try{const d=distillIntent(a,b,c),e=findMatches(d['primary_intent'],a,b,0x3);if(e['length']===0x0)return undefined;const f=e[0x0],g=getProfile();return formatFeedback(f,e,d['scenario'],g);}catch{return undefined;}}export function recordOperationOutcome(a,b,c,d,e,f=[]){try{const g=distillIntent(a,b,c),h=extractSignals(a,b);recordSignature({'intent':g['primary_intent'],'scenario':g['scenario'],'signals':h,'timestamp':Date['now'](),'outcome':d,'error_code':e}),updateFromOperation(g['primary_intent'],g['scenario'],d,e,f);try{if(a63a('industry_evolution')){const i=typeof b?.['industry']==='string'&&b['industry']['trim']()?b['industry']['trim']():undefined;if(i){const j=d==='success'?{'success':!![]}:{'success':![],'error_code':e};recordIndustrySignal(i,{'type':a,'data':b},j);}}}catch{}}catch{}}function formatFeedback(a,b,c,d){const e=buildAdviceText(a,b,d),f=collectAvoidList(b,d),g=a['relevance'],h=c??a['signature']['scenario'],i={};if(e)i['advice']=e;if(f['length']>0x0)i['avoid']=f;if(g>0x0)i['relevance']=Math['round'](g*0x64)/0x64;if(h)i['matched_scenario']=h;return i;}function buildAdviceText(a,b,c){const d=[];if(a['signature']['outcome']==='success')d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20succeeded');else a['signature']['outcome']==='failed'&&d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20failed\x20('+(a['signature']['error_code']??'unknown\x20error')+'),\x20pay\x20special\x20attention\x20to\x20parameters');return c['expertise_tier']==='novice'&&b['length']>0x0&&d['push']('It\x20is\x20recommended\x20to\x20carefully\x20check\x20parameters\x20before\x20executing'),d['join'](';\x20')||a['advice'];}function collectAvoidList(b,c){const d=new Set();for(const e of b){for(const f of e['avoid']){d['add'](f);}}for(const g of c['frequent_pitfalls']){d['add']('You\x20often\x20make\x20mistakes\x20at\x20the\x20'+g+'\x20step,\x20please\x20be\x20especially\x20careful');}return Array['from'](d)['slice'](0x0,0x5);}
1
+ import{distillIntent,extractSignals}from'./intent-distill.js';import{getProfile,updateFromOperation}from'./user-profile.js';import{findMatches,recordSignature}from'./experience-reuse.js';import{EXPERIENCE_LAYER_VERSION}from'./types.js';import{isEnabled as a65a}from'../config/index.js';import{recordIndustrySignal}from'../knowledge/flywheel-loop.js';export{EXPERIENCE_LAYER_VERSION};export function getExperienceFeedback(a,b,c){try{const d=distillIntent(a,b,c),e=findMatches(d['primary_intent'],a,b,0x3);if(e['length']===0x0)return undefined;const f=e[0x0],g=getProfile();return formatFeedback(f,e,d['scenario'],g);}catch{return undefined;}}export function recordOperationOutcome(a,b,c,d,e,f=[]){try{const g=distillIntent(a,b,c),h=extractSignals(a,b);recordSignature({'intent':g['primary_intent'],'scenario':g['scenario'],'signals':h,'timestamp':Date['now'](),'outcome':d,'error_code':e}),updateFromOperation(g['primary_intent'],g['scenario'],d,e,f);try{if(a65a('industry_evolution')){const i=typeof b?.['industry']==='string'&&b['industry']['trim']()?b['industry']['trim']():undefined;if(i){const j=d==='success'?{'success':!![]}:{'success':![],'error_code':e};recordIndustrySignal(i,{'type':a,'data':b},j);}}}catch{}}catch{}}function formatFeedback(a,b,c,d){const e=buildAdviceText(a,b,d),f=collectAvoidList(b,d),g=a['relevance'],h=c??a['signature']['scenario'],i={};if(e)i['advice']=e;if(f['length']>0x0)i['avoid']=f;if(g>0x0)i['relevance']=Math['round'](g*0x64)/0x64;if(h)i['matched_scenario']=h;return i;}function buildAdviceText(a,b,c){const d=[];if(a['signature']['outcome']==='success')d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20succeeded');else a['signature']['outcome']==='failed'&&d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20failed\x20('+(a['signature']['error_code']??'unknown\x20error')+'),\x20pay\x20special\x20attention\x20to\x20parameters');return c['expertise_tier']==='novice'&&b['length']>0x0&&d['push']('It\x20is\x20recommended\x20to\x20carefully\x20check\x20parameters\x20before\x20executing'),d['join'](';\x20')||a['advice'];}function collectAvoidList(b,c){const d=new Set();for(const e of b){for(const f of e['avoid']){d['add'](f);}}for(const g of c['frequent_pitfalls']){d['add']('You\x20often\x20make\x20mistakes\x20at\x20the\x20'+g+'\x20step,\x20please\x20be\x20especially\x20careful');}return Array['from'](d)['slice'](0x0,0x5);}
@@ -1,5 +1,10 @@
1
+ import type { TemplateArbitrationMode } from "../knowledge/builtin-templates.js";
1
2
  import type { ModeConstraint, ConstraintRule, ConstraintViolation, ConstraintSeverity, ConstraintViolationAction, IndustryMode } from "./types.js";
2
3
  import type { CapabilityRegistry } from "./capability-manifest.js";
4
+ export interface TemplateDeclarations {
5
+ template_id?: string;
6
+ arbitration_mode?: TemplateArbitrationMode;
7
+ }
3
8
  export declare class ConstraintRegistry {
4
9
  private static instance;
5
10
  private constraints;
@@ -17,7 +22,7 @@ export declare class ConstraintRegistry {
17
22
  severity?: ConstraintSeverity;
18
23
  }): Promise<ModeConstraint[]>;
19
24
  unregisterConstraint(constraint_id: string, owner: string): Promise<boolean>;
20
- checkConstraints(mode: IndustryMode, _capabilityRegistry: CapabilityRegistry, extraConstraints?: ModeConstraint[]): ConstraintViolation[];
25
+ checkConstraints(mode: IndustryMode, _capabilityRegistry: CapabilityRegistry, extraConstraints?: ModeConstraint[], templateDeclarations?: TemplateDeclarations): ConstraintViolation[];
21
26
  private checkConstraint;
22
27
  private getNumericField;
23
28
  private registerBuiltinConstraints;
@@ -1 +1 @@
1
- import{CustomRegistryFile}from'./custom-registry-file.js';const BUILTIN_CONSTRAINTS=[{'constraint_id':'require_arbitration','display_name':'Require\x20Arbitration','description':'Mode\x20must\x20include\x20arbitration\x20capability\x20(arb.*)\x20for\x20dispute\x20resolution','rule':{'type':'capability_required','capability_id':'arb.vote_weighted'},'severity':'hard','on_violation':'block','scope':'builtin'},{'constraint_id':'require_compensation_fund','display_name':'Require\x20Compensation\x20Fund','description':'Mode\x20must\x20include\x20fund\x20escrow\x20capability\x20(treasury.*)\x20for\x20compensation\x20fund','rule':{'type':'capability_required','capability_id':'treasury.owner_receive'},'severity':'hard','on_violation':'block','scope':'builtin'},{'constraint_id':'require_wip_evidence','display_name':'Require\x20WIP\x20Evidence','description':'Mode\x20must\x20include\x20WIP\x20evidence\x20capability\x20(guard.validate_wip_hash)\x20for\x20digital\x20delivery\x20validation','rule':{'type':'capability_required','capability_id':'guard.validate_wip_hash'},'severity':'soft','on_violation':'warn','scope':'builtin'},{'constraint_id':'max_single_transaction_limit','display_name':'Single\x20Transaction\x20Limit','description':'Single\x20transaction\x20amount\x20must\x20not\x20exceed\x2010000\x20WOW\x20(default\x20value,\x20can\x20be\x20overridden\x20by\x20mode)','rule':{'type':'numeric_limit','field':'max_single_transaction','max':0x2710},'severity':'soft','on_violation':'warn','scope':'builtin'}];export class ConstraintRegistry{static ['instance'];['constraints']=new Map();['file']=CustomRegistryFile['Instance']();['customSyncedMtime']=-0x1;static['Instance'](){return!ConstraintRegistry['instance']&&(ConstraintRegistry['instance']=new ConstraintRegistry()),ConstraintRegistry['instance'];}constructor(){this['registerBuiltinConstraints']();}async['ensureLoaded'](){const {data:a,mtime:b}=await this['file']['read']();if(b<0x0||b===this['customSyncedMtime'])return;this['customSyncedMtime']=b;for(const [c,d]of this['constraints']){if(d['scope']==='custom')this['constraints']['delete'](c);}for(const e of Object['values'](a['constraints'])){const f=e;f?.['constraint_id']&&f['scope']==='custom'?this['constraints']['set'](f['constraint_id'],f):console['warn']('[ConstraintRegistry]\x20Skipping\x20invalid\x20custom_constraints\x20file\x20entry.');}}['registerConstraint'](a){if(!a['constraint_id']||!a['rule'])return![];if(this['constraints']['has'](a['constraint_id']))return![];return this['constraints']['set'](a['constraint_id'],a),!![];}async['registerCustomConstraint'](a,b,c,d,e,f='soft',g='warn'){await this['ensureLoaded']();const h={'constraint_id':a,'display_name':b,'description':c,'rule':d,'severity':f,'on_violation':g,'scope':'custom','owner':e},i=this['registerConstraint'](h);return i&&await this['file']['update'](j=>{j['constraints'][a]=h;}),i;}['getConstraint'](a){return this['constraints']['get'](a);}async['listConstraints'](a){await this['ensureLoaded']();let b=Array['from'](this['constraints']['values']());if(!a)return b;if(a['scope'])b=b['filter'](d=>d['scope']===a['scope']);if(a['owner'])b=b['filter'](d=>d['owner']===a['owner']);if(a['severity'])b=b['filter'](d=>d['severity']===a['severity']);return b;}async['unregisterConstraint'](a,b){await this['ensureLoaded']();const c=this['constraints']['get'](a);if(!c||c['scope']!=='custom'||c['owner']!==b)return![];const d=this['constraints']['delete'](a);return d&&await this['file']['update'](e=>{delete e['constraints'][a];}),d;}['checkConstraints'](a,b,d){const e=new Set(a['disabled_builtin_constraints']??[]),f=[...this['constraints']['values']()]['filter'](h=>!(h['scope']==='builtin'&&e['has'](h['constraint_id'])));if(d)for(const h of d){!f['some'](i=>i['constraint_id']===h['constraint_id'])&&f['push'](h);}const g=[];for(const i of f){const j=this['checkConstraint'](a,i);j&&g['push'](j);}return g;}['checkConstraint'](a,b){const c=b['rule'];switch(c['type']){case'capability_required':{if(!a['capabilities_used']['includes'](c['capability_id']))return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':'Missing\x20required\x20capability:\x20'+c['capability_id'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Add\x20\x22'+c['capability_id']+'\x22\x20to\x20capabilities_used'};return null;}case'capability_forbidden':{if(a['capabilities_used']['includes'](c['capability_id']))return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':'Contains\x20forbidden\x20capability:\x20'+c['capability_id'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Remove\x20\x22'+c['capability_id']+'\x22\x20from\x20capabilities_used'};return null;}case'numeric_limit':{const d=this['getNumericField'](a,c['field']);if(d===undefined)return null;if(c['max']!==undefined&&d>c['max'])return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':c['field']+'='+d+'\x20exceeds\x20upper\x20limit\x20'+c['max'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Reduce\x20'+c['field']+'\x20below\x20'+c['max']};if(c['min']!==undefined&&d<c['min'])return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':c['field']+'='+d+'\x20below\x20lower\x20limit\x20'+c['min'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Increase\x20'+c['field']+'\x20above\x20'+c['min']};return null;}case'condition_required':{return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':'Natural\x20language\x20condition\x20pending\x20AI\x20evaluation:\x20\x22'+c['condition']+'\x22','severity':b['severity'],'action':b['on_violation'],'recommendation':'Please\x20have\x20AI\x20evaluate\x20whether\x20this\x20condition\x20is\x20satisfied,\x20and\x20update\x20the\x20mode\x20configuration'};}default:return null;}}['getNumericField'](a,b){if(b==='max_single_transaction')return a['risk_constraints']['max_single_transaction'];return undefined;}['registerBuiltinConstraints'](){for(const a of BUILTIN_CONSTRAINTS){this['registerConstraint'](a);}}}export function getConstraintRegistry(){return ConstraintRegistry['Instance']();}export const BUILTIN_CONSTRAINTS_COUNT=BUILTIN_CONSTRAINTS['length'];
1
+ import{CustomRegistryFile}from'./custom-registry-file.js';const BUILTIN_CONSTRAINTS=[{'constraint_id':'require_arbitration','display_name':'Require\x20Arbitration','description':'Mode\x20must\x20include\x20arbitration\x20capability\x20(arb.*)\x20for\x20dispute\x20resolution','rule':{'type':'capability_required','capability_id':'arb.vote_weighted'},'severity':'hard','on_violation':'block','scope':'builtin'},{'constraint_id':'require_compensation_fund','display_name':'Require\x20Compensation\x20Fund','description':'Mode\x20must\x20include\x20fund\x20escrow\x20capability\x20(treasury.*)\x20for\x20compensation\x20fund','rule':{'type':'capability_required','capability_id':'treasury.owner_receive'},'severity':'hard','on_violation':'block','scope':'builtin'},{'constraint_id':'require_wip_evidence','display_name':'Require\x20WIP\x20Evidence','description':'Mode\x20must\x20include\x20WIP\x20evidence\x20capability\x20(guard.validate_wip_hash)\x20for\x20digital\x20delivery\x20validation','rule':{'type':'capability_required','capability_id':'guard.validate_wip_hash'},'severity':'soft','on_violation':'warn','scope':'builtin'},{'constraint_id':'max_single_transaction_limit','display_name':'Single\x20Transaction\x20Limit','description':'Single\x20transaction\x20amount\x20must\x20not\x20exceed\x2010000\x20WOW\x20(default\x20value,\x20can\x20be\x20overridden\x20by\x20mode)','rule':{'type':'numeric_limit','field':'max_single_transaction','max':0x2710},'severity':'soft','on_violation':'warn','scope':'builtin'}];export class ConstraintRegistry{static ['instance'];['constraints']=new Map();['file']=CustomRegistryFile['Instance']();['customSyncedMtime']=-0x1;static['Instance'](){return!ConstraintRegistry['instance']&&(ConstraintRegistry['instance']=new ConstraintRegistry()),ConstraintRegistry['instance'];}constructor(){this['registerBuiltinConstraints']();}async['ensureLoaded'](){const {data:a,mtime:b}=await this['file']['read']();if(b<0x0||b===this['customSyncedMtime'])return;this['customSyncedMtime']=b;for(const [c,d]of this['constraints']){if(d['scope']==='custom')this['constraints']['delete'](c);}for(const e of Object['values'](a['constraints'])){const f=e;f?.['constraint_id']&&f['scope']==='custom'?this['constraints']['set'](f['constraint_id'],f):console['warn']('[ConstraintRegistry]\x20Skipping\x20invalid\x20custom_constraints\x20file\x20entry.');}}['registerConstraint'](a){if(!a['constraint_id']||!a['rule'])return![];if(this['constraints']['has'](a['constraint_id']))return![];return this['constraints']['set'](a['constraint_id'],a),!![];}async['registerCustomConstraint'](a,b,c,d,e,f='soft',g='warn'){await this['ensureLoaded']();const h={'constraint_id':a,'display_name':b,'description':c,'rule':d,'severity':f,'on_violation':g,'scope':'custom','owner':e},i=this['registerConstraint'](h);return i&&await this['file']['update'](j=>{j['constraints'][a]=h;}),i;}['getConstraint'](a){return this['constraints']['get'](a);}async['listConstraints'](a){await this['ensureLoaded']();let b=Array['from'](this['constraints']['values']());if(!a)return b;if(a['scope'])b=b['filter'](d=>d['scope']===a['scope']);if(a['owner'])b=b['filter'](d=>d['owner']===a['owner']);if(a['severity'])b=b['filter'](d=>d['severity']===a['severity']);return b;}async['unregisterConstraint'](a,b){await this['ensureLoaded']();const c=this['constraints']['get'](a);if(!c||c['scope']!=='custom'||c['owner']!==b)return![];const d=this['constraints']['delete'](a);return d&&await this['file']['update'](e=>{delete e['constraints'][a];}),d;}['checkConstraints'](a,b,d,e){const f=new Set(a['disabled_builtin_constraints']??[]),g=e?.['arbitration_mode']!==undefined&&e['arbitration_mode']!=='none'&&f['has']('require_arbitration');if(g)f['delete']('require_arbitration');const h=[...this['constraints']['values']()]['filter'](j=>!(j['scope']==='builtin'&&f['has'](j['constraint_id'])));if(d)for(const j of d){!h['some'](k=>k['constraint_id']===j['constraint_id'])&&h['push'](j);}const i=[];for(const k of h){const l=this['checkConstraint'](a,k);l&&i['push'](l);}return g&&i['push']({'constraint_id':'s3_dual_source_reconciliation','display_name':'Dual-Source\x20Reconciliation\x20(S3)','violation':'Template\x20\x27'+(e['template_id']??'unknown')+'\x27\x20explicitly\x20declares\x20'+('arbitration_mode=\x27'+e['arbitration_mode']+'\x27\x20while\x20mode\x20\x27'+a['name']+'\x27\x20')+'disables\x20\x27require_arbitration\x27.\x20Per\x20the\x20knowledge\x20priority\x20chain\x20(prompt\x20>\x20'+'product\x20template\x20>\x20industry\x20>\x20kernel)\x20the\x20template\x20declaration\x20wins:\x20the\x20'+'arbitration\x20requirement\x20stays\x20ENFORCED.','severity':'soft','action':'warn','recommendation':'Keep\x20the\x20arbitration\x20venue\x20wired\x20for\x20builds\x20under\x20this\x20mode\x20(the\x20template\x20'+'compiles\x20it).\x20If\x20the\x20mode\x20itself\x20should\x20not\x20carry\x20the\x20blanket\x20opt-out,\x20remove\x20'+'\x27require_arbitration\x27\x20from\x20its\x20disabled_builtin_constraints.'}),i;}['checkConstraint'](a,b){const c=b['rule'];switch(c['type']){case'capability_required':{if(!a['capabilities_used']['includes'](c['capability_id']))return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':'Missing\x20required\x20capability:\x20'+c['capability_id'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Add\x20\x22'+c['capability_id']+'\x22\x20to\x20capabilities_used'};return null;}case'capability_forbidden':{if(a['capabilities_used']['includes'](c['capability_id']))return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':'Contains\x20forbidden\x20capability:\x20'+c['capability_id'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Remove\x20\x22'+c['capability_id']+'\x22\x20from\x20capabilities_used'};return null;}case'numeric_limit':{const d=this['getNumericField'](a,c['field']);if(d===undefined)return null;if(c['max']!==undefined&&d>c['max'])return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':c['field']+'='+d+'\x20exceeds\x20upper\x20limit\x20'+c['max'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Reduce\x20'+c['field']+'\x20below\x20'+c['max']};if(c['min']!==undefined&&d<c['min'])return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':c['field']+'='+d+'\x20below\x20lower\x20limit\x20'+c['min'],'severity':b['severity'],'action':b['on_violation'],'recommendation':'Increase\x20'+c['field']+'\x20above\x20'+c['min']};return null;}case'condition_required':{return{'constraint_id':b['constraint_id'],'display_name':b['display_name'],'violation':'Natural\x20language\x20condition\x20pending\x20AI\x20evaluation:\x20\x22'+c['condition']+'\x22','severity':b['severity'],'action':b['on_violation'],'recommendation':'Please\x20have\x20AI\x20evaluate\x20whether\x20this\x20condition\x20is\x20satisfied,\x20and\x20update\x20the\x20mode\x20configuration'};}default:return null;}}['getNumericField'](a,b){if(b==='max_single_transaction')return a['risk_constraints']['max_single_transaction'];return undefined;}['registerBuiltinConstraints'](){for(const a of BUILTIN_CONSTRAINTS){this['registerConstraint'](a);}}}export function getConstraintRegistry(){return ConstraintRegistry['Instance']();}export const BUILTIN_CONSTRAINTS_COUNT=BUILTIN_CONSTRAINTS['length'];
@@ -10,7 +10,7 @@ export { MetricRegistry, getMetricRegistry, BUILTIN_METRICS_COUNT, } from "./met
10
10
  export { ConstraintRegistry, getConstraintRegistry, BUILTIN_CONSTRAINTS_COUNT, } from "./constraint-registry.js";
11
11
  export { ModeEvaluator } from "./mode-evaluator.js";
12
12
  export { BUILTIN_MODES } from "./modes.js";
13
- export { registerIndustryPack, validatePackManifest, listRegisteredPacks, unregisterIndustryPack, scanPacks, rescanPack, resolveIndustryPackDir, scanDefaultIndustryPacks, scaffoldIndustryPack, seedBuiltinIndustryTemplates, seedBuiltinStrategyManuals, type StrategyManualSeedResult, diffIndustryPack, resetIndustryPath, readMergedPackIfPresent, buildPristineMergedPack, locatePackAndRemainder, ensureIndustryReadme, industryReadmeContent, } from "./industry-pack.js";
13
+ export { registerIndustryPack, validatePackManifest, listRegisteredPacks, getRegisteredPack, packKind, unregisterIndustryPack, scanPacks, rescanPack, resolveIndustryPackDir, scanDefaultIndustryPacks, scaffoldIndustryPack, seedBuiltinIndustryTemplates, seedBuiltinStrategyManuals, type StrategyManualSeedResult, diffIndustryPack, resetIndustryPath, readMergedPackIfPresent, buildPristineMergedPack, locatePackAndRemainder, ensureIndustryReadme, industryReadmeContent, } from "./industry-pack.js";
14
14
  export type { IndustryPackManifest, IndustryPack, IndustryPackLayout, MergedIndustryPack, PackValidation, PackRegistrationResult, PackRecord, ScaffoldResult, PackDiffResult, ResetResult, } from "./industry-pack.js";
15
15
  export { registerDisputeRules, registerComplianceRules, registerSupplyRules, registerIndustryRules, registerIndustryPlaybook, resolveDisputeRules, resolveComplianceRules, resolveSupplyRules, resolveIndustryRules, resolveIndustryPlaybook, listRegisteredDisputeCategories, listRegisteredComplianceCategories, listRegisteredSupplyCategories, listRegisteredIndustryRuleCategories, listRegisteredPlaybookCategories, } from "./industry-layers.js";
16
16
  export type { DisputeSlaTier, IndustryDisputeRules, ComplianceRules, SupplyRules, IndustryRule, IndustryRuleCondition, IndustryRuleOperator, IndustryRules, IndustryPlaybook, } from "./industry-layers.js";
@@ -1 +1 @@
1
- export{CapabilityRegistry,getCapabilityRegistry,CAPABILITY_MANIFEST_VERSION}from'./capability-manifest.js';export{IndustryModeRegistry,getIndustryModeRegistry,INDUSTRY_MODE_REGISTRY_VERSION}from'./registry.js';export{CustomRegistryFile}from'./custom-registry-file.js';export{MetricRegistry,getMetricRegistry,BUILTIN_METRICS_COUNT}from'./metric-registry.js';export{ConstraintRegistry,getConstraintRegistry,BUILTIN_CONSTRAINTS_COUNT}from'./constraint-registry.js';export{ModeEvaluator}from'./mode-evaluator.js';export{BUILTIN_MODES}from'./modes.js';export{registerIndustryPack,validatePackManifest,listRegisteredPacks,unregisterIndustryPack,scanPacks,rescanPack,resolveIndustryPackDir,scanDefaultIndustryPacks,scaffoldIndustryPack,seedBuiltinIndustryTemplates,seedBuiltinStrategyManuals,diffIndustryPack,resetIndustryPath,readMergedPackIfPresent,buildPristineMergedPack,locatePackAndRemainder,ensureIndustryReadme,industryReadmeContent}from'./industry-pack.js';export{registerDisputeRules,registerComplianceRules,registerSupplyRules,registerIndustryRules,registerIndustryPlaybook,resolveDisputeRules,resolveComplianceRules,resolveSupplyRules,resolveIndustryRules,resolveIndustryPlaybook,listRegisteredDisputeCategories,listRegisteredComplianceCategories,listRegisteredSupplyCategories,listRegisteredIndustryRuleCategories,listRegisteredPlaybookCategories}from'./industry-layers.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'../persona/pack-personae.js';
1
+ export{CapabilityRegistry,getCapabilityRegistry,CAPABILITY_MANIFEST_VERSION}from'./capability-manifest.js';export{IndustryModeRegistry,getIndustryModeRegistry,INDUSTRY_MODE_REGISTRY_VERSION}from'./registry.js';export{CustomRegistryFile}from'./custom-registry-file.js';export{MetricRegistry,getMetricRegistry,BUILTIN_METRICS_COUNT}from'./metric-registry.js';export{ConstraintRegistry,getConstraintRegistry,BUILTIN_CONSTRAINTS_COUNT}from'./constraint-registry.js';export{ModeEvaluator}from'./mode-evaluator.js';export{BUILTIN_MODES}from'./modes.js';export{registerIndustryPack,validatePackManifest,listRegisteredPacks,getRegisteredPack,packKind,unregisterIndustryPack,scanPacks,rescanPack,resolveIndustryPackDir,scanDefaultIndustryPacks,scaffoldIndustryPack,seedBuiltinIndustryTemplates,seedBuiltinStrategyManuals,diffIndustryPack,resetIndustryPath,readMergedPackIfPresent,buildPristineMergedPack,locatePackAndRemainder,ensureIndustryReadme,industryReadmeContent}from'./industry-pack.js';export{registerDisputeRules,registerComplianceRules,registerSupplyRules,registerIndustryRules,registerIndustryPlaybook,resolveDisputeRules,resolveComplianceRules,resolveSupplyRules,resolveIndustryRules,resolveIndustryPlaybook,listRegisteredDisputeCategories,listRegisteredComplianceCategories,listRegisteredSupplyCategories,listRegisteredIndustryRuleCategories,listRegisteredPlaybookCategories}from'./industry-layers.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'../persona/pack-personae.js';
@@ -54,8 +54,14 @@ export interface PackRecord {
54
54
  export declare function validatePackManifest(manifest: IndustryPackManifest): PackValidation;
55
55
  export declare function ensureIndustryProfile(pack: IndustryPack, errors: string[]): void;
56
56
  export declare function registerIndustryPack(pack: IndustryPack, force?: boolean): PackRegistrationResult;
57
+ export declare function packKind(layers: string[]): "full" | "stub";
58
+ export declare function getRegisteredPack(name: string): (PackRecord & {
59
+ name: string;
60
+ }) | undefined;
57
61
  export declare function listRegisteredPacks(): Array<PackRecord & {
58
62
  name: string;
63
+ kind: "full" | "stub";
64
+ product_refs: string[];
59
65
  }>;
60
66
  export declare function unregisterIndustryPack(name: string): boolean;
61
67
  export interface PackDiffResult {