Skip to content

feat(docs): new bot manager content - #2387

Merged
marcus-souza-azion merged 3 commits into
release/new-azion-docsfrom
docs/new-bot-manager-content
Sep 22, 2026
Merged

marcus-souza-azion merged 3 commits into
release/new-azion-docsfrom
docs/new-bot-manager-content

Conversation

@marcus-souza-azion

Copy link
Copy Markdown
Contributor

What & why

Reworks the Bot Manager section end to end, against the thirteen-slot product structure. The section
was three pages written before the style guide existed, plus eleven guide rows carrying "How to"
titles. The overview ran 505 lines and held a definition, a classification table, a JSON arguments
table, a log-field dictionary and an eight-step challenge procedure under one title; the Bot Manager
Lite reference opened with a second H1 in its body; and two navigation rows pointed at placeholders
no page filled.

The section is now thirteen slots in two languages: overview, quickstart, how it works, three
reference pages, limits, best practices, troubleshooting, glossary, an examples index with four
snippet pages, the guides hub with eight rewritten and three scope-edited rows, and pricing and changelog as links. One slot
stays empty, because Bot Manager's surfaces are one function instance, its output, and the Lite
function — a features page would restate the overview one level down.

A verification run against a real account settled the facts the pages rest on, and corrected several
the corpus had wrong. Bot Manager is not a firewall module: it runs as a function instance on a
firewall, and the v4 specification declares no such module. The rule behavior carries the instance
id in value — not name, not function_id, and not the installed function's id, which is the
mistake every previous page invited. Bot Manager Lite ships action as deny at a threshold of
30, so an instance created with an empty arguments object refuses the first request that crosses
it. Network list 2 is Azion IP Tor Exit Nodes, not the Origin Shield addresses one guide named. An
argument change reaches the request path in about two minutes, so a re-test run immediately after one
describes the arguments that preceded it.

One mechanism nobody had documented now appears where a reader meets it: classified is computed
against the threshold in force rather than against the score, so one score of 28 reads legitimate
at a threshold of 30 and bad bot at a threshold of 1. Raising a threshold therefore relabels
traffic in the report log and in every chart built on it, and a week-over-week count is comparable
only across an unchanged threshold.

Three silent failure modes are documented for the first time. The arguments object is not validated
at all: a misspelled key is accepted by every interface, stored, echoed back byte for byte, and
ignored while the function runs on its default, so an argument nobody read and an argument that had
no effect look identical from outside. A Rules Engine criterion matching on query-string arguments
does not match a request that carries no query string, so a rule built that way skips every POST with
its payload in the body. And a request the function has not classified is answered with 204 and an
empty body, which is neither a refusal nor a pass.

No permalink moved, so no redirect is owed. Every inbound anchor was repointed instead: four pointed
at an overview anchor the rewrite removed, and the rest at headings that no longer exist.

Related issue: none
Pages affected: /documentation/secure/bot-manager/ · /quickstart/ · /how-it-works/ · /arguments/ · /logs/ · /bot-manager-lite/ · /limits/ · /best-practices/ · /troubleshooting/ · /glossary/ · /examples/ and its four snippet pages · /guides/, plus the eleven guides the hub lists and every Portuguese twin

Coverage

The same frozen set of 95 reader questions, in the same wording and order, scored against the section
before the rework and again as it shipped. Nothing external was re-read between the two runs.

Before After Change
Questions answered 35 of 94 (37.2%) 76 of 94 (80.9%) +41
Of the subset every comparison source answers 16 of 40 (40.0%) 36 of 40 (90.0%) +20
Partial 41 15 −26
Missing or absent 18 3 −15

Nothing regressed, checked by joining the two measurements row by row. One question is excluded
from both denominators as not applicable.

