Acquisition switchboard: one neutral entry point that gets a Target from a URL by the least-abnormal CaptureMethod for the circumstance, driven by a per-site SiteProfile, returning a typed AcquisitionReport of what it got and which rung got it. Ladder engine mirrors infrastructure-fetcher's retryable-descent idiom over pluggable Rung impls (HttpFetch + MetadataSidecar always on; BrowserDom/ScreenshotOcr behind the cdp/ocr features). Foundation only: does not build a link graph, not products, not the temporal index -- see docs/userstories/sprint-3.25-acquire.md.
| Tier | infrastructure |
| Role | unclassified (baselined) |
| Path | crates/infrastructure/acquire |
| Edition | 2021 |
| Targets | infrastructure_acquire |
| Public items | 46 across 12 modules |
| Tests | 66 |
What it is for
infrastructure-acquire -- the acquisition switchboard (sprint 3.25 foundation; see docs/userstories/sprint-3.25-acquire.md).
One neutral library crate gets a Target from a URL by the least-abnormal CaptureMethod for the circumstance, driven by a per-site SiteProfile, and returns a typed AcquisitionReport of what it got and which rung got it.
# What's in this foundation sprint
- Switchboard types (
method,target,profile,report) --
pure, fully unit-tested.
- The ladder engine (
ladder) -- pure logic over arung::Rung
trait object, unit-tested with mock rungs.
HttpFetch+MetadataSidecarrungs (rungs::http,rungs::metadata)
-- always compiled, composing infrastructure-fetcher/infrastructure-storage and domain-domain-survey.
BrowserDom(cdpfeature) andScreenshotOcr(ocrfeature) rungs
-- optional, no live browser/tesseract dependency in a default build.
# Non-goals (see the sprint story)
forensic bundle, not API/feed vendor adapters, not PDF/perceptual/OCR word-box capabilities. Those compose this crate in later sprints.
# Sync/async bridge (T3)
infrastructure-browser-automation/infrastructure-browser-cdp and infrastructure-screen-capture are synchronous crates (blocking CDP I/O over a dedicated OS thread, blocking xcap display capture). Their rungs bridge into this crate's async fn attempt via tokio::task::spawn_blocking, matching the workspace's established seam for wrapping a sync library crate from async code -- see rungs::browser and rungs::ocr (feature-gated; landing in Commit 3).
Capabilities
MetadataRequest
Top-level composition: run the ladder, then attach the metadata sidecar
| Item |
|---|
pub struct MetadataRequest<'a> |
async fn acquire(url : Url, target : Target, capabilities : & Capabilities, rungs : & (CaptureMethod, & dyn Rung), metadata : Option <MetadataRequest <'_>>, started_at : DateTime <Utc>, finished_at : DateTime <Utc>,) -> AcquisitionReport |
ladder (other)
The ladder engine: run enabled CaptureMethods in order, stop at the
| Item |
|---|
async fn run_ladder(url : Url, target : Target, capabilities : & Capabilities, available : & (CaptureMethod, & dyn Rung), started_at : DateTime <Utc>, finished_at : DateTime <Utc>,) -> AcquisitionReport |
CaptureMethod
CaptureMethod -- the "how" axis of the switchboard (proposal §2).
| Item |
|---|
pub enum CaptureMethod |
Capabilities
SiteProfile / Capabilities -- the per-site capability switchboard
| Item |
|---|
pub struct Capabilities |
Capabilities :: fn all_auto() -> Self |
Capabilities :: fn is_enabled(& self, method : CaptureMethod) -> bool |
Capabilities :: fn resolved_order(& self) -> Vec <CaptureMethod> |
MethodOrder
SiteProfile / Capabilities -- the per-site capability switchboard
| Item |
|---|
pub enum MethodOrder |
RetentionPolicy
SiteProfile / Capabilities -- the per-site capability switchboard
| Item |
|---|
pub enum RetentionPolicy |
SiteProfile
SiteProfile / Capabilities -- the per-site capability switchboard
| Item |
|---|
pub struct SiteProfile |
AcquisitionReport
AcquisitionReport -- what the ladder got, and which rung got it.
| Item |
|---|
pub struct AcquisitionReport |
AcquisitionReport :: fn is_satisfied(& self) -> bool |
ArtifactKind
AcquisitionReport -- what the ladder got, and which rung got it.
| Item |
|---|
pub enum ArtifactKind |
Attempt
AcquisitionReport -- what the ladder got, and which rung got it.
| Item |
|---|
pub struct Attempt |
AttemptResult
AcquisitionReport -- what the ladder got, and which rung got it.
| Item |
|---|
pub enum AttemptResult |
StoredArtifact
AcquisitionReport -- what the ladder got, and which rung got it.
| Item |
|---|
pub struct StoredArtifact |
StoredArtifact :: fn new(method : CaptureMethod, kind : ArtifactKind, artifact : ArtifactRef) -> Self |
ArtifactRef
Rung -- one capture method's contract with the ladder engine.
| Item |
|---|
pub struct ArtifactRef |
Rung
Rung -- one capture method's contract with the ladder engine.
| Item |
|---|
pub trait Rung |
RungContext
Rung -- one capture method's contract with the ladder engine.
| Item |
|---|
pub struct RungContext |
RungError
Rung -- one capture method's contract with the ladder engine.
| Item |
|---|
pub struct RungError |
RungError :: fn new(method : CaptureMethod, err : impl std::fmt::Display) -> Self |
RungError :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result |
RungOutcome
Rung -- one capture method's contract with the ladder engine.
| Item |
|---|
pub struct RungOutcome |
BrowserDomRung
BrowserDomRung -- the BrowserDom capture method (feature cdp).
| Item |
|---|
pub struct BrowserDomRung<'a> |
BrowserDomRung<'_>
BrowserDomRung -- the BrowserDom capture method (feature cdp).
| Item |
|---|
BrowserDomRung<'_> :: fn method(& self) -> CaptureMethod |
BrowserDomRung<'_> :: async fn attempt(& self, ctx : & RungContext) -> Result <RungOutcome, RungError> |
BrowserDomRung<'a>
BrowserDomRung -- the BrowserDom capture method (feature cdp).
| Item |
|---|
BrowserDomRung<'a> :: fn new(ws_url : impl Into <String>, storage : & 'a dyn StorageBackend, tenant_id : Uuid, capture_screenshot : bool,) -> Self |
HttpFetchRung
HttpFetchRung -- the HttpFetch capture method.
| Item |
|---|
pub struct HttpFetchRung<'a> |
HttpFetchRung<'_>
HttpFetchRung -- the HttpFetch capture method.
| Item |
|---|
HttpFetchRung<'_> :: fn method(& self) -> CaptureMethod |
HttpFetchRung<'_> :: async fn attempt(& self, ctx : & RungContext) -> Result <RungOutcome, RungError> |
HttpFetchRung<'a>
HttpFetchRung -- the HttpFetch capture method.
| Item |
|---|
HttpFetchRung<'a> :: fn new(fetcher : & 'a Fetcher, storage : & 'a dyn StorageBackend, tenant_id : Uuid) -> Self |
rungs::metadata (other)
MetadataSidecar -- RDAP domain-registration metadata captured alongside
| Item |
|---|
pub const DEFAULT_MAX_RDAP_BYTES: usize |
RdapTransport
MetadataSidecar -- RDAP domain-registration metadata captured alongside
| Item |
|---|
pub trait RdapTransport |
async fn capture_metadata(transport : & dyn RdapTransport, rdap_url : & Url,) -> Observed <DomainRegistration> |
ReqwestRdapTransport
MetadataSidecar -- RDAP domain-registration metadata captured alongside
| Item |
|---|
pub struct ReqwestRdapTransport |
ReqwestRdapTransport :: fn new(max_bytes : usize) -> Result <Self, infrastructure_fetcher::SafeHttpError> |
ReqwestRdapTransport :: async fn get(& self, url : & Url) -> Result <(u16, Vec <u8>), String> |
ScreenshotOcrRung
ScreenshotOcrRung -- the ScreenshotOcr capture method (feature ocr).
| Item |
|---|
pub struct ScreenshotOcrRung<'a, E : OcrEngine> |
ScreenshotOcrRung<'_,E>
ScreenshotOcrRung -- the ScreenshotOcr capture method (feature ocr).
| Item |
|---|
ScreenshotOcrRung<'_,E> :: fn method(& self) -> CaptureMethod |
ScreenshotOcrRung<'_,E> :: async fn attempt(& self, _ctx : & RungContext) -> Result <RungOutcome, RungError> |
ScreenshotOcrRung<'a,E>
ScreenshotOcrRung -- the ScreenshotOcr capture method (feature ocr).
| Item |
|---|
ScreenshotOcrRung<'a,E> :: fn new(ocr : E, storage : & 'a dyn StorageBackend, tenant_id : Uuid) -> Self |
Target
Target -- the "what" axis of the switchboard (proposal §2) and its
| Item |
|---|
pub enum Target |
Target :: fn is_satisfied(& self, content : & str) -> bool |
Target :: fn matched_text(& self, content : & str) -> Option <String> |
How to use it
No examples/ target and no doctest in this crate's rustdoc. The tests listed under Verification are the closest executable usage.
Module structure
infrastructure_acquire
acquireladdermethodprofilereportrungrungsrungs::browserrungs::httprungs::metadatarungs::ocrtarget
flowchart TD n_infrastructure_acquire["infrastructure_acquire"] n_infrastructure_acquire --> n_acquire["acquire"] n_infrastructure_acquire --> n_ladder["ladder"] n_infrastructure_acquire --> n_method["method"] n_infrastructure_acquire --> n_profile["profile"] n_infrastructure_acquire --> n_report["report"] n_infrastructure_acquire --> n_rung["rung"] n_infrastructure_acquire --> n_rungs["rungs"] n_rungs --> n_rungs__browser["browser"] n_rungs --> n_rungs__http["http"] n_rungs --> n_rungs__metadata["metadata"] n_rungs --> n_rungs__ocr["ocr"] n_infrastructure_acquire --> n_target["target"]
Public surface
`acquire`
| Item | What it is |
|---|---|
pub struct MetadataRequest<'a> | What's needed to run MetadataSidecar alongside the ladder |
async fn acquire(url : Url, target : Target, capabilities : & Capabilities, rungs : & (CaptureMethod, & dyn Rung), metadata : Option <MetadataRequest <'_>>, started_at : DateTime <Utc>, finished_at : DateTime <Utc>,) -> AcquisitionReport | Run the acquisition ladder against url/target, then -- ONLY if MetadataSidecar is enabled in capabilities AND metadata was supplied -- attach the RDAP sidecar result |
`ladder`
| Item | What it is |
|---|---|
async fn run_ladder(url : Url, target : Target, capabilities : & Capabilities, available : & (CaptureMethod, & dyn Rung), started_at : DateTime <Utc>, finished_at : DateTime <Utc>,) -> AcquisitionReport | Run the ladder against available rungs, in the order capabilities.resolved_order() resolves to |
`method`
| Item | What it is |
|---|---|
pub enum CaptureMethod | How a rung captures a target, ordered least- to most-abnormal per the capture ladder (docs/proposals/web-acquisition-platform.md §3) |
`profile`
| Item | What it is |
|---|---|
pub enum MethodOrder | Which order enabled CaptureMethods run in. |
pub struct Capabilities | Per-capability toggles + ordering for one site/profile. |
Capabilities :: fn all_auto() -> Self | All methods enabled, Auto order. |
Capabilities :: fn is_enabled(& self, method : CaptureMethod) -> bool | — |
Capabilities :: fn resolved_order(& self) -> Vec <CaptureMethod> | The ladder-eligible methods (excludes MetadataSidecar, which is never ladder-ordered), enabled and in effective order |
pub enum RetentionPolicy | Recorded-not-enforced in v1 (sprint story, Scope IN): a value carried on the report / profile for a downstream retention-enforcement sprint to consume, never acted on here. |
pub struct SiteProfile | One site's switchboard settings. |
`report`
| Item | What it is |
|---|---|
pub enum AttemptResult | One rung's disposition within a ladder run. |
pub struct Attempt | One rung's attempt record, in ladder order. |
pub enum ArtifactKind | Which stored artifact a StoredArtifact is. |
pub struct StoredArtifact | A stored-artifact identity produced during acquisition. |
StoredArtifact :: fn new(method : CaptureMethod, kind : ArtifactKind, artifact : ArtifactRef) -> Self | — |
pub struct AcquisitionReport | What one acquisition run did: which rung (if any) satisfied the target, every attempt in ladder order with its rejection/error reason, every stored-artifact identity produced along the way, and the metadata sidecar result (if the capability was on) -- captured alongside content, never counted as target satisfaction. |
AcquisitionReport :: fn is_satisfied(& self) -> bool | — |
`rung`
| Item | What it is |
|---|---|
pub struct RungContext | What one rung attempt was asked to do, and when |
pub struct ArtifactRef | A stored-artifact identity a rung produced (content bytes, a screenshot, ...) |
pub struct RungOutcome | What a rung attempt produced, before target evaluation. |
pub struct RungError | A rung's typed failure |
RungError :: fn new(method : CaptureMethod, err : impl std::fmt::Display) -> Self | — |
RungError :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result | — |
pub trait Rung | One capture method's contract with the ladder engine |
`rungs::browser`
| Item | What it is |
|---|---|
pub struct BrowserDomRung<'a> | BrowserDom rung: connect to a running Chrome/Chromium over CDP, navigate to ctx.url, read the settled DOM as HTML, and -- when capture_screenshot is on -- store a PNG screenshot as a retained, first-class artifact INDEPENDENT of whether ScreenshotOcr ever runs (sprint story, Scope IN) |
BrowserDomRung<'a> :: fn new(ws_url : impl Into <String>, storage : & 'a dyn StorageBackend, tenant_id : Uuid, capture_screenshot : bool,) -> Self | — |
BrowserDomRung<'_> :: fn method(& self) -> CaptureMethod | — |
BrowserDomRung<'_> :: async fn attempt(& self, ctx : & RungContext) -> Result <RungOutcome, RungError> | — |
`rungs::http`
| Item | What it is |
|---|---|
pub struct HttpFetchRung<'a> | HttpFetch rung: a infrastructure-fetcher GET, decoded lossily to text for target evaluation, content-addressed via the same StorageBackend the Fetcher was built with |
HttpFetchRung<'a> :: fn new(fetcher : & 'a Fetcher, storage : & 'a dyn StorageBackend, tenant_id : Uuid) -> Self | — |
HttpFetchRung<'_> :: fn method(& self) -> CaptureMethod | — |
HttpFetchRung<'_> :: async fn attempt(& self, ctx : & RungContext) -> Result <RungOutcome, RungError> | — |
`rungs::metadata`
| Item | What it is |
|---|---|
pub trait RdapTransport | The sidecar's HTTP seam -- lets tests supply canned (status, body) pairs with no live RDAP server, and is what a caller swaps for a fake in unit tests. |
pub const DEFAULT_MAX_RDAP_BYTES: usize | Default cap on an RDAP response body -- generous for RDAP's small JSON payloads, small enough to bound a hostile/misconfigured server. |
pub struct ReqwestRdapTransport | The real transport: a minimal capped GET, built on SafeHttpClient::inner() so the pinned DNS resolver protects domain hosts (see the module doc's SSRF section) |
ReqwestRdapTransport :: fn new(max_bytes : usize) -> Result <Self, infrastructure_fetcher::SafeHttpError> | # Errors Propagates SafeHttpClient::builder().build()'s error (TLS backend init failure) -- essentially infallible in practice. |
ReqwestRdapTransport :: async fn get(& self, url : & Url) -> Result <(u16, Vec <u8>), String> | — |
async fn capture_metadata(transport : & dyn RdapTransport, rdap_url : & Url,) -> Observed <DomainRegistration> | Capture the RDAP-based metadata sidecar for rdap_url |
`rungs::ocr`
| Item | What it is |
|---|---|
pub struct ScreenshotOcrRung<'a, E : OcrEngine> | ScreenshotOcr rung: whole-monitor screenshot (infrastructure-screen-capture, sync) -> local OCR text (infrastructure-ocr-tesseract, async, on-host, no egress) |
ScreenshotOcrRung<'a,E> :: fn new(ocr : E, storage : & 'a dyn StorageBackend, tenant_id : Uuid) -> Self | — |
ScreenshotOcrRung<'_,E> :: fn method(& self) -> CaptureMethod | — |
ScreenshotOcrRung<'_,E> :: async fn attempt(& self, _ctx : & RungContext) -> Result <RungOutcome, RungError> | — |
`target`
| Item | What it is |
|---|---|
pub enum Target | What to get from a page |
Target :: fn is_satisfied(& self, content : & str) -> bool | Evaluate the sufficiency predicate against a rung's raw output text (HTML for HttpFetch/BrowserDom; plain text for ScreenshotOcr, which trivially never satisfies Selector/Field since OCR output carries no markup -- only Everything/LinkText-as-substring can pass against it) |
Target :: fn matched_text(& self, content : & str) -> Option <String> | Evaluate the predicate AND return the target-relevant text it resolved to when satisfied -- the ladder attaches this to a Satisfied attempt (sprint AC: "the extracted target text") |
Re-exports. Exported here, defined elsewhere.
| Export | Defined in |
|---|---|
BrowserDomRung | rungs::browser::BrowserDomRung |
CaptureMethod | method::CaptureMethod |
HttpFetchRung | rungs::http::HttpFetchRung |
ScreenshotOcrRung | rungs::ocr::ScreenshotOcrRung |
Target | target::Target |
run_ladder | ladder::run_ladder |
{AcquisitionReport,ArtifactKind,Attempt,AttemptResult,StoredArtifact} | report::{AcquisitionReport,ArtifactKind,Attempt,AttemptResult,StoredArtifact} |
{ArtifactRef,Rung,RungContext,RungError,RungOutcome} | rung::{ArtifactRef,Rung,RungContext,RungError,RungOutcome} |
{Capabilities,MethodOrder,RetentionPolicy,SiteProfile} | profile::{Capabilities,MethodOrder,RetentionPolicy,SiteProfile} |
{acquireasrun_acquire,MetadataRequest} | acquire::{acquireasrun_acquire,MetadataRequest} |
{capture_metadata,RdapTransport,ReqwestRdapTransport} | rungs::metadata::{capture_metadata,RdapTransport,ReqwestRdapTransport} |
Boundary
Reaches into domain.
Shares tier infrastructure with 82 other crates: infrastructure-adapters-google-calendar, infrastructure-adapters-google-gmail, infrastructure-adapters-google-places, infrastructure-adapters-google-trends, infrastructure-adapters-shodan, infrastructure-adapters-yelp, infrastructure-agent, infrastructure-ai, … (82 total).
_What this crate deliberately does NOT own is a judgment. No committed registry records one for it, so none is stated here._
Where it sits
| Tier (ontology) | infrastructure |
| Architectural role (taxonomy) | unclassified (baselined) |
| Location | crates/infrastructure/acquire |
| Vocabulary in force (lexicon) | current |
Tier flow. Which tiers this crate's own edges cross.
flowchart LR n_infrastructure["infrastructure"] --> n_domain["domain"]
Dependencies
Runtime, in this workspace.
| Crate | Tier | Optional | Only on |
|---|---|---|---|
| `domain-domain-survey` | domain | no | always |
| `infrastructure-browser-automation` | infrastructure | yes | always |
| `infrastructure-browser-cdp` | infrastructure | yes | always |
| `infrastructure-fetcher` | infrastructure | no | always |
| `infrastructure-html-text` | infrastructure | no | always |
| `infrastructure-ocr-engine` | infrastructure | yes | always |
| `infrastructure-ocr-tesseract` | infrastructure | yes | always |
| `infrastructure-screen-capture` | infrastructure | yes | always |
| `infrastructure-storage` | infrastructure | no | always |
Runtime, from outside the workspace.
| Crate | Requirement | Features | Optional | Only on |
|---|---|---|---|---|
async-trait | ^0.1 | — | no | always |
base64 | ^0.22 | — | yes | always |
chrono | ^0.4 | serde | no | always |
lol_html | ^3.0.1 | — | no | always |
reqwest | ^0.12 | rustls-tls | no | always |
serde | ^1 | derive, derive | no | always |
serde_json | ^1 | — | no | always |
thiserror | ^2 | — | no | always |
tokio | ^1 | full | no | always |
url | ^2 | — | no | always |
uuid | ^1 | v4, v7, serde, js, v4, serde | no | always |
Development, in this workspace.
| Crate | Tier | Optional | Only on |
|---|---|---|---|
| `infrastructure-fetcher` | infrastructure | no | always |
| `operations-rate-limit` | operations | no | always |
Development, from outside the workspace.
| Crate | Requirement | Features | Optional | Only on |
|---|---|---|---|---|
tempfile | ^3 | — | no | always |
wiremock | ^0.6 | — | no | always |
Build. None.
Depended on by. Nothing in this workspace.
Signal flow — what reaches this crate, and what it reaches.
flowchart LR SELF["infrastructure-acquire"] SELF -->|development| n_infrastructure_fetcher["infrastructure-fetcher"] SELF -->|development| n_operations_rate_limit["operations-rate-limit"] SELF -->|runtime| n_domain_domain_survey["domain-domain-survey"] SELF -->|runtime| n_infrastructure_browser_automation["infrastructure-browser-automation"] SELF -->|runtime| n_infrastructure_browser_cdp["infrastructure-browser-cdp"] SELF -->|runtime| n_infrastructure_fetcher["infrastructure-fetcher"] SELF -->|runtime| n_infrastructure_html_text["infrastructure-html-text"] SELF -->|runtime| n_infrastructure_ocr_engine["infrastructure-ocr-engine"] SELF -->|runtime| n_infrastructure_ocr_tesseract["infrastructure-ocr-tesseract"] SELF -->|runtime| n_infrastructure_screen_capture["infrastructure-screen-capture"] SELF -->|runtime| n_infrastructure_storage["infrastructure-storage"] classDef self fill:#1f883d,stroke:#1f883d,color:#fff; class SELF self;
Feature flags
| Feature | Enables | On by default |
|---|---|---|
cdp | dep:infrastructure-browser-automation, dep:infrastructure-browser-cdp, dep:base64 | no |
default | — | yes |
ocr | dep:infrastructure-screen-capture, dep:infrastructure-ocr-tesseract, dep:infrastructure-ocr-engine | no |
flowchart LR n_cdp["cdp"] --> n_dep_infrastructure_browser_automation["dep:infrastructure-browser-automation"] n_cdp["cdp"] --> n_dep_infrastructure_browser_cdp["dep:infrastructure-browser-cdp"] n_cdp["cdp"] --> n_dep_base64["dep:base64"] n_default["default"] n_ocr["ocr"] --> n_dep_infrastructure_screen_capture["dep:infrastructure-screen-capture"] n_ocr["ocr"] --> n_dep_infrastructure_ocr_tesseract["dep:infrastructure-ocr-tesseract"] n_ocr["ocr"] --> n_dep_infrastructure_ocr_engine["dep:infrastructure-ocr-engine"]
Targets
| Kind | Name | Source |
|---|---|---|
| lib | infrastructure_acquire | `src/lib.rs` |
Error model
| Error type | Named by |
|---|---|
RungError | declared, no public signature returns it |
Operational characteristics
| Property | Evidence |
|---|---|
| async public surface | yes |
| async runtime | yes |
| database access | none detected |
| network I/O | yes |
| unsafe code | none detected |
| environment variables | yes |
No unsafe block, unsafe fn, unsafe impl or unsafe trait was found by the parser anywhere in this crate's source.
Configuration
| Variable | Read in |
|---|---|
ACQUIRE_TEST_CDP_WS_URL | src/rungs/browser.rs |
Related capabilities
No workspace crate depends on this one.
Verification
| Kind | Count |
|---|---|
| Unit tests | 66 |
| Integration tests | 0 |
| Examples | 0 |
| Doctests | 0 |
Evidence by module. How often each public module is named by something executable.
| Module | Tests | Examples | Consumers |
|---|---|---|---|
acquire | 2 | 0 | 0 |
ladder | 1 | 0 | 0 |
method | 1 | 0 | 0 |
profile | 4 | 0 | 0 |
report | 5 | 0 | 0 |
rung | 5 | 0 | 0 |
rungs::browser | 1 | 0 | 0 |
rungs::http | 1 | 0 | 0 |
rungs::metadata | 4 | 0 | 0 |
rungs::ocr | 1 | 0 | 0 |
target | 1 | 0 | 0 |
What the tests establish, by name:
metadata_is_none_when_enabled_but_no_request_was_supplied—src/acquire.rsmetadata_is_none_when_the_capability_is_off_even_if_supplied—src/acquire.rsmetadata_sidecar_never_affects_satisfied_by—src/acquire.rsa_method_with_no_wired_rung_is_skipped_without_an_attempt_record—src/ladder.rsa_rung_error_is_surfaced_never_swallowed_and_the_ladder_descends—src/ladder.rsa_screenshot_is_recorded_as_its_own_artifact_independent_of_content—src/ladder.rsaborts_with_no_satisfaction_once_every_rung_is_exhausted—src/ladder.rsdescends_to_the_next_rung_on_rejection—src/ladder.rsfixed_order_is_honored_over_auto—src/ladder.rsno_enabled_methods_yields_an_unsatisfied_report_with_no_attempts—src/ladder.rsstops_at_the_first_satisfying_rung—src/ladder.rsstored_artifacts_are_recorded_for_every_successful_rung_attempt—src/ladder.rsauto_order_excludes_metadata_sidecar—src/method.rsauto_order_is_least_to_most_abnormal—src/method.rsserde_uses_snake_case—src/method.rsall_auto_enables_every_ladder_method—src/profile.rsauto_order_resolves_to_the_auto_order_filtered_by_enabled—src/profile.rsfixed_order_drops_a_disabled_method_rather_than_erroring—src/profile.rsfixed_order_is_honored_verbatim_when_all_enabled—src/profile.rsmetadata_sidecar_never_appears_in_resolved_order_even_if_enabled—src/profile.rsprofile_serde_round_trips—src/profile.rsretention_policy_serde_round_trips_time_windowed—src/profile.rsattempt_result_errored_carries_the_message_through_serde—src/report.rsattempt_result_rejected_carries_the_reason_through_serde—src/report.rsis_satisfied_reflects_satisfied_by—src/report.rsreport_serde_round_trips_with_a_present_metadata_result—src/report.rsreport_serde_round_trips_with_an_unknown_metadata_result—src/report.rsreport_serde_round_trips_with_no_metadata—src/report.rsrung_error_is_a_std_error—src/rung.rsrung_error_message_preserves_the_underlying_display_verbatim—src/rung.rs- _… 36 more_
Documentation coverage
| Measure | Documented | Total |
|---|---|---|
| Public items with rustdoc | 31 | 46 |
Public modules with a //! block | 12 | 12 |
pie showData
title Public items with rustdoc
"Documented" : 31
"No rustdoc detected" : 15
Metrics
| Metric | Value |
|---|---|
| Rust source files | 13 |
| Source lines | 2527 |
| Code lines | 1809 |
| Public API items | 46 |
| Public modules | 12 |
| Tests | 66 |
| Examples | 0 |
| Cargo features | 3 |
| Direct runtime dependencies | 20 |
| Workspace reverse dependencies | 0 |
pie showData
title Public API by kind
"constant" : 1
"enum" : 6
"function" : 3
"method" : 20
"struct" : 14
"trait" : 2
pie showData
title Rust source composition
"Code" : 1809
"Blank or comment" : 718
Generation
Rendered by tools-corpus corpus readme from repository evidence alone, renderer schema 2, lexicon current. No model, network service or database was consulted. Regenerate with tools-corpus corpus readme --write; verify with --check.