ADR 0027: Record the post-workspace WAF/evasion salvage epoch
- Status: Accepted
- Date: 2026-09-01
- Extends: ADR 0025 with a separate source epoch
- Runtime effect: None
Context
The pre-workspace salvage inventory in ADR 0025 covers the deleted 38-file
src/scanner/ monolith. A later and distinct removal wave occurred after the
Cargo workspace existed. Source snapshot
52238460484e7a1469f1028fdd6361072a0daba5 contained WAF fingerprinting,
adaptive selection, scoring, and payload-transformation code under
crates/venom-scanner. Its direct child
5a0563886658859b6e3e163f732a298914b10800 removed five relevant files and
materially narrowed other files in that capability graph.
This second epoch must not be folded into the first ledger. The source roots, build context, deletion mechanism, and modern replacements differ. The scoped inventory contains 13 historical files and 39 component-level decisions.
The historical waf.rs also combined concerns that the current architecture
keeps separate. Product fingerprinting, status observations, payload
transformations, request-shape mutation, and claims of bypass shared one
module and a generic dispatcher. Current Venom already has bounded,
observation-only defense fingerprinting and typed defense state/transition
evidence. Blindly restoring the old source would duplicate that work while
reintroducing selection without typed compatibility, semantic verification,
request accounting, or conservative claim authority.
Decision
- Maintain
salvage/post-workspace-waf-evasion/ledger.tomlas the authoritative strictvenom.post-workspace-waf-evasion-salvage/v1inventory. Its generated readable projection isdocs/history/post-workspace-waf-evasion-salvage.md; the Markdown is not a second classification source. - Keep this ledger separate from
salvage/historical-scanner/ledger.toml. Neither epoch changes the other's source scope, semantic digest, component meaning, or restoration status. - Bind all 13 scoped historical paths to exact local Git blob identities and byte sizes. Classify 39 components with closed dispositions, priorities, statuses, modern destinations, prerequisites, prohibited restoration behavior, and factual rationale.
- Validate the epoch with
cargo run --locked -p xtask -- waf-evasion-salvage. The validator uses local Git objects only, proves the source/quarantine parent relationship, validates removed or narrowed state, recalculates a deterministic semantic digest, and rejects a stale generated report. It never compiles, interprets, or executes historical source and never accesses the network. - Treat historical WAF fingerprinting as superseded by the modern
defensedomain and its bounded fingerprint, state, transition, and evidence contracts. Historical neutral percent and hexadecimal encoding map only to the existing payload-strategy encoding boundary. These replacement mappings describe current ownership; they grant no execution or claim authority. - Preserve grammar-aware case and whitespace concepts, explicit encoding-layer concepts, transformation taxonomy, and useful ranking dimensions only as recovery metadata requiring new contracts. A ledger disposition is not an executable transform or a promise to ship one.
- Continue rejecting status-code-to-evasion mapping, generic transformation dispatch, parameter pollution as an ordinary payload mutation, semantic truncation claims, rate-limit evasion, HTTP splitting, CRLF injection, and unverified bypass claims.
- Do not restore
crates/venom-scanner/src/waf.rs, the retiredadaptive::{payloads,scoring,strategy}modules, the oldpayload_strategies::normalizationmodule, or the historicalEvasionTechniquedispatcher. Existing architecture gates remain intact. - Add no scanner, CLI, API, proxy, exploit, artifact, network, filesystem,
process, or browser runtime. Default
venom scan, request authority, evidence semantics, and claim policy remain unchanged.
Consequences
- Both removal waves remain independently auditable without making either historical tree current product authority.
- Modern defense observation is distinguished from future payload transformation. A fingerprint or status code cannot authorize execution.
- Recoverable transformation concepts have provenance and explicit prerequisites without restoring attack-shaped code or unsupported claims.
- Exact local-Git validation detects missing paths, extra paths, blob/size drift, removal-state drift, contradictory classifications, digest drift, and stale generated documentation.
- A future normalization-resilience runtime, if separately reviewed, must use explicit opt-in, typed compatibility, bounded shared-broker execution, application-semantic verification, replay, and conservative authority. This decision implements none of that runtime.
Alternatives considered
- Merge the two historical epochs into one ledger. Rejected because it would obscure distinct source roots, removal events, modern replacements, and restoration status.
- Restore
waf.rsor the adaptive modules. Rejected because those sources mix observation, mutation, dispatch, and claim authority and conflict with current architecture gates. - Treat current defense fingerprinting as missing capability. Rejected because bounded typed fingerprinting already exists in the modern defense domain; the removed exact-string detector is superseded rather than lost.
- Activate transformations while inventorying them. Rejected because transformation execution requires a separate feature, runtime policy, compatibility contract, evidence model, semantic verifier, replay, budget, and exact-head CI review.
- Use HTTP status alone as WAF or bypass evidence. Rejected because a bare status proves neither a defensive product, candidate-specific engagement, semantic equivalence, nor application impact.