Type of change

  • 🆕 New content (feat)
  • 🩹 Fix (fix) — typo, broken link, wrong information
  • ♻️ Content update (docs) — rewrite, expansion, upkeep
  • 🌐 Translation sync (i18n)
  • 🏗️ Platform / structure (refactor / chore) — reviewed by UXE, no content mixed in

Author checklist

  • PR title follows type(scope): summary (see GOVERNANCE.md §4)
  • Frontmatter complete: title, description, meta_tags, namespace, permalink, last_reviewed
  • No legacy "edge-" product names in the copy
  • How-to/tutorial content includes at least one runnable, copy-paste-tested code block
  • Screenshots (if any) have alt text and follow image standards
  • Internal links are relative and resolve locally
  • If any permalink changed or page moved: redirect added in this PR
  • i18n: pt-br updated in this PR or follow-up i18n issue created: every Portuguese twin is written in this PR
  • I ran pnpm build:local (build + frontmatter check) without errors

The Bot Manager section was three pages written before the style guide
existed. The overview carried a definition, a 14-row bot classification
table, a 17-row argument table, a 26-field log dictionary and an 8-step
Captcha procedure under one title. The Bot Manager Lite reference opened
with a second H1 in its body. The product tree declared Quickstart and
Glossary as placeholders that no page filled.

Nine of the thirteen slots now hold a page: how it works, two new
reference pages for arguments and logs, the rewritten Lite reference,
limits, best practices, troubleshooting and a glossary. Quickstart,
examples, the guides hub and the overview are still owed, as are the
Portuguese pairs and the navigation entries. No permalink moved, so no
redirect is owed.

A run against a real account settled the facts these pages rest on and
corrected several the corpus had wrong. Bot Manager is not a firewall
module: the firewall has four, and Bot Manager runs as a function
instance on the functions module, which is enabled by default. The rule
that runs it carries a behavior keyed type, not name, whose attribute is
value and holds the instance id rather than the function id. An instance
name is bounded at 100 characters and its arguments payload at exactly
100,000 bytes, both found by bisection, and the payload bound is decimal
rather than 100 KiB. Instances per firewall are not bounded at all:
twelve on one firewall were every one accepted.

Reading the installed function corrected the Lite argument table four
times. internal_logs is a number, not the string the page typed. The
default threshold is 30, not the 10 every Lite page used nor the 18 the
overview recommended. threshold and action were marked required and
neither is. log_headers is a default allowlist of nine headers the
function writes, not a forbidden list.

The report log was read from the functionConsoleEvents dataset and
corrected six more. Its prefix carries the log tag, not the host. Bot
Manager Lite writes fourteen fields where the full edition documents
twenty-five, so a Lite log is not a full-edition log. Lite does emit
classified and bot_category. geoip_country is a country code, matching
the field table rather than the specimen beside it. The fingerprint is
four underscore-separated segments, not either hex hash the corpus
showed. bot_category is a comma-joined list derived from the classes of
the rules that matched.

Two behaviors no page had documented now appear where a reader meets
them. An arguments object is not validated: every key sent is stored and
returned unchanged, including one deliberately misspelled, so thresold
leaves the threshold at its default with no error in any interface. And
a client with no valid session receives 204 with an empty body and the
two session cookies, indefinitely if it neither runs JavaScript nor
keeps them, which reads as neither a block nor a success.

One classification finding changes how the field should be read.
classified follows the threshold rather than the score: the same score
of 28 from the same matched rules returned legitimate under a threshold
of 30 and bad bot under a threshold of 1. Raising a threshold relabels
traffic as well as stopping the action.

The published Lite rule table is confirmed correct. Two independent rule
sets each sum to the measured score of 28 using the table's own
increments, so the one rule catalogue the product publishes can be
trusted. The full edition's static rules remain published nowhere, so no
page lists, names or scores one, and the instruction to disable rule 22
does not survive; the pages teach reading matched_rules and disabling by
the id the reader finds. No page states a score scale, because no source
states a maximum. The billing metric named profile stays undefined and
off the limits page and out of the glossary.
The section was three pages written before the style guide: a 505-line
overview mixing positioning, mechanism, a 14-row classification table, a
17-row arguments table, a 26-row log-field dictionary and an 8-step
challenge procedure; a Lite reference carrying a second H1 in its body;
and a guides hub whose rows all read "How to ...". Two nav rows pointed
at placeholders no page filled.

