[{"data":1,"prerenderedAt":2300},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Fobstacles":1019,"surround:\u002Fconcepts\u002Fobstacles":2292},[4,21,82,133,154,1010],[5,6,7,8],"Getting started","\u002Fgetting-started","i-lucide-rocket",[9,12,15,18],[10,6,11,11],"What Kaabist is",0,[13,14,11,11],"API keys and modes","keys-and-modes",[16,17,11,11],"Your first job","first-job",[19,20,11,11],"Understanding the envelope","envelope",[22,23,24,25],"Concepts","\u002Fconcepts","i-lucide-book-open",[26,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79],[27,23,11,11],"Overview",[29,30,11,11],"Programs and versions","programs-and-versions",[32,33,11,11],"Tiers and escalation","tiers-and-escalation",[35,36,11,11],"The http tier","http-tier",[38,39,11,11],"The browser tier","browser-tier",[41,42,11,11],"Sessions","sessions",[44,45,11,11],"Human in the loop","human-in-the-loop",[47,48,11,11],"How healing works","self-healing",[50,51,11,11],"Obstacles and captchas","obstacles",[53,54,11,11],"Validation and warnings","validation-and-warnings",[56,57,11,11],"Credits and billing","credits-and-billing",[59,60,11,11],"Limits","limits",[62,63,11,11],"Locators","locators",[65,66,11,11],"Snapshots","snapshots",[68,69,11,11],"Egress and proxies","egress-and-proxies",[71,72,11,11],"Queueing and fairness","queueing",[74,75,11,11],"Accounts, organisations and roles","accounts-and-roles",[77,78,11,11],"Data retention","data-retention",[80,81,11,11],"Documents and PDFs","documents-and-pdfs",[83,84,85,86],"Guides","\u002Fguides","i-lucide-map",[87,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130],[27,84,11,11],[89,90,11,11],"Authenticated flows","authenticated-flows",[92,93,11,11],"Hosted resolve pages","hosted-resolve",[95,96,11,11],"Lists and pagination","lists-and-pagination",[98,99,11,11],"JSON and network locators","json-and-network-locators",[101,102,11,11],"Schedules and change detection","schedules-and-change-detection",[104,105,11,11],"Webhooks","webhooks",[107,108,11,11],"Bring your own providers","byo-providers",[110,111,11,11],"Testing: replay, dry-run and test mode","testing",[113,114,11,11],"Side-effect safety","side-effect-safety",[116,117,11,11],"Security & data handling","security-and-data",[119,120,11,11],"Migrating from other tools","migrating",[122,123,11,11],"Drift detection and canaries","drift-and-canaries",[125,126,11,11],"SDKs","sdks",[128,129,11,11],"The kaab CLI","cli",[131,132,11,11],"Coding agents (MCP)","mcp",[134,135,136,137],"Panel","\u002Fpanel","i-lucide-layout-dashboard",[138,139,142,145,148,151],[27,135,11,11],[140,141,11,11],"The program builder","builder",[143,144,11,11],"Picking and recording","picking-and-recording",[146,147,11,11],"Taking over a job","takeover",[149,150,11,11],"Getting help","support",[152,153,11,11],"Referrals","referrals",[155,156,157,158],"Reference","\u002Freference","i-lucide-library",[159,160,520,834,837,840,1006,1007],[27,156,11,11],[161,162,11,163],"API","api",[164,166,169,212,222,274,297,316,347,376,389,396,403,410,426,447,454],[27,165,11,11],"\u002Freference\u002Fapi",[167,168,11,11],"Interactive reference","explorer",[170,171,11,172],"Jobs","jobs",[173,176,179,182,185,188,191,194,197,200,203,206,209],[174,175,11,11],"Create job","create-job",[177,178,11,11],"List jobs","list-jobs",[180,181,11,11],"Create job batch","create-job-batch",[183,184,11,11],"Estimate job","estimate-job",[186,187,11,11],"Get job","get-job",[189,190,11,11],"List job steps","list-job-steps",[192,193,11,11],"Get job snapshot","get-job-snapshot",[195,196,11,11],"Get job screenshot","get-job-screenshot",[198,199,11,11],"Get job artifact","get-job-artifact",[201,202,11,11],"Submit job input","submit-job-input",[204,205,11,11],"Resume job","resume-job",[207,208,11,11],"Takeover job","takeover-job",[210,211,11,11],"Cancel job","cancel-job",[213,214,11,215],"Batches","batches",[216,219],[217,218,11,11],"Get batch","get-batch",[220,221,11,11],"List batch jobs","list-batch-jobs",[223,224,11,225],"Programs","programs",[226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271],[227,228,11,11],"Create program","create-program",[230,231,11,11],"List programs","list-programs",[233,234,11,11],"Lint program","lint-program",[236,237,11,11],"Get program","get-program",[239,240,11,11],"Update program","update-program",[242,243,11,11],"Delete program","delete-program",[245,246,11,11],"List program versions","list-program-versions",[248,249,11,11],"Create program version","create-program-version",[251,252,11,11],"Update program version","update-program-version",[254,255,11,11],"Delete program version","delete-program-version",[257,258,11,11],"Get program version","get-program-version",[260,261,11,11],"Publish program version","publish-program-version",[263,264,11,11],"Diff program version","diff-program-version",[266,267,11,11],"Replay program version","replay-program-version",[269,270,11,11],"Set program alias","set-program-alias",[272,273,11,11],"Delete program alias","delete-program-alias",[41,42,11,275],[276,279,282,285,288,291,294],[277,278,11,11],"Create session","create-session",[280,281,11,11],"List sessions","list-sessions",[283,284,11,11],"Get session","get-session",[286,287,11,11],"Update session","update-session",[289,290,11,11],"Delete session","delete-session",[292,293,11,11],"Verify session","verify-session",[295,296,11,11],"Refresh session","refresh-session",[298,299,11,300],"Proposals","proposals",[301,304,307,310,313],[302,303,11,11],"List proposals","list-proposals",[305,306,11,11],"Get proposal","get-proposal",[308,309,11,11],"Approve proposal","approve-proposal",[311,312,11,11],"Reject proposal","reject-proposal",[314,315,11,11],"Edit proposal","edit-proposal",[317,318,11,319],"Schedules","schedules",[320,323,326,329,332,335,338,341,344],[321,322,11,11],"Create schedule","create-schedule",[324,325,11,11],"List schedules","list-schedules",[327,328,11,11],"Get schedule","get-schedule",[330,331,11,11],"Update schedule","update-schedule",[333,334,11,11],"Delete schedule","delete-schedule",[336,337,11,11],"Pause schedule","pause-schedule",[339,340,11,11],"Resume schedule","resume-schedule",[342,343,11,11],"List schedule runs","list-schedule-runs",[345,346,11,11],"Get schedule run diff","get-schedule-run-diff",[104,105,11,348],[349,352,355,358,361,364,367,370,373],[350,351,11,11],"Create webhook","create-webhook",[353,354,11,11],"List webhooks","list-webhooks",[356,357,11,11],"Get webhook","get-webhook",[359,360,11,11],"Update webhook","update-webhook",[362,363,11,11],"Delete webhook","delete-webhook",[365,366,11,11],"Rotate webhook secret","rotate-webhook-secret",[368,369,11,11],"List webhook deliveries","list-webhook-deliveries",[371,372,11,11],"Resend webhook delivery","resend-webhook-delivery",[374,375,11,11],"Test webhook","test-webhook",[377,378,11,379],"Organisation","org",[380,383,386],[381,382,11,11],"Rotate org webhook secret","rotate-org-webhook-secret",[384,385,11,11],"Get org","get-org",[387,388,11,11],"Request data deletion","request-data-deletion",[390,391,11,392],"Credits","credits",[393],[394,395,11,11],"Get credits","get-credits",[397,398,11,399],"Ledger","ledger",[400],[401,402,11,11],"List ledger entries","list-ledger-entries",[404,405,11,406],"Usage","usage",[407],[408,409,11,11],"Get usage","get-usage",[411,412,11,413],"API keys","api-keys",[414,417,420,423],[415,416,11,11],"List API keys","list-api-keys",[418,419,11,11],"Create API key","create-api-key",[421,422,11,11],"Rotate API key","rotate-api-key",[424,425,11,11],"Revoke API key","revoke-api-key",[427,108,11,428],"BYO providers",[429,432,435,438,441,444],[430,431,11,11],"List BYO providers","list-byo-providers",[433,434,11,11],"Create BYO provider","create-byo-provider",[436,437,11,11],"Get BYO provider","get-byo-provider",[439,440,11,11],"Update BYO provider","update-byo-provider",[442,443,11,11],"Delete BYO provider","delete-byo-provider",[445,446,11,11],"Test BYO provider","test-byo-provider",[448,449,11,450],"Sites","sites",[451],[452,453,11,11],"Get site profile","get-site-profile",[455,456,11,457],"Objects","schemas",[458,460,463,466,469,470,473,476,479,482,485,487,490,493,496,499,502,505,508,511,514,517],[27,459,11,11],"\u002Freference\u002Fapi\u002Fschemas",[461,462,11,11],"ApiKey","api-key",[464,465,11,11],"Batch","batch",[467,468,11,11],"ByoProvider","byo-provider",[390,391,11,11],[471,472,11,11],"ErrorResponse","error-response",[474,475,11,11],"ExtractSchema","extract-schema",[477,478,11,11],"Job","job",[480,481,11,11],"LedgerEntry","ledger-entry",[483,484,11,11],"LintResult","lint-result",[486,378,11,11],"Org",[488,489,11,11],"Program","program",[491,492,11,11],"ProgramDefinition","program-definition",[494,495,11,11],"ProgramVersion","program-version",[497,498,11,11],"Proposal","proposal",[500,501,11,11],"Schedule","schedule",[503,504,11,11],"Session","session",[506,507,11,11],"SiteProfile","site-profile",[509,510,11,11],"StepRecord","step-record",[512,513,11,11],"Webhook","webhook",[515,516,11,11],"WebhookDelivery","webhook-delivery",[518,519,11,11],"WebhookEvent","webhook-event",[521,522,11,523],"DSL","dsl",[524,526,529,532,535,538,603,637,640,751,754,756],[27,525,11,11],"\u002Freference\u002Fdsl",[527,528,11,11],"Inputs","inputs",[530,531,11,11],"Options","options",[533,534,11,11],"Policies","policies",[536,537,11,11],"Steps","steps",[539,540,11,541],"Actions","actions",[542,544,546,548,550,552,554,556,558,560,562,565,568,570,573,575,577,579,582,585,587,589,591,594,596,598,600],[27,543,11,11],"\u002Freference\u002Fdsl\u002Factions",[545,545,11,11],"fill",[547,547,11,11],"click",[549,549,11,11],"press",[551,551,11,11],"hover",[553,553,11,11],"select",[555,555,11,11],"check",[557,557,11,11],"uncheck",[559,559,11,11],"upload",[561,561,11,11],"scroll",[563,564,11,11],"wait_for","wait-for",[566,567,11,11],"set_session","set-session",[569,569,11,11],"extract",[571,572,11,11],"capture_response","capture-response",[574,574,11,11],"evaluate",[576,576,11,11],"paginate",[578,578,11,11],"download",[580,581,11,11],"read_pdf","read-pdf",[583,584,11,11],"set_vars","set-vars",[586,586,11,11],"sleep",[588,588,11,11],"reload",[590,590,11,11],"goto",[592,593,11,11],"await_input","await-input",[595,595,11,11],"checkpoint",[597,597,11,11],"screenshot",[599,599,11,11],"when",[601,602,11,11],"loop_until","loop-until",[604,605,11,606],"Conditions","conditions",[607,609,611,613,615,617,619,621,623,625,627,629,631,633,635],[27,608,11,11],"\u002Freference\u002Fdsl\u002Fconditions",[610,610,11,11],"url",[612,612,11,11],"title",[614,614,11,11],"visible",[616,616,11,11],"hidden",[618,618,11,11],"exists",[620,620,11,11],"absent",[622,622,11,11],"text",[624,624,11,11],"count",[626,626,11,11],"network",[628,628,11,11],"var",[630,630,11,11],"landmark",[632,632,11,11],"all",[634,634,11,11],"any",[636,636,11,11],"not",[638,639,11,11],"Targets","targets",[641,642,11,643],"Fields","fields",[644,646,649,651,654,656,659,661,663,666,668,671,672,674,677,679,681,683,685,687,690,693,695,698,701,703,704,707,709,712,714,716,718,720,722,724,726,728,731,733,734,736,738,740,743,745,747,749],[27,645,11,11],"\u002Freference\u002Fdsl\u002Ffields",[647,648,11,11],"allow_suffix","allow-suffix",[650,650,11,11],"attr",[652,653,11,11],"base_url","base-url",[655,655,11,11],"candidates",[657,658,11,11],"case_insensitive","case-insensitive",[660,660,11,11],"country",[662,662,11,11],"currency",[664,665,11,11],"date_format","date-format",[667,667,11,11],"decimal",[669,670,11,11],"false_values","false-values",[642,642,11,11],[673,673,11,11],"flags",[675,676,11,11],"follow_redirects","follow-redirects",[678,678,11,11],"frame",[680,680,11,11],"json",[682,682,11,11],"locale",[684,684,11,11],"many",[686,686,11,11],"max",[688,689,11,11],"max_items","max-items",[691,692,11,11],"max_length","max-length",[694,694,11,11],"min",[696,697,11,11],"min_items","min-items",[699,700,11,11],"min_length","min-length",[702,702,11,11],"name",[626,626,11,11],[705,706,11,11],"null_markers","null-markers",[708,708,11,11],"nullable",[710,711,11,11],"on_invalid","on-invalid",[713,713,11,11],"pattern",[715,715,11,11],"presence",[717,717,11,11],"regex",[719,719,11,11],"required",[721,721,11,11],"role",[723,723,11,11],"sample",[725,725,11,11],"selector",[727,727,11,11],"source",[729,730,11,11],"strip_fragment","strip-fragment",[732,732,11,11],"testid",[622,622,11,11],[735,735,11,11],"thousands",[737,737,11,11],"timezone",[739,739,11,11],"transforms",[741,742,11,11],"true_values","true-values",[744,744,11,11],"type",[746,746,11,11],"unique",[748,748,11,11],"values",[750,750,11,11],"xpath",[752,753,11,11],"Assertions","assertions",[755,739,11,11],"Transforms",[757,758,11,759],"Lint codes","lint",[760,762,765,768,771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831],[27,761,11,11],"\u002Freference\u002Fdsl\u002Flint",[763,764,11,11],"E001","e001",[766,767,11,11],"E002","e002",[769,770,11,11],"E003","e003",[772,773,11,11],"E004","e004",[775,776,11,11],"E005","e005",[778,779,11,11],"E006","e006",[781,782,11,11],"E007","e007",[784,785,11,11],"E008","e008",[787,788,11,11],"E009","e009",[790,791,11,11],"E010","e010",[793,794,11,11],"E011","e011",[796,797,11,11],"E012","e012",[799,800,11,11],"E013","e013",[802,803,11,11],"E014","e014",[805,806,11,11],"W001","w001",[808,809,11,11],"W002","w002",[811,812,11,11],"W003","w003",[814,815,11,11],"W004","w004",[817,818,11,11],"W005","w005",[820,821,11,11],"W006","w006",[823,824,11,11],"W007","w007",[826,827,11,11],"W008","w008",[829,830,11,11],"W009","w009",[832,833,11,11],"W010","w010",[835,836,11,11],"Codes","codes",[838,839,11,11],"Events","events",[841,129,11,842],"CLI",[843,845,847,850,853,856,859,862,865,868,871,874,877,880,883,886,889,892,895,898,901,904,907,910,913,916,919,922,925,928,931,934,937,940,943,946,949,952,955,958,961,964,967,970,973,976,979,982,985,988,991,994,997,1000,1003],[27,844,11,11],"\u002Freference\u002Fcli",[846,846,11,11],"kaab",[848,849,11,11],"kaab auth","kaab-auth",[851,852,11,11],"kaab auth login","kaab-auth-login",[854,855,11,11],"kaab auth logout","kaab-auth-logout",[857,858,11,11],"kaab auth status","kaab-auth-status",[860,861,11,11],"kaab completion","kaab-completion",[863,864,11,11],"kaab completion bash","kaab-completion-bash",[866,867,11,11],"kaab completion fish","kaab-completion-fish",[869,870,11,11],"kaab completion powershell","kaab-completion-powershell",[872,873,11,11],"kaab completion zsh","kaab-completion-zsh",[875,876,11,11],"kaab credits","kaab-credits",[878,879,11,11],"kaab jobs","kaab-jobs",[881,882,11,11],"kaab jobs cancel","kaab-jobs-cancel",[884,885,11,11],"kaab jobs get","kaab-jobs-get",[887,888,11,11],"kaab jobs input","kaab-jobs-input",[890,891,11,11],"kaab jobs list","kaab-jobs-list",[893,894,11,11],"kaab jobs resume","kaab-jobs-resume",[896,897,11,11],"kaab jobs run","kaab-jobs-run",[899,900,11,11],"kaab jobs snapshot","kaab-jobs-snapshot",[902,903,11,11],"kaab jobs steps","kaab-jobs-steps",[905,906,11,11],"kaab jobs takeover","kaab-jobs-takeover",[908,909,11,11],"kaab open","kaab-open",[911,912,11,11],"kaab open job","kaab-open-job",[914,915,11,11],"kaab programs","kaab-programs",[917,918,11,11],"kaab programs alias","kaab-programs-alias",[920,921,11,11],"kaab programs alias set","kaab-programs-alias-set",[923,924,11,11],"kaab programs diff","kaab-programs-diff",[926,927,11,11],"kaab programs lint","kaab-programs-lint",[929,930,11,11],"kaab programs list","kaab-programs-list",[932,933,11,11],"kaab programs pull","kaab-programs-pull",[935,936,11,11],"kaab programs push","kaab-programs-push",[938,939,11,11],"kaab proposals","kaab-proposals",[941,942,11,11],"kaab proposals approve","kaab-proposals-approve",[944,945,11,11],"kaab proposals list","kaab-proposals-list",[947,948,11,11],"kaab proposals reject","kaab-proposals-reject",[950,951,11,11],"kaab proposals show","kaab-proposals-show",[953,954,11,11],"kaab schedules","kaab-schedules",[956,957,11,11],"kaab schedules create","kaab-schedules-create",[959,960,11,11],"kaab schedules list","kaab-schedules-list",[962,963,11,11],"kaab schedules pause","kaab-schedules-pause",[965,966,11,11],"kaab schedules resume","kaab-schedules-resume",[968,969,11,11],"kaab schedules runs","kaab-schedules-runs",[971,972,11,11],"kaab sessions","kaab-sessions",[974,975,11,11],"kaab sessions create","kaab-sessions-create",[977,978,11,11],"kaab sessions delete","kaab-sessions-delete",[980,981,11,11],"kaab sessions list","kaab-sessions-list",[983,984,11,11],"kaab sessions verify","kaab-sessions-verify",[986,987,11,11],"kaab usage","kaab-usage",[989,990,11,11],"kaab version","kaab-version",[992,993,11,11],"kaab webhooks","kaab-webhooks",[995,996,11,11],"kaab webhooks create","kaab-webhooks-create",[998,999,11,11],"kaab webhooks deliveries","kaab-webhooks-deliveries",[1001,1002,11,11],"kaab webhooks list","kaab-webhooks-list",[1004,1005,11,11],"kaab webhooks test","kaab-webhooks-test",[125,126,11,11],[1008,1009,11,11],"Plans and pricing","plans",[1011,1012,1013,1014],"Changelog","\u002Fchangelog","i-lucide-history",[1015,1016],[27,1012,11,11],[1017,1018,11,11],"Deprecations","deprecations",{"id":1020,"title":50,"body":1021,"breaking":2282,"date":2283,"description":2284,"extension":2285,"generated":2282,"meta":2286,"navigation":2287,"path":2288,"seo":2289,"stem":2290,"version":2283,"__hash__":2291},"docs\u002F2.concepts\u002F08.obstacles.md",{"type":1022,"value":1023,"toc":2266},"minimark",[1024,1028,1033,1054,1073,1077,1088,1092,1095,1163,1170,1263,1273,1277,1303,1313,1408,1411,1415,1422,1508,1511,1516,1519,1572,1618,1622,1654,1658,1661,1696,1699,1748,1755,1759,1769,1780,1784,1789,1845,1855,1875,1879,1882,1902,2022,2075,2085,2121,2154,2158,2204,2207,2262],[1025,1026,1027],"p",{},"An obstacle is anything painted over the element a step wants: a cookie banner, an announcement dialog, a product tour, a toast. Kaabist detects it, closes it the way a person would, checks that it is gone, and tells you what it did, so a program does not need a step for every overlay a site might show.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1040,1041,1045,1046,1049,1050,1053],{},"The obstacle layer is always on in the browser tiers. You configure it when a site needs something different from the defaults: an overlay that is part of the page and must be left alone (",[1037,1038,1039],"code",{},"options.obstacles.ignore","), a modal that ",[1042,1043,1044],"em",{},"is"," the page and must never be painted over (",[1037,1047,1048],{},"options.obstacles.allow_hide: false","), or a captcha policy other than parking (",[1037,1051,1052],{},"policies.captcha",").",[1025,1055,1056,1057,1060,1061,1064,1065,1068,1069,1072],{},"Read this page when a result carries an ",[1037,1058,1059],{},"obstacle_dismissed"," warning, when a job parks with the reason ",[1037,1062,1063],{},"obstacle"," or ",[1037,1066,1067],{},"captcha",", or when the review queue offers a ",[1037,1070,1071],{},"dismiss"," proposal.",[1029,1074,1076],{"id":1075},"when-it-runs","When it runs",[1025,1078,1079,1080,1082,1083,1082,1085,1087],{},"Before every element action (",[1037,1081,547],{},", ",[1037,1084,545],{},[1037,1086,551],{}," and the rest), and whenever a step fails because its target is covered, Kaabist looks at what is in the way. A step that cannot click a button because something sits on top of it is the most common way an otherwise correct program fails, so this is treated as a normal situation rather than an error.",[1029,1089,1091],{"id":1090},"what-counts-as-an-obstacle","What counts as an obstacle",[1025,1093,1094],{},"Four detectors run inside the page, and anything found by any of them is a candidate:",[1096,1097,1098,1119,1137,1157],"ol",{},[1099,1100,1101,1105,1106,1082,1109,1082,1112,1082,1115,1118],"li",{},[1102,1103,1104],"strong",{},"Semantics",": ",[1037,1107,1108],{},"role=\"dialog\"",[1037,1110,1111],{},"role=\"alertdialog\"",[1037,1113,1114],{},"aria-modal=\"true\"",[1037,1116,1117],{},"\u003Cdialog open>",".",[1099,1120,1121,1124,1125,1128,1129,1132,1133,1136],{},[1102,1122,1123],{},"Geometry",": a fixed, sticky or absolutely positioned element that covers at least ",[1102,1126,1127],{},"40 %"," of the viewport, or that sits over the exact point your step was aiming at, and that is either stacked above ",[1037,1130,1131],{},"z-index: 100"," or accompanied by a ",[1037,1134,1135],{},"\u003Cbody>"," that has stopped scrolling.",[1099,1138,1139,1142,1143,1082,1146,1149,1150,1082,1153,1156],{},[1102,1140,1141],{},"Markers",": the frameworks that name themselves. Consent: OneTrust, Cookiebot, Didomi, Usercentrics, Osano, Quantcast, TrustArc, Sourcepoint, cookieconsent, Klaro, Axeptio, CookieYes, Complianz, Borlabs, and the common generic ids and classes (",[1037,1144,1145],{},"#cookie-banner",[1037,1147,1148],{},".cookie-consent",", …). Tours: driver.js, Shepherd, intro.js, react-joyride, Hopscotch, reactour. Toasts: ",[1037,1151,1152],{},"[role=alert]",[1037,1154,1155],{},"[role=status]",", react-toastify, Sonner, MUI Snackbar, Notyf.",[1099,1158,1159,1162],{},[1102,1160,1161],{},"The hit test",": whatever the browser says is actually painted at the point of your target.",[1025,1164,1165,1166,1169],{},"Each obstacle comes back with a ",[1102,1167,1168],{},"kind",", how much of the viewport it covers, whether it is over your target, and every button inside it that might make it go away:",[1171,1172,1173,1185],"table",{},[1174,1175,1176],"thead",{},[1177,1178,1179,1182],"tr",{},[1180,1181,1168],"th",{},[1180,1183,1184],{},"what it is",[1186,1187,1188,1199,1209,1219,1229,1239,1249],"tbody",{},[1177,1189,1190,1196],{},[1191,1192,1193],"td",{},[1037,1194,1195],{},"dialog",[1191,1197,1198],{},"a modal dialog",[1177,1200,1201,1206],{},[1191,1202,1203],{},[1037,1204,1205],{},"consent",[1191,1207,1208],{},"a cookie or privacy banner, or a consent wall",[1177,1210,1211,1216],{},[1191,1212,1213],{},[1037,1214,1215],{},"tour",[1191,1217,1218],{},"an onboarding or product tour",[1177,1220,1221,1226],{},[1191,1222,1223],{},[1037,1224,1225],{},"toast",[1191,1227,1228],{},"a notification stack",[1177,1230,1231,1236],{},[1191,1232,1233],{},[1037,1234,1235],{},"overlay",[1191,1237,1238],{},"a covering layer that is none of the above",[1177,1240,1241,1246],{},[1191,1242,1243],{},[1037,1244,1245],{},"unknown",[1191,1247,1248],{},"something covers the target and nothing more can be said about it",[1177,1250,1251,1256],{},[1191,1252,1253],{},[1037,1254,1255],{},"busy",[1191,1257,1258,1259,1262],{},"a loading overlay: a spinner, a block-UI layer, an ",[1037,1260,1261],{},"aria-busy"," element",[1025,1264,1265,1266,1268,1269,1272],{},"A ",[1037,1267,1255],{}," overlay is ",[1102,1270,1271],{},"waited for",", never dismissed: the step waits until it goes away by itself, within the step's timeout, and the wait does not count toward the guards below.",[1029,1274,1276],{"id":1275},"which-button-and-in-what-order","Which button, and in what order",[1025,1278,1279,1280,1283,1284,1082,1287,1082,1290,1082,1293,1082,1296,1082,1299,1302],{},"A button's label is read against the ",[1102,1281,1282],{},"dismiss dictionary",": nearly three hundred phrases in sixteen languages (English, Turkish, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Arabic, Japanese, Chinese, Korean, Swedish, Czech) plus the symbols close icons use (",[1037,1285,1286],{},"×",[1037,1288,1289],{},"✕",[1037,1291,1292],{},"✖",[1037,1294,1295],{},"✗",[1037,1297,1298],{},"⨯",[1037,1300,1301],{},"X","). The dictionary is data, not code: it grows when somebody takes over a job and clicks their way out of an overlay Kaabist did not recognise, site by site, and a phrase that three different sites have taught becomes part of everyone's dictionary.",[1025,1304,1305,1306,1309,1310,1312],{},"Labels are read from the button's text, its ",[1037,1307,1308],{},"aria-label"," and its ",[1037,1311,612],{},", and each is sorted into one of six kinds. The order is what a person would do:",[1171,1314,1315,1327],{},[1174,1316,1317],{},[1177,1318,1319,1321,1324],{},[1180,1320,1168],{},[1180,1322,1323],{},"example",[1180,1325,1326],{},"what it costs you",[1186,1328,1329,1342,1355,1367,1379,1395],{},[1177,1330,1331,1336,1339],{},[1191,1332,1333],{},[1037,1334,1335],{},"close",[1191,1337,1338],{},"Close, Kapat, Schließen, 閉じる",[1191,1340,1341],{},"nothing",[1177,1343,1344,1349,1352],{},[1191,1345,1346],{},[1037,1347,1348],{},"reject",[1191,1350,1351],{},"Reject all, Tümünü reddet, Alle ablehnen",[1191,1353,1354],{},"refuses tracking on your behalf",[1177,1356,1357,1362,1365],{},[1191,1358,1359],{},[1037,1360,1361],{},"later",[1191,1363,1364],{},"Not now, Daha sonra, Später",[1191,1366,1341],{},[1177,1368,1369,1374,1377],{},[1191,1370,1371],{},[1037,1372,1373],{},"skip",[1191,1375,1376],{},"Skip, Atla, Überspringen",[1191,1378,1341],{},[1177,1380,1381,1386,1389],{},[1191,1382,1383],{},[1037,1384,1385],{},"accept",[1191,1387,1388],{},"Accept all cookies, Tümünü kabul et",[1191,1390,1391,1394],{},[1102,1392,1393],{},"agrees"," on your behalf",[1177,1396,1397,1402,1405],{},[1191,1398,1399],{},[1037,1400,1401],{},"next",[1191,1403,1404],{},"Next, Sonraki, 次へ",[1191,1406,1407],{},"nothing, and it is never clicked",[1025,1409,1410],{},"An unlabelled control is scored by where it sits: a small button in the obstacle's top-right corner is a close icon on nearly every site, and one in the middle of a dialog is a call to action.",[1029,1412,1414],{"id":1413},"the-resolution-order","The resolution order",[1025,1416,1417,1418,1421],{},"Rungs are tried in order, and ",[1102,1419,1420],{},"each one is verified before the next is tried",": the overlay has to be gone, or your target has to be reachable again, within 1.5 seconds. \"The click did not throw\" is not success.",[1096,1423,1424,1437,1446,1471,1479,1485,1495],{},[1099,1425,1426,1429,1430,1432,1433,1436],{},[1102,1427,1428],{},"A recipe you approved."," If somebody in your organisation approved a ",[1037,1431,1071],{}," proposal for this site with ",[1102,1434,1435],{},"remember for this site",", that recipe runs first. This is the fast path: one click, no guessing.",[1099,1438,1439,1442,1443,1445],{},[1102,1440,1441],{},"ARIA."," A control inside the obstacle whose ",[1037,1444,1308],{}," says it closes: the page telling Kaabist in its own words.",[1099,1447,1448,1451,1452,1082,1454,1082,1456,1064,1458,1460,1461,1466,1467,1470],{},[1102,1449,1450],{},"The dictionary."," The best-scoring ",[1037,1453,1335],{},[1037,1455,1348],{},[1037,1457,1361],{},[1037,1459,1373],{}," control. ",[1102,1462,1463,1465],{},[1037,1464,1385],{}," is used only for a consent banner that offers nothing else",", and when it happens the warning carries the detail ",[1037,1468,1469],{},"accepted_consent",", so you can see that a consent decision was made for you.",[1099,1472,1473,1478],{},[1102,1474,1475],{},[1037,1476,1477],{},"Escape",", on the document.",[1099,1480,1481,1484],{},[1102,1482,1483],{},"A backdrop click",", at a point inside the dimmer and outside the dialog.",[1099,1486,1487,1490,1491,1494],{},[1102,1488,1489],{},"Hiding",", with an injected ",[1037,1492,1493],{},"\u003Cstyle>","; see the gating rule below.",[1099,1496,1497,1500,1501,1504,1505,1507],{},[1102,1498,1499],{},"Parking."," The job stops as ",[1037,1502,1503],{},"needs_attention"," with the reason ",[1037,1506,1063],{},", a screenshot, and one proposal per button nobody tried, so approving one makes the next run automatic.",[1025,1509,1510],{},"After a successful dismissal the page is looked at again, because obstacles come in sequences: a consent wall in front of a tour that only starts once consent is given. A second overlay is dealt with when it covers your target or at least 40 % of the viewport.",[1512,1513,1515],"h3",{"id":1514},"what-it-reports","What it reports",[1025,1517,1518],{},"A step that dismissed something carries one warning, naming the rung that finished the job:",[1520,1521,1525],"pre",{"className":1522,"code":1523,"language":680,"meta":1524,"style":1524},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{ \"code\": \"obstacle_dismissed\", \"step\": \"steps[1]\", \"detail\": \"dictionary\" }\n","",[1037,1526,1527],{"__ignoreMap":1524},[1528,1529,1532,1536,1540,1544,1548,1551,1554,1556,1559,1561,1564,1566,1569],"span",{"class":1530,"line":1531},"line",1,[1528,1533,1535],{"class":1534},"sTzsn","{ ",[1528,1537,1539],{"class":1538},"sqn18","\"code\"",[1528,1541,1543],{"class":1542},"sQm2-",":",[1528,1545,1547],{"class":1546},"suOy4"," \"obstacle_dismissed\"",[1528,1549,1550],{"class":1542},",",[1528,1552,1553],{"class":1538}," \"step\"",[1528,1555,1543],{"class":1542},[1528,1557,1558],{"class":1546}," \"steps[1]\"",[1528,1560,1550],{"class":1542},[1528,1562,1563],{"class":1538}," \"detail\"",[1528,1565,1543],{"class":1542},[1528,1567,1568],{"class":1546}," \"dictionary\"",[1528,1570,1571],{"class":1534}," }\n",[1025,1573,1574,1577,1578,1082,1581,1082,1584,1082,1587,1082,1590,1082,1593,1596,1597,1599,1600,1603,1604,1606,1607,1609,1610,1613,1614,1617],{},[1037,1575,1576],{},"detail"," is the rung (",[1037,1579,1580],{},"recipe",[1037,1582,1583],{},"aria",[1037,1585,1586],{},"dictionary",[1037,1588,1589],{},"escape",[1037,1591,1592],{},"backdrop",[1037,1594,1595],{},"hide","), or ",[1037,1598,1469],{}," when a consent banner had to be accepted. The step's record in ",[1037,1601,1602],{},"GET \u002Fv1\u002Fjobs\u002F{id}\u002Fsteps"," has an ",[1037,1605,1063],{}," object with the whole story: what was detected, its ",[1037,1608,1168],{},", whether it was resolved, ",[1037,1611,1612],{},"how",", the label of the control that was clicked (",[1037,1615,1616],{},"control_text","), the locators of the overlay's root, and how many rungs were tried.",[1512,1619,1621],{"id":1620},"how-kaabist-learns-a-site","How Kaabist learns a site",[1025,1623,1624,1625,1627,1628,1630,1631,1634,1635,1638,1639,1064,1642,1645,1646,1649,1650,1653],{},"A dismissal by ARIA, the dictionary, ",[1037,1626,1477],{}," or hiding files a ",[1037,1629,1071],{}," proposal: the overlay (",[1037,1632,1633],{},"payload.obstacle","), what closed it (",[1037,1636,1637],{},"payload.action",", such as ",[1037,1640,1641],{},"{ \"click\": [ … ] }",[1037,1643,1644],{},"{ \"press\": \"Escape\" }","), and the ",[1037,1647,1648],{},"hostname",". Approving it with ",[1037,1651,1652],{},"remember: \"site\""," turns it into a recipe on your organisation's site profile, and the next job on that hostname closes the overlay at rung 1. A backdrop click is never proposed: it is a point on the screen, and the same overlay on a wider window has a different one. The same proposal is filed at most once a day per site and action, so a busy schedule does not fill your review queue.",[1029,1655,1657],{"id":1656},"when-kaabist-will-hide-something-and-when-it-will-not","When Kaabist will hide something, and when it will not",[1025,1659,1660],{},"Hiding does not dismiss an overlay, it paints over it, so it is last, and it is gated by kind:",[1662,1663,1664,1677],"ul",{},[1099,1665,1666,1667,1082,1669,1082,1671,1673,1674,1676],{},"Always allowed for ",[1037,1668,1235],{},[1037,1670,1225],{},[1037,1672,1215],{}," and ",[1037,1675,1245],{},". None of those carries a decision.",[1099,1678,1679,1680,1673,1682,1684,1685,1688,1689,1692,1693,1695],{},"For ",[1037,1681,1195],{},[1037,1683,1205],{},", allowed only while ",[1037,1686,1687],{},"options.obstacles.allow_hide"," is on. It is on by default. Set it to ",[1037,1690,1691],{},"false"," for a page whose modal ",[1102,1694,1044],{}," the page (an age gate, a paywall, a terms dialog), and the job will park and ask a person instead of continuing behind it.",[1025,1697,1698],{},"You can also tell Kaabist to leave something alone:",[1520,1700,1702],{"className":1522,"code":1701,"language":680,"meta":1524,"style":1524},"{ \"options\": { \"obstacles\": { \"allow_hide\": false, \"ignore\": [\"#support-bubble\"] } } }\n",[1037,1703,1704],{"__ignoreMap":1524},[1528,1705,1706,1708,1711,1713,1716,1719,1721,1723,1726,1728,1732,1734,1737,1739,1742,1745],{"class":1530,"line":1531},[1528,1707,1535],{"class":1534},[1528,1709,1710],{"class":1538},"\"options\"",[1528,1712,1543],{"class":1542},[1528,1714,1715],{"class":1534}," { ",[1528,1717,1718],{"class":1538},"\"obstacles\"",[1528,1720,1543],{"class":1542},[1528,1722,1715],{"class":1534},[1528,1724,1725],{"class":1538},"\"allow_hide\"",[1528,1727,1543],{"class":1542},[1528,1729,1731],{"class":1730},"sHJIl"," false",[1528,1733,1550],{"class":1542},[1528,1735,1736],{"class":1538}," \"ignore\"",[1528,1738,1543],{"class":1542},[1528,1740,1741],{"class":1534}," [",[1528,1743,1744],{"class":1546},"\"#support-bubble\"",[1528,1746,1747],{"class":1534},"] } } }\n",[1025,1749,1750,1751,1754],{},"An element matching an ",[1037,1752,1753],{},"ignore"," selector (at most 20) is never reported as an obstacle and never clicked.",[1029,1756,1758],{"id":1757},"guards","Guards",[1025,1760,1761,1762,1765,1766,1543],{},"A site that re-renders its banner after every dismissal would otherwise spend a whole job clicking the same button and succeeding every time. Three limits stop that, and passing any of them parks the job as ",[1037,1763,1764],{},"needs_attention: obstacle"," with the detail ",[1037,1767,1768],{},"loop_guard",[1662,1770,1771,1774,1777],{},[1099,1772,1773],{},"three clicks on one obstacle,",[1099,1775,1776],{},"three obstacles in one step,",[1099,1778,1779],{},"ten dismissals in one job.",[1029,1781,1783],{"id":1782},"captchas","Captchas",[1025,1785,1786,1788],{},[1037,1787,1052],{}," decides what a captcha means for your program:",[1171,1790,1791,1801],{},[1174,1792,1793],{},[1177,1794,1795,1798],{},[1180,1796,1797],{},"policy",[1180,1799,1800],{},"what happens",[1186,1802,1803,1819,1832],{},[1177,1804,1805,1811],{},[1191,1806,1807,1810],{},[1037,1808,1809],{},"park"," (default)",[1191,1812,1813,1814,1504,1816,1818],{},"the job parks as ",[1037,1815,1503],{},[1037,1817,1067],{},", so a person can finish it",[1177,1820,1821,1826],{},[1191,1822,1823],{},[1037,1824,1825],{},"fail",[1191,1827,1828,1829],{},"the job fails at once with ",[1037,1830,1831],{},"blocked",[1177,1833,1834,1839],{},[1191,1835,1836],{},[1037,1837,1838],{},"solve",[1191,1840,1841,1842],{},"a captcha provider is asked for a token, at ",[1102,1843,1844],{},"two credits per solve",[1025,1846,1847,1848,1851,1852,1854],{},"Kaabist recognises reCAPTCHA (v2, v3 and invisible), hCaptcha, Turnstile, GeeTest and FunCaptcha\u002FArkose by their widget attributes and script URLs, never by prose, so a page that ",[1042,1849,1850],{},"writes about"," reCAPTCHA is not treated as one. Under ",[1037,1853,1838],{},", the credits are charged before the provider is asked, the token is written into the field the vendor uses, the page's own callback is invoked, and the failed step is run again once.",[1025,1856,1857,1858,1861,1862,1867,1868,1064,1871,1874],{},"Everything that can go wrong with the platform's solver ",[1102,1859,1860],{},"parks",": no provider configured, not enough credits, a provider that timed out (two minutes), or a second challenge on the same step after a solved one. A captcha is the one obstacle a person can always get past, so stopping to ask is the right answer. If you ",[1863,1864,1866],"a",{"href":1865},"\u002Fguides\u002Fbyo-providers","bring your own solver"," and it refuses your key or runs out of balance, the job fails with ",[1037,1869,1870],{},"byo_captcha_auth_failed",[1037,1872,1873],{},"byo_captcha_balance"," instead, because that is something only you can fix, and its solves are not billed by Kaabist.",[1029,1876,1878],{"id":1877},"worked-example","Worked example",[1025,1880,1881],{},"Three situations show the layer at work. Each run needs a browser tier.",[1025,1883,1884,1887,1888,1891,1892,1894,1895,1673,1898,1901],{},[1102,1885,1886],{},"A consent wall in front of a dialog."," A product page at ",[1037,1889,1890],{},"https:\u002F\u002Fshop.example.com\u002Fp\u002F1"," shows a full-screen consent wall (",[1037,1893,1145],{},", buttons ",[1042,1896,1897],{},"Accept all",[1042,1899,1900],{},"Reject",") and, 300 ms after load, an announcement dialog behind it. A program that clicks the price:",[1520,1903,1905],{"className":1522,"code":1904,"language":680,"meta":1524,"style":1524},"{\n  \"kaab\": \"1\",\n  \"options\": { \"max_tier\": \"browser\" },\n  \"steps\": [\n    { \"goto\": \"https:\u002F\u002Fshop.example.com\u002Fp\u002F1\" },\n    { \"sleep\": 600 },\n    { \"click\": \".price\" }\n  ]\n}\n",[1037,1906,1907,1912,1926,1949,1960,1978,1995,2010,2016],{"__ignoreMap":1524},[1528,1908,1909],{"class":1530,"line":1531},[1528,1910,1911],{"class":1534},"{\n",[1528,1913,1915,1918,1920,1923],{"class":1530,"line":1914},2,[1528,1916,1917],{"class":1538},"  \"kaab\"",[1528,1919,1543],{"class":1542},[1528,1921,1922],{"class":1546}," \"1\"",[1528,1924,1925],{"class":1542},",\n",[1528,1927,1929,1932,1934,1936,1939,1941,1944,1947],{"class":1530,"line":1928},3,[1528,1930,1931],{"class":1538},"  \"options\"",[1528,1933,1543],{"class":1542},[1528,1935,1715],{"class":1534},[1528,1937,1938],{"class":1538},"\"max_tier\"",[1528,1940,1543],{"class":1542},[1528,1942,1943],{"class":1546}," \"browser\"",[1528,1945,1946],{"class":1534}," }",[1528,1948,1925],{"class":1542},[1528,1950,1952,1955,1957],{"class":1530,"line":1951},4,[1528,1953,1954],{"class":1538},"  \"steps\"",[1528,1956,1543],{"class":1542},[1528,1958,1959],{"class":1534}," [\n",[1528,1961,1963,1966,1969,1971,1974,1976],{"class":1530,"line":1962},5,[1528,1964,1965],{"class":1534},"    { ",[1528,1967,1968],{"class":1538},"\"goto\"",[1528,1970,1543],{"class":1542},[1528,1972,1973],{"class":1546}," \"https:\u002F\u002Fshop.example.com\u002Fp\u002F1\"",[1528,1975,1946],{"class":1534},[1528,1977,1925],{"class":1542},[1528,1979,1981,1983,1986,1988,1991,1993],{"class":1530,"line":1980},6,[1528,1982,1965],{"class":1534},[1528,1984,1985],{"class":1538},"\"sleep\"",[1528,1987,1543],{"class":1542},[1528,1989,1990],{"class":1730}," 600",[1528,1992,1946],{"class":1534},[1528,1994,1925],{"class":1542},[1528,1996,1998,2000,2003,2005,2008],{"class":1530,"line":1997},7,[1528,1999,1965],{"class":1534},[1528,2001,2002],{"class":1538},"\"click\"",[1528,2004,1543],{"class":1542},[1528,2006,2007],{"class":1546}," \".price\"",[1528,2009,1571],{"class":1534},[1528,2011,2013],{"class":1530,"line":2012},8,[1528,2014,2015],{"class":1534},"  ]\n",[1528,2017,2019],{"class":1530,"line":2018},9,[1528,2020,2021],{"class":1534},"}\n",[1025,2023,2024,2025,2027,2028,2031,2032,2034,2035,2037,2038,2040,2041,2043,2044,2046,2047,2050,2051,2054,2055,2057,2058,1082,2061,1082,2064,2067,2068,2070,2071,2074],{},"The ",[1037,2026,547],{}," finds ",[1037,2029,2030],{},".price"," covered. The layer detects the wall as ",[1037,2033,1205],{}," by its marker and clicks ",[1042,2036,1900],{},": the dictionary prefers ",[1037,2039,1348],{}," to ",[1037,2042,1385],{},", so no consent was given on your behalf and there is no ",[1037,2045,1469],{}," detail. It looks again, finds the dialog now in front of the price, and closes it with its ",[1042,2048,2049],{},"Anladım"," (\"Got it\") button. The job succeeds with one warning, ",[1037,2052,2053],{},"{ \"code\": \"obstacle_dismissed\", \"step\": \"steps[2]\", \"detail\": \"dictionary\" }",". The step record's ",[1037,2056,1063],{}," names the last thing it dealt with, ",[1037,2059,2060],{},"kind: \"dialog\"",[1037,2062,2063],{},"resolved: true",[1037,2065,2066],{},"how: \"dictionary\"",", two attempts, and the review queue has two ",[1037,2069,1071],{}," proposals, one for the wall and one for the dialog, each with ",[1037,2072,2073],{},"source: \"heuristic\""," and a confidence of 0.85.",[1025,2076,2077,2078,2080,2081,2084],{},"Approve both with ",[1037,2079,1652],{}," and the next job on that hostname closes each overlay by recipe, with ",[1037,2082,2083],{},"detail: \"recipe\"",", and files nothing new.",[1025,2086,2087,2090,2091,2094,2095,1673,2098,2101,2102,2105,2106,2108,2109,2111,2112,2114,2115,1673,2118,1118],{},[1102,2088,2089],{},"A product tour."," The app at ",[1037,2092,2093],{},"https:\u002F\u002Fapp.example.com"," opens a driver.js-style three-step tour over its product list, with ",[1042,2096,2097],{},"Next",[1042,2099,2100],{},"Skip",". A step that clicks ",[1037,2103,2104],{},"#total"," finds it covered; the tour is detected by its marker as ",[1037,2107,1215],{},", and the layer clicks ",[1042,2110,2100],{},", never ",[1042,2113,2097],{},". The step record shows ",[1037,2116,2117],{},"kind: \"tour\"",[1037,2119,2120],{},"control_text: \"Skip\"",[1025,2122,2123,2126,2127,2130,2131,1673,2134,2137,2138,2141,2142,2145,2146,2150,2151,2153],{},[1102,2124,2125],{},"When it parks."," A page can also show a dialog whose only way out is an unlabelled glyph. With ",[1037,2128,2129],{},"\"options\": { \"obstacles\": { \"allow_hide\": false } }",", no rung can close it and hiding is forbidden, so the job parks with ",[1037,2132,2133],{},"status: \"needs_attention\"",[1037,2135,2136],{},"reason: \"obstacle\"",", a screenshot in ",[1037,2139,2140],{},"attention.screenshot",", and a proposal per control nobody tried. You can apply one with ",[1037,2143,2144],{},"POST \u002Fv1\u002Fjobs\u002F{id}\u002Fresume",", or ",[1863,2147,2149],{"href":2148},"\u002Fpanel\u002Ftakeover","take over"," the job and close it yourself; what you click becomes a ",[1037,2152,1071],{}," proposal for the next run.",[1029,2155,2157],{"id":2156},"pitfalls","Pitfalls",[1662,2159,2160,2172,2184,2192,2198],{},[1099,2161,2162,2167,2168,2171],{},[1102,2163,2164,2165,1118],{},"Look for ",[1037,2166,1469],{}," If a site's banner offers only ",[1042,2169,2170],{},"Accept",", Kaabist accepts it to continue, and says so. If agreeing is not acceptable for your use, treat a result with that detail as a failure in your own code, or deal with the banner in an explicit step of your program.",[1099,2173,2174,2180,2181,2183],{},[1102,2175,2176,2179],{},[1037,2177,2178],{},"allow_hide"," defaults to on."," A paywall or an age gate is a ",[1037,2182,1195],{}," too; turn hiding off for programs where the modal's content matters.",[1099,2185,2186,2189,2190,1118],{},[1102,2187,2188],{},"Ignore furniture."," A chat bubble or a sticky header that sits over a target will be dismissed every run unless you list it in ",[1037,2191,1753],{},[1099,2193,2194,2197],{},[1102,2195,2196],{},"A loop guard means the site fights back."," Three dismissals of the same overlay usually mean the site re-renders it on purpose. Approve a recipe, or take over once and let the recording teach the site.",[1099,2199,2200,2203],{},[1102,2201,2202],{},"The http tier has no overlays to close."," It reads the HTML the server sent; there is nothing painted over it. Obstacles matter only once a job runs in a browser.",[1029,2205,155],{"id":2206},"reference",[1662,2208,2209,2223,2237,2243,2253],{},[1099,2210,2211,1673,2218],{},[1863,2212,2214,2217],{"href":2213},"\u002Freference\u002Fdsl\u002Foptions",[1037,2215,2216],{},"options.obstacles"," and other options",[1863,2219,2221],{"href":2220},"\u002Freference\u002Fdsl\u002Fpolicies",[1037,2222,1052],{},[1099,2224,2225,1082,2229,1082,2233],{},[1863,2226,2228],{"href":2227},"\u002Freference\u002Fapi\u002Fjobs\u002Flist-job-steps","Steps of a job",[1863,2230,2232],{"href":2231},"\u002Freference\u002Fapi\u002Fjobs\u002Fresume-job","resume a job",[1863,2234,2236],{"href":2235},"\u002Freference\u002Fapi\u002Fjobs\u002Ftakeover-job","take over a job",[1099,2238,2239],{},[1863,2240,2242],{"href":2241},"\u002Freference\u002Fapi\u002Fproposals\u002Fapprove-proposal","Approve a proposal",[1099,2244,2245,1673,2249],{},[1863,2246,2248],{"href":2247},"\u002Freference\u002Fcodes#attention-reasons","Attention reasons",[1863,2250,2252],{"href":2251},"\u002Freference\u002Fcodes#warnings","warning codes",[1099,2254,2255,2258,2259,2261],{},[1863,2256,47],{"href":2257},"\u002Fconcepts\u002Fself-healing",": the review queue that ",[1037,2260,1071],{}," proposals share with relocations",[2263,2264,2265],"style",{},"html pre.shiki code .sTzsn, html code.shiki .sTzsn{--shiki-light:var(--kaab-code-foreground);--shiki-default:var(--kaab-code-foreground);--shiki-dark:var(--kaab-code-foreground)}html pre.shiki code .sqn18, html code.shiki .sqn18{--shiki-light:var(--kaab-code-token-keyword);--shiki-default:var(--kaab-code-token-keyword);--shiki-dark:var(--kaab-code-token-keyword)}html pre.shiki code .sQm2-, html code.shiki .sQm2-{--shiki-light:var(--kaab-code-token-punctuation);--shiki-default:var(--kaab-code-token-punctuation);--shiki-dark:var(--kaab-code-token-punctuation)}html pre.shiki code .suOy4, html code.shiki .suOy4{--shiki-light:var(--kaab-code-token-string-expression);--shiki-default:var(--kaab-code-token-string-expression);--shiki-dark:var(--kaab-code-token-string-expression)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHJIl, html code.shiki .sHJIl{--shiki-light:var(--kaab-code-token-constant);--shiki-default:var(--kaab-code-token-constant);--shiki-dark:var(--kaab-code-token-constant)}",{"title":1524,"searchDepth":1928,"depth":1928,"links":2267},[2268,2269,2270,2271,2272,2276,2277,2278,2279,2280,2281],{"id":1031,"depth":1914,"text":1032},{"id":1075,"depth":1914,"text":1076},{"id":1090,"depth":1914,"text":1091},{"id":1275,"depth":1914,"text":1276},{"id":1413,"depth":1914,"text":1414,"children":2273},[2274,2275],{"id":1514,"depth":1928,"text":1515},{"id":1620,"depth":1928,"text":1621},{"id":1656,"depth":1914,"text":1657},{"id":1757,"depth":1914,"text":1758},{"id":1782,"depth":1914,"text":1783},{"id":1877,"depth":1914,"text":1878},{"id":2156,"depth":1914,"text":2157},{"id":2206,"depth":1914,"text":155},false,null,"What Kaabist does about the dialog, consent banner, tour or toast in the way of your step, how it learns a site, and what it does about a captcha.","md",{},true,"\u002Fconcepts\u002Fobstacles",{"title":50,"description":2284},"2.concepts\u002F08.obstacles","GAnt6M7lVTc4ejx5_OqKXJMXn6TzKm6yaS0eG80oKHI",[2293,2296],{"title":47,"path":2257,"stem":2294,"description":2295,"children":-1},"2.concepts\u002F07.self-healing","What Kaabist does when an element your program points at moves, how confident it has to be, and why a person approves every change to a program.",{"title":53,"path":2297,"stem":2298,"description":2299,"children":-1},"\u002Fconcepts\u002Fvalidation-and-warnings","2.concepts\u002F09.validation-and-warnings","How Kaabist turns page text into typed values, what it does when a value is missing or unreadable, and every warning a job can carry.",1793593410320]