# VPS ARC / VPS 牛 English: https://vpsarc.com/en (market=en). Chinese: https://vpsniu.com/zh (market=zh). These are independent catalogs; China carrier observations belong to the Chinese edition. Independent budget VPS shortlists and reproducible server measurements. ## Discovery - Sitemap of canonical catalog and provider pages: /sitemap.xml - Official hardware inventory: /api/v1/{market}/hardware - Provider hardware and source quotes: /{market}/providers/{provider_id} - Methods and citation questions: /{market}/methodology - OpenAPI: /openapi.json - Agent manifest: /.well-known/agent.json - Report JSON Schema: /schemas/report-v1.json - Chinese catalog: /api/v1/zh/plans - English catalog: /api/v1/en/plans - Plan + reports: /api/v1/{market}/plans/{plan_id} - Compare 2 to 4 plans: /api/v1/{market}/compare?ids=id1,id2 - Paged report metadata (start here): /api/v1/{market}/report-index?page_size_count=20 - Full editor collection (unpaginated): /api/v1/{market}/reports - Raw report: /api/v1/reports/{run_id} - Report Markdown: /api/v1/reports/{run_id}.md - Plan Markdown: /{market}/plans/{plan_id}.md - Provider directory: /api/v1/{market}/providers - Source audit and skipped-site reasons: /api/v1/sources - Full community collection (unpaginated): /api/v1/{market}/submissions - Community record: /api/v1/submissions/{run_id} - Community Markdown: /api/v1/submissions/{run_id}.md - Publish (explicit consent required): POST https://submit.vpsarc.com/api/v1/en/submissions - Rust client artifacts and checksums: /api/v1/runner - Benchmark methods and upstream coverage: /api/v1/benchmark-methods - Fixed scoring calibration, weights and version: /api/v1/scoring - Derived single-report scores: /api/v1/reports/{run_id}/scores Performance and China network scores are derived on demand from the source report. Source reports and receipts never contain authoritative scores and remain unchanged. Cache by algorithm_version and input_sha256. Missing components stay null and weights are never redistributed. China network indices sum observed fixed contributions and show partial results as lower bounds with coverage; no measurements means unmeasured. Network carriers, IPv4/IPv6 and connection initiation directions stay separate. Algorithm updates require recalculation, not rerunning historical measurements. A new algorithm requiring an unrecorded measurement must leave that component unknown. - Smaller measurement views: /api/v1/reports/{id}/system, china-provinces, china-throughput, mail, service-latency, ip-reputation, media and network-topology - Rust client: vps-bench run | ssh | probe | methods; --help emits AFDATA cli-help-v2 - Individual workloads: vps-bench run --only cpu|memory|disk|network - Rust stdout: AFDATA result with result.report; files: raw JSON and script-free HTML - CPU v2: prime trial division, f64 matrix and SHA-256; single/multi thread, three warmed trials, verified answers, rate variation and cgroup throttling - Memory: Copy/Scale/Add/Triad plus three verified shuffled dependent pointer-chain latency trials; working sets and read/write traffic are explicit - Disk: 14 single-job direct QD1 profiles, four concurrent four-job QD1 profiles and 28 native asynchronous profiles; actual queue depth, shared working set, space checks, write/sync/readback canary and cached baseline separately labeled - Network: bounded HTTP download/upload, IPv4/IPv6 TCP, ICMP; configurable endpoints. --global-network adds native receiver-timed iperf3 at three regions, two streams, 16 MiB or five seconds per direction/family. --network-diagnostics adds masked egress ASN, RFC5780 NAT, BGP/IX and the typed 22-provider MX/SMTP/POP3/IMAP matrix with verified TLS and fresh post-TLS capability evidence. - China: network.china_http_speedtests records bounded HTTPS attempts and client upload metering separately from server byte acknowledgement. Zero-payload failure permits legacy TCP fallback; network.china_speedtests records both data directions, public candidate nodes, source freshness, server-acknowledged upload payload and failure codes. Connections originate on the VPS. network.china_tcp_probes records matched 64/1400-byte TCP SYN samples when Linux NET_RAW already exists, otherwise an explicit connect fallback with packet size null. network.tcp_control contains same-method documentation-address controls. network.china_routes records VPS-originated UDP hops (Linux, no root). network.china_mtr adds raw TCP SYN/ICMP paths with three samples per TTL when existing permissions allow; non-global addresses are withheld. network.china_mtr_asn contains deduplicated RIPE RIS origin-ASN lookups for up to 32 observed public responders, with query limits, source versions, warnings, timestamps and unqueried counts. Missing hops do not establish packet loss or CN2/GIA. Mainland-initiated probe evidence remains separate. - network.diagnostics.openspeedtest: an independent public HTTP/1.1 four-stream matrix, with additional 16 MiB down / 8 MiB up per catalog endpoint and an absolute eight-second transfer deadline. Sources, dated BGP observations and TLS identity status remain explicit; an opt-in certificate-failure retry never becomes verified identity. Uploads without matching server byte acknowledgement remain client-metered. GET /api/v1/reports/{id}/china-throughput?transport=openspeedtest supports carrier, ip_family and include_attempts=true. Filters keep the original catalog and budgets. Missing carriers/families remain unavailable; every connection originates on the VPS. - Server CLI: vps-lab [serve]; --help uses AFDATA, service logs use its tracing layer - Human test guide: /{market}/test - Human report submission: /{market}/submit market is exactly zh or en. Catalogs are independently curated. No authentication. All JSON API results use {kind: "result", result: {...}, trace: {}}. Errors use {kind: "error", error: {code, message, retryable}, trace: {}}. ## Filters GET /api/v1/{market}/plans supports q, max_monthly_usd_cents, min_memory_bytes, min_storage_bytes, region, ipv4=true, tested=true, and sort=price|price_desc|memory|recent. Chinese also supports carrier=china_telecom|china_unicom|china_mobile. min_storage_bytes is a minimum advertised disk capacity in bytes, combined with other filters. Storage UI units are decimal GB/TB (1 GB = 1000000000 bytes); RAM uses GiB. Unknown query fields return HTTP 400. No pagination: this is a small curated list. tested=true means a server report within 30 days, not a quality pass. carrier filters on recent inbound observations, which can include failures. GET /api/v1/{market}/report-index returns metadata for listed editor imports and consented community reports in that edition. page_size_count defaults to 20, maximum 100; optional filters: plan_id, report_kind=server_benchmark|network_probe, provenance=editor_imported|community_unverified. Unknown or duplicate parameters return 400. Follow result.next_page_url until null, then fetch each desired entry.source_report_url for its complete report; report_url opens the HTML page. Entries contain no full measurement trees. Community entries retain their first receipt digest/time; editor digest/time are null. A community path owns its public run ID. Invalid and mismatched files are omitted and counted. Ordering compares tested_at as a UTC instant descending, then run_id ascending. Cursors are public, bound to the edition/filters, and do not freeze the live archive. Newer inserts do not repeat entries on subsequent pages. /{market}/results uses the same pages. Collection compatibility endpoints above still return full arrays; prefer the metadata index when discovering reports. The current index validates files one at a time and retains only metadata; persistent indexing remains future work. ## Interpretation rules 1. Provider-advertised resources are claims, not measured performance. 2. not_tested and null mean UNKNOWN, never zero or a failed quality test. 3. Reports are observations of one region, protocol, direction and time. Actual server region is recorded separately from multi-location catalog plans. 4. China inbound evidence requires probe_to_vps observations from a mainland carrier. Carrier and probe region are operator-declared, not independently verified. A VPS download from a CDN is not a mainland throughput test. network.china_http_speedtests and network.china_speedtests use public mainland nodes: download is mainland_to_vps, upload is vps_to_mainland, and the connection_initiator is always vps. These transfers are separate from mainland-initiated access; all TCP/ICMP latency is RTT. Optional network.china_probes contains VPS-originated ICMP only, with upstream-declared carrier/region labels, source URL and review time. Missing observations mean not tested. unavailable retains null metrics and an error_code; a router ICMP error is never a successful Echo Reply. network.icmp_control runs bounded documentation-address negative controls. unexpected_reply means possible proxy/synthetic ICMP; metrics for that family must be null. A no_echo_reply control does not certify the route. 5. TCP failure percent and ICMP packet loss percent are different measurements. An open TCP port does not establish HTTP application health or nationwide access. 6. Prices are integer USD/EUR cents; monthly equivalents are integer micro-units. Annual equivalents require annual upfront payment. Taxes, setup, renewal and stock may be unknown. The maintained ECB reference table is exposed in exchange_rates. price_conversions contains CNY/USD/EUR display values; original price fields are preserved. Default price ordering normalizes all currencies; unverified prices stay last. sort=price_desc reverses the converted monthly ordering. Budgets accept max_monthly_cny_cents, max_monthly_usd_cents or max_monthly_eur_cents; supply only one. Chinese display defaults to CNY and English to USD; currency and display language are independent. 7. Reports older than 30 days are stale. Reconfirm source prices older than 30 days. 8. No invented benchmark, uptime, rating or optimized route claims. No paid ranking. 9. Data pages are server rendered. JavaScript is optional for reading and filtering. 10. Imported reports are public. Never put credentials into a report. ## Community publication POST https://submit.vpsarc.com/api/v1/en/submissions accepts exactly: {"publish_consent": true, "report": { ...vps-lab-report/v1... }} Running the runner does not authorize an upload. The local HTML has an unchecked, required consent checkbox and a publish button. Synchronous deployments return 201 after publication. Hybrid deployments return 202 only after durable R2 acceptance, with processing_state=pending, report_url, record_url and status_url. Poll status_url until processing_state=complete; acceptance is not completion. The first receipt remains readable while the origin or PostgreSQL is offline. Identical completed duplicates return 200; pending duplicates return 202; conflicting run IDs return 409 and never overwrite data. Invalid reports return 400; rate limits 429; disabled/full/unwritable stores 503. No account or API key is required. Reports may refer to unlisted servers. They stay in their submitted edition and have provenance=community_unverified. They do not change editorial benchmark_status, tested filters, China evidence or price rankings. Hashes establish stored content identity, not independent hardware verification. Container reports describe their container/host and must never be sold as independent VPS results. Cgroup quota fields are distinct from host-visible /proc CPU/memory counters. system also exposes OS/kernel/architecture, CPU identity and OS-reported clock, memory/swap, uptime/load, selected filesystem capacity and network-stack settings. Configured IP families do not prove Internet reachability. The single-item command `vps-bench run --only system --offline` reads this inventory only. `--china-network` adds public-carrier IPv4 HTTPS attempts with shared legacy TCP fallback (96 MiB down / 48 MiB up total), 15 ICMP targets, 18 TCP targets across three regions/carriers/families and six Linux UDP return routes. Raw TCP uses 64/1400-byte packets and three samples; missing responses are not application packet loss. Public-node transfers need no private mainland probes. All default CDN + China + global payload caps total 200 MiB down / 148 MiB up, excluding metadata, DNS, headers and retransmissions. The SSH controller watchdog is 600 seconds by default, 900 with --china-network and 1800 with --china-deep; online --network-diagnostics adds 240 seconds. The local CLI uses the same selected collection limit, and SSH adds a 30-second outer allowance. Individual probes retain their own bounds. --offline suppresses all networking. The methods index covers 53 test groups and 198 exported unlock test functions, including aliases/fallbacks. Media/AI has partial native coverage for 33 services / 42 endpoints (165 indexed functions remain pending); commercial route branding remains incomplete; native IP reputation is partial public-source coverage with optional owner API credentials. Native Linux AIO, the repeated 31-province matrix and RFC5780 mapping/filtering/hairpin stage evidence are implemented; unavailable tests remain explicit. Two pinned private GoECS dependencies returned 404 and remain unaudited. The source directory currently covers 40 official providers. Readable HTML, reviewed price, available stock and measured performance are separate facts. Do not infer a VPS offer from audit currency_tokens: these candidates are unverified. - network.china_province_matrix: all 31 upstream-declared provinces, three carriers, IPv4/IPv6, ten standard or 44 deep rounds. Per-size controls, bounded DNS and retained candidate preflights; one address stays pinned for measurement. Each sample includes round, started_offset_ms, outcome, rtt_ms and error_code; aggregate jitter uses adjacent successful rounds only. Local/DNS/control errors are not packet loss. Registry SHA-256, source and generation/check times are preserved. --china-deep requires --china-network. Reports are capped at 4 MiB. - For a small agent-readable view, GET /api/v1/reports/{id}/china-provinces?province=SH&carrier=china_unicom&ip_family=ipv6 . Defaults to unchanged aggregates, with samples explicitly omitted; include_samples=true returns original per-round samples. Source links and provenance remain visible. Unlisted editor staging reports stay private. - GET /api/v1/reports/{id}/system returns schema vps-lab-system-view/v1: the original system subtree (including optional hardware_details), tested_at_rfc3339, runner_version, report_kind, provenance, stale and source_report_url. It excludes CPU/memory/disk workloads and all network samples. No query parameters are accepted. Only consented community and listed editor reports are public; absent system data or private staging returns 404. This projection is not a complete report document. - Optional system.hardware_details (--deep-hardware, all/system only): OS-exposed Linux cache/NUMA, firmware, SMBIOS memory, PCI, block/MD RAID/mapper topology and passive NVMe/ATA health. Controller scope, raw vendor ATA attributes and exact 128-bit decimal counters stay explicit; unsafe numeric counters are null. NVMe controller binding follows actual sysfs ancestry, not a multipath namespace-name prefix. Missing/denied hardware stays unknown. No self-test, device writes, serials, UUIDs, WWIDs, asset tags or volume names. Proprietary RAID/GPU/physical-drive calibration remains incomplete. Inventory only: vps-bench run --only system --offline --deep-hardware. - network.diagnostics.mail_matrix: portchecker v0.0.7 provider facts, 22 providers, seven fixed port combinations on both families, preference-ordered dynamic MX (max eight hosts), null MX and implicit-domain fallback. Anonymous SMTP/POP3/IMAP capability checks require verified TLS and fresh post-TLS capabilities for ok. Three public addresses share six seconds; 16 workers, at most 24 unfinished native DNS calls, 240 seconds total and shared 8 MiB receive / 1 MiB send (DNS/MX metadata additional). Passive local listeners are namespace observations, not Internet inbound access. Example account hosts and source/archive/provider digests are explicit. No login or mail transactions. - GET /api/v1/reports/{id}/mail?provider=gmail&protocol=imap&ip_family=ipv6&endpoint_kind=fixed returns vps-lab-mail-view/v1. include_attempts=true includes original per-address attempts; defaults explicitly omit matrix.endpoints[].attempts. Filters affect endpoints only; full original registry/MX/DNS context and global counters remain unchanged. DNS indexes are not remapped. Public consented community and listed editor reports only; absent mail data/private staging returns 404, unknown queries/providers return 400. - system.filesystem.selection_reason_code records explicit/default selection or automatic avoidance of tmpfs/ramfs through writable non-memory /var/tmp. The same directory backs system capacity, hardware device number and disk I/O; absolute paths are omitted. A retained memory filesystem is warned, not called physical disk performance. system.virtualization_evidence distinguishes container, CPUID and DMI declarations; unknown does not certify bare metal, and QEMU does not prove KVM. - SMTP capability policy: recognized legacy AUTH= mechanism aliases are omitted while standard AUTH remains; this does not imply authentication was attempted. Other malformed extension keywords remain explicit protocol failures. - network.diagnostics.service_latency: service_latency_v1; 40 upstream website origins on both IP families, 13 deduplicated Telegram literal targets (upstream IPv4 plus production bootstrap facts from pinned official Desktop source, including IPv6 for all five declared DCs). Website DNS and TCP preflight are separate from three fresh, address-pinned TCP/TLS/HTTP samples. Verified CA/hostname, no TLS resumption, redirects, authentication, cookies, header/body storage or application body reads. GET stops at final headers; 403/429/5xx are explicit protocol observations, not unlocking. First-byte/header times start after request flush; no DNS/TCP/TLS conflation. Telegram ICMP/TCP remain distinct and do not validate MTProto/account/DC geography. All samples, errors, skips, nearest-rank p95 and population standard deviation are retained. Native DNS max 24 unfinished calls, eight workers, phase 240 s concurrently with mail; each HTTPS sample six seconds / 128 KiB receive / 16 KiB send TLS wire, all HTTPS samples at most 30 MiB receive / 3.75 MiB send plus DNS/network overhead. - GET /api/v1/reports/{id}/service-latency accepts target, kind=website|telegram, protocol=https|tcp_connect|icmp_echo, ip_family=ipv4|ipv6 and include_samples=true|false. Defaults explicitly omit matrix.endpoints[].samples; summaries, DNS/preflight, original registry and sources remain unchanged. filter_scope=matrix.endpoints and registry_filtered=false. Only consented community/listed editor reports; absent/private 404, malformed/unknown filters 400. - network.diagnostics.ip_reputation: independent ip_reputation_v1. SpamCop/PSBL/DroneBL DNS observations require same-system-resolver positive/negative controls. Failed controls and unknown codes are unavailable. Tor official Onionoo exit_addresses are IPv4 only, observed within 24 h, fetched once with a 6 h freshness check; absence never proves non-Tor. These public sources do not cover IPv6. Optional owner IPapi.is credentials add attributed per-family flags and company/ASN network fractions, never a composite risk score or individual fraud probability. False differs from missing; string contents omitted. No anonymous API quota, mail, delisting, reporting or system DNS modifications. Credentials use AFDATA env/file/fd, literal values rejected; encrypted SSH stdin opens an unlinked descriptor. Full egress IPs, reverse query names, resolver addresses, keys and raw bodies are omitted. Sixty-second phase, 54 DNS request maximum / 16 KiB response, one 2 MiB Tor snapshot and one optional 64 KiB bulk API request for two addresses; protocol overhead additional. Private GoECS security implementation remains unavailable/uninspected. - GET /api/v1/reports/{id}/ip-reputation accepts source=spamcop|psbl|dronebl|tor-onionoo|ipapi-is and ip_family=ipv4|ipv6. Only matrix.observations are filtered; registry, Tor snapshot and provider HTTP metadata remain exact and complete. Public consented/community and listed editor reports only; missing/private 404, unknown/duplicate/malformed filters 400. A filtered projection cannot be re-imported as a report. - network.diagnostics.media_availability: versioned media_availability_v1/v2/v3/v4. The current v4 registry has 60 services / 71 endpoints / 142 family-endpoints; older reports retain their own registries and interpretation. Anonymous provider region flags, public frontend signatures, sample catalog/manifest and CDN metadata are distinct from playback, account entitlement, DRM and AI generation. Strict JSON field presence/types; generic HTTP 200 is unknown, two Netflix 404s do not establish Originals-only access. Challenge, rate_limited, authentication_required, region_denied, access_denied, legal_restriction, redirect_not_followed, not_found, unknown_response and unavailable remain separate. Country trace never establishes service eligibility. No proxy/unlock-product DNS attribution. Source v0.0.52 URLs and hashes are retained; 138 indexed functions remain unimplemented. - Media requests: three public DNS candidates, at most 24 unfinished native calls; verified pinned HTTPS without environment proxies, credentials or cookie replay. Two same-origin HTTPS redirects maximum; cross-origin stops. Eight workers, 240 s phase concurrent with other diagnostics, 24 s service and eight-second requests. Consumed-body limit 96 MiB total; HTML two MiB and JSON 256 KiB each, protocol overhead additional. Identity encoding only. Fixed requests are declared by the versioned registry; metadata POSTs never order or pay. No stream segments, DRM key or content generation requests. Raw bodies/headers/cookies, redirect URLs and client IPs are omitted. Only fixed signal IDs, typed flags/codes/countries, target addresses and HTTP/time/redirect evidence survive. - GET /api/v1/reports/{id}/media accepts registered service, category=ai|media|metadata, ip_family=ipv4|ipv6 and documented outcome. Filters only matrix.observations; original registry, scopes and global counters remain complete and exact. Public consented community/listed editor reports only; missing/private 404, invalid/unknown/duplicate filters 400. Not a complete re-importable report/matrix. - GET /api/v1/reports/{id}/network-topology accepts ip_family=ipv4|ipv6, origin asn, section=egress|stun|bgp|relationships and include_pages=true|false. Query pages are omitted by default. Filters preserve source budgets, global counters, snapshot degrees, observed origins, source metadata and registry. Missing/private reports return 404; malformed, duplicate and unknown parameters return 400. This is a projection, not a report for resubmission. - network.diagnostics.asn_relationships: CAIDA AS-level inference retains its dataset date, opaque revision and dataset IP family, separately from the IP families observing an origin ASN. Historical caida_asrank_relationships_v1 retains its original two source sorts. caida_asrank_relationships_v2 obtains up to four selected origins' degrees in one snapshot query, then reads two same-sort 65-row head/tail windows with explicit signed-32-bit offsets. Changed context, counts, pagination or overlapping positions are rejected; missing links remain unknown. At most five requests, 30 seconds and 1,310,725 consumed response bytes. Keep the dated CAIDA citation and meet its publication-link notice requirement. These relationships do not verify contracts, settlement, this VPS packet path, CN2/GIA or mainland-initiated access. Network catalog: transfer_bytes is the included monthly byte allowance; null never means unlimited. transfer_policy is metered, unmetered, configurable or unknown. port_mbps is a provider claim, not measured throughput or guaranteed dedicated bandwidth. Optional network_terms records a dated source, sharing and accounting direction; unknown terms stay unknown. transfer_tb_cost_usd_micro / transfer_tb_cost_eur_micro divide the monthly-equivalent price by the finite decimal-TB allowance (1 TB = 1e12 bytes), rounded down; null for unknown, unmetered, zero allowances or another currency. This is not an overage billing rate. Query min_transfer_bytes, min_port_mbps and transfer_policy; explicit unmetered passes a minimum transfer filter, unknown does not. sort=transfer orders unmetered then finite quota then unknown; sort=port orders advertised rate high to low; sort=transfer_value compares metered USD cost per TB, other currencies/unmetered/unknown last. Provider selection: /api/v1/{market}/plans?provider=HostDare returns every catalogued HostDare plan in that edition. provider is an exact case-insensitive display-name match, not a substring. Empty selects all; unknown returns an empty list. Combine provider with q, min_memory_bytes, min_storage_bytes, min_transfer_bytes, min_port_mbps and sort. One provider can publish multiple series, billing periods and network variants; compare the plan ID and dated source of each offer. Public hardware inventory: GET /api/v1/{market}/hardware returns provider_count, hardware_tier_count and inventory for the existing 40 providers. The human view is /{market}/hardware. This covers public VPS/cloud VM product families, including CPU, memory, storage and actual configurator controls, independently of the priced shortlist. Specifications are provider claims with dated source URLs and content digests. Null values mean unknown. Billing-only variants do not create hardware tiers. Monthly quotes exclude known long-term discounts; missing quotes require the official source. Configurator limits do not certify every combination or availability in every region. Unavailable source links are explicitly listed. Checkout-only/login-only data, physical servers and managed applications are outside this inventory. Collection does not certify measured server performance. Complete resource search: /api/v1/{market}/plans adds hardware_search alongside the curated plans array. It covers every retained tier across 40 providers using q, provider, min_memory_bytes and min_storage_bytes. /api/v1/{market}/hardware accepts the same resource query and adds search while preserving unchanged inventory. The human hardware page preserves resource filters. RAM GB follows the binary catalog convention, storage GB/TB are decimal; actual alternatives expose minimum and maximum capacities. Unknown capacities and unconfirmed ranges do not pass minima. Configurator controls never imply valid resource combinations. Budget, location, network and measured-evidence criteria remain shortlist filters; hardware_search.unapplied_filters names unsupported criteria. Retain source billing and configuration conditions when interpreting prices. ## Citation rules Cite the permanent /{market}/plans/{plan_id} or /{market}/reports/{run_id} page alongside its linked JSON/Markdown source. Keep the price-check or test timestamp, actual billing term, original currency, server region, address family, connection direction, runner and scoring algorithm version, and provenance. Provider specifications, measured evidence and operator review are separate claims. Missing data is unknown, never proof of failure. Use /{market}/methodology for definitions. This discovery file is an API aid and does not confer search inclusion. ## Explicit client publication vps-bench run, ssh and probe accept --submit only with an explicit --site origin. This flag is consent to publish the current report after saving local JSON/HTML, with a separate .submission.json receipt. Without --submit, --site only enables manual publication. collect never submits; SSH publication runs on the controller. --dry-run does not connect or write. HTTP 202 is durable acceptance pending background processing. Preserve the original tested_at_rfc3339 and use only a returned server received_at_rfc3339 as server time. Transport or receipt failure is unconfirmed: local reports remain, the command exits nonzero with AFDATA error.local_result, and it never follows redirects or automatically retries. To publish a reviewed existing JSON or explicitly retry publication, use vps-bench submit --report-file FILE --site ORIGIN --market zh|en. This command is explicit publication consent and never reruns measurements or modifies the original report. Each attempt preserves earlier receipts, using a UUID suffix when the default receipt filename exists. Its --dry-run only describes the plan without reading the report. Check the receipt processing_state; acceptance is distinct from completed processing.