It is now the thirteen-slot product section. New pages: quickstart, how
it works, arguments, logs, limits, best practices, troubleshooting,
glossary, and an examples index with four snippet pages. Rewritten in
place: the overview (505 to 101 lines), Bot Manager Lite, and ten
guides. Portuguese carries every page.

A live run against the platform corrected the corpus rather than
restating it:

- Bot Manager is not a firewall module. It runs as a function instance
  on a firewall, and the v4 spec declares no bot_manager module.
- The rule behavior is run_function with the instance id in "value" -
  not "name", not "function_id", and not the installed function's id.
- The arguments object is unvalidated. A misspelled key is stored,
  echoed back byte for byte, and silently ignored while the function
  runs on its default.
- classified follows the threshold, not the score: one score of 28 read
  legitimate at threshold 30 and bad bot at threshold 1. Classification
  counts are comparable only across an unchanged threshold.
- Lite ships threshold 30 and action deny, so an instance created with
  an empty arguments object refuses the first request that crosses 30.
  Its internal_logs is the number 0, not the string "2".
- Network list 2 is Azion IP Tor Exit Nodes, not Origin Shield IPs as
  the old guide said.
- An argument change reaches the request path in about two minutes, so
  a re-test run immediately after one describes the arguments before it.

Silent failure modes now carried by the pages: a 204 with an empty body
is neither a refusal nor a pass; a Request Args criterion matching .*
skips every request that has no query string; a misspelled argument is
accepted by every interface with no error.

Nav and links: bot-manager.json gains the Examples and Reference groups
and loses both placeholder rows; guides.json retags ten rows as
how-to-guide and hoists bot-manager to products[0] on two. Every
permalink and namespace is frozen, so no redirect is owed, and every
inbound anchor was repointed to a heading that exists.

Left unwritten, and why: the full edition's static rule catalogue is
published nowhere, while matched_rules hands readers its rule IDs; a
billing "profile" costs $195 beyond the first and is defined in no
source. Every full-edition bound stays reported rather than observed -
the account used for the live run carries Lite only.
@marcus-souza-azion
marcus-souza-azion requested review from a team as code owners September 22, 2026 21:44
The Bot Manager rework adds 26 pages, and this check counts link issues
across the whole build, so the number rose from 26,516 to 26,799 and the
ratchet failed with "this branch adds 283".

None of the 283 is a broken link. 26,439 of the 26,799 issues are [404]s
the page template emits on every page: the footer's links into the
marketing URL space, which the documentation build does not contain, and
each page's own .md twin from FallbackNotice.astro. Every page in the
corpus carries about 16 of them, so the count tracks how many pages exist
rather than how many links are wrong.

Measured on a full build of this branch: of the 856 issues on the 57
changed pages, all 856 are those two template classes, none is a link
written in the rework, and none is a broken fragment. No fragment issue
anywhere in the build points at a page or an anchor the rework changed.
The changed pages average 15.0 issues each; the other 1,698 average 15.3.

This re-snapshot unblocks the branch. It does not fix the cause: while
the two template classes are counted, every pull request that adds a page
fails this check and re-snapshotting is the only way past it, which is how
a ratchet stops meaning anything. Excluding them belongs in its own change
against scripts/lint-linkcheck.ts.
@marcus-souza-azion
marcus-souza-azion merged commit 01bd1d1 into release/new-azion-docs Sep 22, 2026
6 of 8 checks passed
@marcus-souza-azion
marcus-souza-azion deleted the docs/new-bot-manager-content branch September 22, 2026 22:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant