Document crawl execution and result accounting as current behavior - #1365
Merged
Conversation
…vior
Rewrites the crawl coverage section to describe what the crawl endpoints
report today, without implying the records are complete.
- Renames "Coverage and determinism" to "Execution and result accounting"
and drops every "coverage receipt" / "proof of coverage" framing.
- States that `total` = completed + active + queued + backlog and excludes
failed jobs, so `completed == total` on a finished crawl does not mean
every discovered page succeeded
(apps/api/src/controllers/v2/crawl-status.ts:215-245).
- Documents the real `next` contract: `next` is also emitted whenever
status is not `completed`, so it can be present on terminal failed and
cancelled crawls. Removes the "only fully read once next is absent" loop
guidance, which never terminates on a failed crawl, and gives the
terminal condition as status in {completed, failed, cancelled}
(crawl-status.ts:324-331).
- Lists all four statuses including `cancelled`
(apps/api/src/controllers/v2/types.ts:1477-1505). openapi.json:2810-2813
still lists three; that is tracked as a separate Core/OpenAPI fix and is
deliberately not edited here.
- map.mdx: "exhaustive enumeration" becomes "more thorough recursive
discovery with auditable result and error records"; the pointer to the
`links` scrape format is kept.
- maxConcurrency: 1 caps in-flight requests per the configuration
reference ("maximum concurrent scrapes") and does not remove run-to-run
variation; the determinism claim is dropped.
- Get Crawl Errors: notes the list may omit some failure classes (Core
currently drops SCRAPE_RACED_REDIRECT_ERROR,
apps/api/src/controllers/v2/crawl-errors.ts:44-77) and that the error
code used for EXTERNAL_LINK is not yet in the published schema.
Addresses OB-02 and the developer read D1-D8.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…section Core clamps rather than rejects: apps/api/src/controllers/v2/crawl.ts:248-252 sets `finalCrawlerOptions.limit = Math.min(remainingCredits, finalCrawlerOptions.limit)`, with a comment naming checkCreditsMiddleware as the actual 402 source (insufficient credits to start at all, not limit-vs-credits). The new "What the crawler is scoped to reach" section restated the pre-existing (unverified) 402 claim from line 68 a second time; that restatement is removed here since this branch's whole thesis is documenting only what's confirmed against Core. Line 68 itself is left untouched per review guidance (pre-existing elsewhere on main). Added as item 5 to the Core PR proposal in scratchpad/product-prs/D3-crawl-coverage-v2.md so line 68 gets reconciled too. D3 nit 1, FINAL-REVIEW-docs-mcp.md.
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
hmishra2250
added a commit
that referenced
this pull request
Sep 7, 2026
The capabilities page is the canonical answer to what Firecrawl can do, but nothing linked to it from the two pages a reader is most likely to land on first. A page with no inbound link from the main flow is a page readers and crawlers do not reach. Adds one link from each. `api-reference/endpoint/scrape.mdx` gains a short Capabilities section above Interactions. `features/crawl.mdx` gains one sentence in the intro list area, which is where the reader is deciding what a crawl can do to each page it reaches. Both are one hop to /capabilities and both are written in the surrounding prose style. Neither touches the lines PR #1365 edits in features/crawl.mdx. Finding: DI-2026-09-05-WEEKLY, reconciled plan item 10. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS
hmishra2250
added a commit
that referenced
this pull request
Sep 8, 2026
* docs: add Browser Sandbox page to navigation * docs: add canonical capabilities-and-licensing page; make Interact/Browser Sandbox addressable Third-party pages assert capability and licence facts about Firecrawl that our own artifacts contradict. Deep Insights Sep-3 verification (F5-CORRECTION-QUEUE, grade C+, both-sides-cited rows) found: - "Node.js only (no Python bindings)" — refuted; `from firecrawl import Firecrawl` appears in multiple snapshots and in /sdks/python. - "Apache 2.0 licence" — refuted; the core repository LICENSE is AGPL-3.0 with MIT SDKs. - "Firecrawl cannot fill out a form" — contradicted by /features/interact. The verifier's one engineering fix is a canonical, extractable page whose first ~500 tokens answer each denied capability as a standalone declarative sentence with a runnable example, and state the licence split plainly, so agents and reviewers retrieve the canonical answer instead of the third-party one. Adds capabilities-and-licensing.mdx: - "Capabilities at a glance": ten declarative-sentence headings, each citing the in-repo page that documents it and carrying the smallest example already published in these docs. - "Licensing": transcribed from LICENSE/README/package manifests in the firecrawl and firecrawl-mcp-server repositories. Facts not verifiable from a local repo file carry [LEGAL REVIEW: confirm] placeholders instead of an assertion, including the AGPL-obligation-trigger wording. - "Common misconceptions": each denied capability mapped to the correct statement and its documentation link, neutral, no vendor names. Also addresses OB-03 (Aug-30 wave, verified): the interact/authenticated capability is documented but not addressable — features/browser was absent from navigation, agents never named "Interact"/"Browser Sandbox" (0 of 140 developer answers) and reasoned from the legacy `actions` array instead. This commit adds an "Interact / Browser Sandbox" nav group carrying both features/interact and features/browser, renames the API-reference group to "Interact / Browser Sandbox Endpoints", and gives features/interact a job-to-be-done opener (scrape behind a login; click through pagination; fill and submit a form; reuse an authenticated session; start a session without scraping) linking only to sections that already exist. Evidence: Deep Insights F5-CORRECTION-QUEUE (2026-09-03) and OB-03 (2026-08-30). No localized files or navigation blocks were modified. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: scope page to capabilities; split licensing out pending Legal Review outcome on docs/capabilities-and-licensing: the capability/ addressability half ships, the licensing half is blocked on Legal and must not ship as canonical. - Rename capabilities-and-licensing.mdx -> capabilities.mdx and update the Get Started nav entry. - Remove the Licensing section, the AGPL obligations note, the licence-dependent misconception row, and every [LEGAL REVIEW: confirm] placeholder from the published page. Nothing in the shipped page now depends on an unresolved licence fact. - Preserve the removed draft verbatim at drafts/licensing-DRAFT.md — a plain .md file in a non-navigated directory, so Mintlify does not build it as a page (same pattern as reconciliation/INITIAL_DRIFT_REPORT.md). It carries the blockers and the proposed Core PR for Legal to pick up. - Opening paragraph no longer claims all SDKs are MIT. That claim is contradicted by apps/python-sdk/setup.py:67 (GPLv3) and by five SDKs that ship no LICENSE file at all. - Add an Availability column (Cloud / self-hosted) to a new capabilities-at-a-glance table, plus an inline availability line on each capability section. Agent, Browser and Interact are Cloud-delivered per contributing/open-source-or-cloud.mdx:30 and contributing/self-host.mdx:180; screenshots and page actions likewise; structured JSON extraction needs an OpenAI-compatible provider or Ollama when self-hosted. - Search: the first-screen sentence and the section heading now state the real contract — titles, descriptions and URLs by default, full page content when scrapeOptions is supplied (features/search.mdx:32). - Self-host snippet is runnable: adds `cd firecrawl` and the pinned `git checkout v2.11.162`, and points at the required .env step rather than implying `docker compose up` is the next command (contributing/self-host.mdx:66-89). - Fix the anchor introduced with the OB-03 opener: the live slug is #persistent-profiles-with-scrape-+-interact, not the double-dash form. The OB-03 fix is kept intact: features/browser is addressable in nav, the API-reference group is renamed to Interact / Browser Sandbox Endpoints, and features/interact.mdx opens with jobs-to-be-done. Deep Insights: F5 (capability claims not addressable from a canonical page), OB-03 (Browser Sandbox unreachable from navigation). * fix(docs): remove licensing draft from repo, it is not provably unrouted Review found the D2 blocker: Mintlify routes unnavigated .md files as live public pages (docs.firecrawl.dev/reconciliation/INITIAL_DRIFT_REPORT -> 200), so drafts/licensing-DRAFT.md, absent only from docs.json nav, would have deployed at /drafts/licensing-DRAFT with its own first line reading "DO NOT PUBLISH". - git rm drafts/licensing-DRAFT.md. Checked for a genuinely non-deployed location: docs.json has no ignore/exclude key of any kind, and the root README.md's 404 is Mintlify special-casing that literal filename, not a property of being unnavigated -- there is no second README.md in the tree to confirm it generalizes to a subdirectory. No provably unrouted location exists in this repo, so the draft is kept out entirely rather than relocated in-repo. - Preserved the draft's full content (licence table, AGPL note, removed misconception row, "what must not be said" list, proposed Core PR) in the review report at scratchpad/product-prs/D2-capabilities-licensing-v2.md under "Licensing draft (for Legal; not in repo)". - Grepped the branch diff (git diff --name-status origin/main...HEAD): the only other added file is capabilities.mdx, which is navigated in docs.json. No other unnavigated content added. - docs.json parses; mint broken-links (Node 22.23.2): 208/95 files, byte-identical to origin/main baseline, neither touched file appears; mint validate: same pre-existing 17 warnings, none on touched files. * docs: add Monitor to the capabilities table The capabilities page is the canonical answer to what Firecrawl can do, and its table lists SDKs, Interact, Browser Sandbox, JavaScript rendering, Parse, Search, structured extraction, screenshots, and self-hosting. It omits Monitor, which ships eight public v2 routes, eight MCP tools, a CLI verb, and four docs pages in five languages. Deep Insights DI-2026-09-04-WEEKLY, finding OB-04-MONITORING-CATEGORY-FILING: 27 of 28 monitoring answers name a competitor and never mention Firecrawl. The report's stated cause is wrong, since the category pages exist, but a scope-statement surface that leaves Monitor out is a real instance of the same shape. `posts/firecrawl-101.mdx` in firecrawl-web has the matching omission; that one is a positioning call and stays out of this change. One row, in the table's existing format, pointing at [Monitoring](/features/monitoring). The row states Cloud and self-hosted because Monitor registers on the core v2 routes with no deployment gate, and it names the LLM-provider requirement for meaningful-change judging the way the structured-extraction row does. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS * Split the capabilities table into five independent columns The table had one Availability column, so a reader could not tell whether a capability has an MCP tool, how long its session lasts, whether the endpoint takes a keyless request, or whether they need credentials for the site they are reading. Those answers do not track deployment. Replaces Availability with Deployment, MCP tool, Session lifetime, API auth and Target credentials, and adds a short list above the table saying what each column means. Every cell is read off origin/main. MCP tool names come from firecrawl-mcp-server src/index.ts and src/monitor.ts. Session bounds come from apps/api/src/controllers/v2/browser.ts:44-45 and scrape-browser.ts:74-75 for sessions and types.ts:797,871-897 for the scrape timeout. Keyless versus key-required comes from the allowKeyless option on each route in apps/api/src/routes/v2.ts, with the middleware default at routes/shared.ts:245-253. Target credentials come from the profile field in browser.ts:50-54 and scrape-browser.ts:79-82. Two cells say the capability has no MCP tool rather than guessing: the standalone Browser Sandbox, because the MCP interact tools act on a scrape and no browser tool is registered, and self-hosting, which is a deployment rather than an endpoint. Finding: DI-2026-09-05-WEEKLY Astra OB-04, reconciled plan item 9. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS * Qualify the self-hosted availability of the Monitor row The Monitor row said "Cloud and self-hosted (core route)" without any condition. Self-hosted scheduled operation is gated. On firecrawl origin/main, apps/api/src/services/queue-worker.ts:467 starts the monitor scheduler and the check consumers only behind two flags: if (config.USE_DB_AUTHENTICATION && !config.DISABLE_MONITORING) { and the two else branches log "Skipping monitor worker startup because database authentication is disabled" (line 490) and "Skipping monitor worker startup because NUQ_RABBITMQ_URL is not configured" (line 494). DISABLE_MONITORING defaults to false in apps/api/src/config.ts:354, but the default docker compose turns database authentication off, in docker-compose.yaml:33: USE_DB_AUTHENTICATION: ${USE_DB_AUTHENTICATION:-false} So a default self-hosted stack has the core implementation but never runs a scheduled check. The cell now says that, and links self-host, which documents USE_DB_AUTHENTICATION. The nav block and the licensing content are untouched. Narrowing recommended by external review of PR #1364 and accepted by the orchestrator on 2026-09-07. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS * Link the capabilities page from scrape and crawl The capabilities page is the canonical answer to what Firecrawl can do, but nothing linked to it from the two pages a reader is most likely to land on first. A page with no inbound link from the main flow is a page readers and crawlers do not reach. Adds one link from each. `api-reference/endpoint/scrape.mdx` gains a short Capabilities section above Interactions. `features/crawl.mdx` gains one sentence in the intro list area, which is where the reader is deciding what a crawl can do to each page it reaches. Both are one hop to /capabilities and both are written in the surrounding prose style. Neither touches the lines PR #1365 edits in features/crawl.mdx. Finding: DI-2026-09-05-WEEKLY, reconciled plan item 10. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SL5chNkWnr4Gy6uuB8PeKS --------- Co-authored-by: Josh Hale <joshevanhale@gmail.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The crawl docs presented
completedandtotalas a coverage receipt, told callers to page untilnextis absent, listed three crawl statuses where Core returns four, and describedmaxConcurrency: 1as removing run-to-run variation. Each of those is contradicted by Core. Thisbranch rewrites the section to describe what the endpoints actually report, with a Core file and
line behind every behavioral claim, and states plainly that none of the records is a guarantee of
completeness.
Why (evidence)
Source reports: Developer-bank positioning read
(
analysis/loop/run/DEVELOPER-POSITIONING-READ.txt, 2026-08-31) and Weekly Deep InsightsDI-2026-08-30-WEEKLY(2026-08-30).Findings: the developer read's verdict, "The developer bank rejects Firecrawl on PROOF OF COVERAGE".
14 of 59 named traces carry a negative, decline or competitor-advantage verdict, 10 of them in the
interactbucket, including 9 of 10interactive_traversalprompts. Hypothesis H1: adocumented coverage receipt on actions-bearing scrapes converts the decline. Adjudications: D7
TRUE (map is not exhaustive, in Firecrawl's own words), D8 STALE, D2 STALE, and D1, D3, D5
owner-required. OB-02-completeness-objection-is-first-party, grade A minus in the 2026-09-03
review: "quotable verbatim from Firecrawl's own docs, with no coverage contract alongside it."
Verified evidence:
docs.firecrawl.dev/features/crawl"Crawl results may vary between runs of thesame configuration" and "By default, crawl ignores sublinks that are not children of the URL you
provide";
/features/map"This endpoint prioritizes speed, so it may not capture all websitelinks"; developer traces VDEV-201 ("All are convenient and all have the same silent-truncation
failure mode"), VDEV-210, VDEV-213, VDEV-222 ("less control over scroll termination, which is the
crux of your task"), VDEV-226 ("you need exhaustive link enumeration with an audit trail") and
VDEV-953 ("reintroduce exactly the silent-partial-result problem").
Core verification, read-only, each statement checked against source:
apps/api/src/controllers/v2/crawl-status.ts:215-245computestotal = completed + active + queued + backlog. The stats map carries a distinctfailedbucketthat is never summed (
apps/api/src/services/worker/nuq-fdb/queue.ts:1230-1251).crawl-status.ts:324-331:next = (outputBulkA.total ?? 0) > start + iteratedOver || outputBulkA.status !== "completed" ? <url> : undefined.The second disjunct emits
nextfor every non-completedstatus, including terminalfailedandcancelled.apps/api/src/controllers/v2/types.ts:1477-1505:status: "scraping" | "completed" | "failed" | "cancelled".cancelledis reachable viasc?.cancelledatcrawl-status.ts:233-237.apps/api/src/controllers/v2/crawl-errors.ts:44-77returnsnullforerror?.code === "SCRAPE_RACED_REDIRECT_ERROR", plus a.filter(x => x.failedReason)and amode !== "single_urls"drop.(
apps/api/src/lib/concurrency-limit.ts:244-262,apps/api/src/services/worker/nuq-fdb/queue.ts:439-455). Surviving variation sources: bulk sitemapkickoff
scrape-worker.ts:1296-1341, nested sitemap fan-out:1506-1512, priority dequeue:590-595, finish-time result orderingnuq-fdb/queue.ts:1291-1300.delay > 0forcingconcurrency to 1 is confirmed at
concurrency-limit.ts:248-251andqueue-jobs.ts:381-384.types.ts:1110and:1148:limitdefault isz.number().prefault(10000).crawl-status.ts:291:bytesLimit = 10485760.Final verdict: APPROVE per the resolution addendum to
review-grounding/FINAL-REVIEW-docs-mcp.md(the review body records APPROVE-WITH-NITS; the acted-onnit was resolved in commit
0ce9a8ed).Changes
features/crawl.mdx. The section## Coverage and determinismbecomes## Execution and result accounting, and its opener states that the section describes what theendpoints currently report and that "None of these records is a guarantee of completeness." The
strings "coverage receipt" and "proof of coverage" return 0 hits repository-wide.
totalrow becomes "completedplus the pages still in flight: active, queued, andbacklogged. Failed pages are not counted.", with a new
<Warning>explaining whycompleted == totalis uninformative: a terminal crawl has active, queued and backlog at zero, sothe counters converge whether or not pages failed, and failed pages are enumerated only by Get
Crawl Errors.
statusrow lists four values includingcancelled.nextrow states it is also emitted wheneverstatusis notcompleted, and the old<Warning>is replaced by a new### Paging through resultssubsection. Behavior contract: theterminal condition is the status field, not the absence of
next. The documented loop is pollGET /v2/crawl/{id}untilstatusis one ofcompleted,failedorcancelled; whilenextispresent and the last page returned a non-empty
dataarray, follow it; stop whennextis absentor a page returns no new documents.
EXTERNAL_LINKisreworded off the undocumented field name, and a new
<Note>states the list is not guaranteed tobe a complete enumeration because some internal failure classes are filtered out before the
response is built, and that
EXTERNAL_LINKis returned today but is not yet part of the publishedschema. Per the "public docs, no internals" rule the note names the behavior, not the internal
error constant.
maxConcurrency: 1bullet no longer claims determinism. It cites this repo's ownconfiguration table (
features/crawl.mdx:325, "Maximum concurrent scrapes") and states thatcapping in-flight requests reduces timing-dependent interleaving but does not remove run-to-run
variation, because sitemap discovery is enqueued outside the cap, nested sitemaps are fetched as
independent jobs, and the returned
dataarray is ordered by finish time rather than discoveryorder. The caveats cross-reference at
:359was retargeted and "how to make a run reproducible"softened to "more reproducible".
section's
limitbullet (commit0ce9a8ed), because Core clamps rather than rejects:apps/api/src/controllers/v2/crawl.ts:248-252,finalCrawlerOptions.limit = Math.min(remainingCredits, finalCrawlerOptions.limit), withcheckCreditsMiddlewarenamed as the actual 402 source.features/map.mdx:142. "If you need exhaustive enumeration rather than a fast approximation"becomes "If you need more thorough recursive discovery with auditable result and error records
rather than a fast approximation", pointing at the renamed section. The
linksscrape-formatpointer is preserved verbatim.
api-reference/endpoint/crawl-get.mdxandapi-reference/endpoint/crawl-get-errors.mdxcalloutsrewritten to state the
totalexclusion and the incompleteness of the error list directly, ratherthan deferring to a "coverage receipt".
#coverage-and-determinismwas retargeted to#execution-and-result-accountingin allfour referring locations:
features/crawl.mdx:359,features/map.mdx:142,api-reference/endpoint/crawl-get.mdx:7,api-reference/endpoint/crawl-get-errors.mdx:7.openapi.jsonand its mirrorapi-reference/v2-openapi.jsonwere deliberately not edited; theyare recorded as Core/OpenAPI defects below.
Diffstat: 4 files changed, 89 insertions, 1 deletion.
Verification
Independent re-verification against Core during final review confirmed every statement above, and
separately confirmed the stale artifacts the branch declines to touch:
CrawlStatusResponseObj.status.descriptioninapi-reference/v2-openapi.jsonstill reads "Can bescraping,completed, orfailed", andCrawlErrorsResponseObjhas nocodeproperty, itserrors.items.propertiesbeing exactlyid,timestamp,url,error.EXTERNAL_LINKappears inthe OpenAPI file exactly once, in the
allowExternalLinksprose at line 1793, not in the errorsschema, so the page's claim that it is not yet published is accurate.
Grep negative controls: "coverage receipt" and "proof of coverage" return 0 hits across
*.mdx,*.mdand*.jsonin the worktree; "exhaustive enumeration" is gone frommap.mdx.Anchors. All new intra-page anchors resolve:
#execution-and-result-accounting(:245),#paging-through-results(:269),#failed-and-blocked-pages(:283),#configuration-reference(:323),#event-types(:208), plus/features/scrape#scrape-formats(## Scrape Formatsat:138) and/rate-limits. The renamedanchor introduced no dangling references: all four in-repo links were retargeted in the same commit,
and no localized tree referenced it.
mintlify broken-linksunder Node 22 (the default Node 26.4.0 is rejected by the CLI): 208 brokenlinks repo-wide, all pre-existing, and zero in any file this branch touches. Filtering the report for
features/crawl.mdx,features/map.mdx,api-reference/endpoint/crawl-get.mdxandapi-reference/endpoint/crawl-get-errors.mdxreturns no entries. The only non-localized Englishfiles in the report are unrelated and pre-existing:
api-reference/v1-endpoint/llmstxt.mdx,api-reference/v2-introduction.mdx,features/alpha/llmstxt.mdx.mint validate: the same 17pre-existing locale snippet warnings, no touched file.
Core was not modified. No localized file was touched.
Not in this PR
A Core PR, drafted but not filed. Title:
fix(api): correct crawl status/errors OpenAPI schema and drop silent error-class filter. Scope:apps/api/openapi.json(mirrored tofirecrawl-docs/api-reference/v2-openapi.json) andapps/api/src/controllers/v2/crawl-errors.ts. Five items:apps/api/openapi.json:2810-2813: three values, noenum, while Corereturns four. The same schema object contradicts itself two properties later, since
completedAt.descriptionnamescancelledas a terminal state, and sibling schemas in the samefile already carry
cancelledin a realenum. Fix: add"enum": ["scraping", "completed", "failed", "cancelled"].CrawlStatusResponseObj.total.descriptionsays "The total number of pages that were attempted tobe crawled", which is wrong. Fix: describe it as completed plus in-flight, excluding failed. v1 is
byte-identical at
apps/api/src/controllers/v1/crawl-status.ts:205-222and needs the sametreatment.
CrawlErrorsResponseObjomitscode, which the response type declares (types.ts:1520-1531) andthe controller populates. Clients rely on
EXTERNAL_LINK, a field the spec denies exists.crawl-errors.ts:44-77silently dropsSCRAPE_RACED_REDIRECT_ERROR. Combined with item 2, such apage appears in neither the counters nor the error list. Preference order: stop filtering; or move
those URLs into a third explicitly named array; or at minimum document the omission.
features/crawl.mdx:68, already onorigin/mainand left untouched here, claims a 402 rejectionwhen remaining credits cannot cover the
limit. Core clamps instead(
crawl.ts:248-252). Fix: correct the doc line once Core confirms the clamp is intended, or makeCore reject if the clamp was unintentional.
Also noted for whoever picks that up: the DB-backed fallback branch (
crawl-errors.ts:78-159, usedonce the Redis crawl record has expired) derives
timestampfromcreated_atrather than finishtime, so
timestampsemantics differ between the two paths.Remaining docs nits, not acted on: "auditable" in
map.mdxis slightly warmer than the samebranch's own Note admitting the error list is incomplete; and the new scope section restates the
limitdefault of 10000, which also appears at line 68 and in the configuration table.Out of scope entirely:
/extractand scrapeactionshave no documented partial-result signalanywhere (developer read D1, D3, D5). That is a product decision, not a docs one.
Links
Files changed:
features/crawl.mdxfeatures/map.mdxapi-reference/endpoint/crawl-get.mdxapi-reference/endpoint/crawl-get-errors.mdxEvidence packet:
agent-experience-deepinsights-cleanroom/artifacts/deep-insights-sep3-verification-20260904/