Guiding principle: keep the tool small, transparent, and predictable. Prefer simple and elegant improvements over feature bloat.
- Adopt
uvas the default workflow. - Keep dependencies minimal (stdlib-first).
- Add a small automated test baseline for core logic.
- Keep CLI behavior stable while improving reliability.
- Status: complete.
- Split
volt.pyinto focused modules:climodelssources(ct/search/s3/tools)reporting
- Avoid introducing abstractions until they reduce code complexity.
- Status: complete.
- Extracted
modelsandreportingwith no behavior change. - Extracted
sources/ct.py,sources/search.py,sources/storage.py,sources/takeover.py, andsources/tools.py. - Extracted
cli.py(build_parserandmain) while keeping compatibility wrappers involt.py. - Extracted
run_scanorchestration intocli.pywhile keepingvolt.run_scanas a compatibility wrapper. - Extracted CLI/input helpers (
load_domains,parse_keywords,parse_search_providers,positive_int) intocli.pywith compatibility wrappers. - Extracted generic runtime helpers (
log,init_source_health,normalize_domain,check_tool,run_command) intocore.pywith compatibility wrappers. - Extracted HTTP transport helper (
fetch_url) intonetworking.pywith wrapper injection preserving patched-test behavior. - Extracted takeover helper primitives into
sources/takeover.py(fetch_doh_cname_records, signature/fingerprint matching, endpoint probe) with compatibility wrappers. - Extracted Azure Blob parsing/classification helpers into
sources/storage.pywith compatibility wrappers. - Extracted structured-output parsing/provenance helpers into
parsing.pywith compatibility wrappers. - Extracted search helper primitives into
sources/search.py(dork/commoncrawl query builders, index discovery, result normalization, leak classification) with compatibility wrappers. - Extracted storage naming/wordlist helpers into
sources/storage.py(S3 candidate extraction + Azure account/container helpers) with compatibility wrappers. - Extracted static configuration constants into
constants.pywhile preservingvoltconstant exports. - Added canonical
models.pyandreporting.pymodules; retainedvolt_models.py/volt_reporting.pyas compatibility shims.
- Extracted
- Improve source-level error reporting in output JSON.
- Add conservative retries/backoff for transient HTTP failures.
- Keep output deterministic and easy to diff.
- Status: complete.
- Added run-level
source_healthto reports. - Added structured per-source
error_typesand cappederror_samplesinsource_health. - Added automatic S3 list-probe fallback for ambiguous HEAD responses.
- Added GCP bucket existence/listability checks.
- Added Azure Blob CNAME-derived container listability checks.
- Added lightweight HTTP retries/backoff for transient fetch failures.
- Added amass compatibility fallback (
-srcand-json) with plain-output fallback. - Added pluggable search provider support around Common Crawl.
- Added passive subdomain takeover detection via CNAME + fingerprint matching.
- Added curated takeover signatures with edge-case handling.
- Tuned HTTP retry budgets by source class (CT/search/takeover) while keeping cloud probe retries at
0. - Added deterministic normalization for
source_healthnotes/error maps/samples before JSON output.
- Added run-level
- Expand test coverage for source parsing and edge cases.
- Add linting/formatting checks via
uv run. - Optionally add a lightweight CI workflow once local test/lint steps are stable.
- Status: complete.
- Added CI workflow at
.github/workflows/ci.ymlrunning Ruff lint/format checks, static compile checks, and unit-test discovery. - Added
ruffdev dependency group and standardized local/CI lint+format checks onuv run ruff .... - Expanded automated tests for edge-case parsing and partial-failure source-health transitions.
- Added parser edge-case tests for S3/Azure error-code extraction fallbacks.
- Added deterministic partial-failure simulation commands to
docs/TESTING.md.
- Added CI workflow at
- Make distribution first-class:
- Ship an installable package with a
voltCLI entry point. - Move from script-first usage to command-first usage.
- Ship an installable package with a
- Stabilize default operator experience:
- Default search provider to
commoncrawl. - Continue surfacing source reliability clearly via
source_health.
- Default search provider to
- Add release/governance basics:
- Introduce release notes/changelog and versioned release process.
- Add
SECURITY.mdand contribution guidance for external users.
- Improve operational readiness:
- Add bounded live smoke validation as scheduled/manual CI (separate from unit gate).
- Keep deterministic tests as the required merge gate.
- Status: in progress.
- Install + run path is one command (
uv tool/pipx) withvolt --help. - First tagged release with versioned notes and upgrade guidance.
- Operator docs include triage workflow for indexed-leak/cloud/takeover findings.
- CI includes a non-blocking bounded live smoke job for upstream-source drift detection.
- Week 1: Product lock and acceptance criteria
- Freeze customer-facing MVP scope and non-goals.
- Define launch gates and map each gate to measurable checks.
- Deliverable:
docs/ROADMAP.md+ release checklist updated with final gates.
- Week 2: Distribution and install UX
- Ship installable package with
voltconsole entrypoint. - Add
--versionand version source-of-truth. - Deliverable: install docs validated on clean environment (
pipxanduv tool).
- Ship installable package with
- Week 3: Safe defaults and operator UX
- Default search provider to
commoncrawland simplify search documentation. - Improve degraded-mode messaging and operator guidance in
source_healthnotes. - Deliverable: updated defaults + docs + regression tests.
- Default search provider to
- Week 4: Reliability hardening
- Expand edge-case handling for upstream parsing/drift and provider outages.
- Add deterministic report fixture tests for schema/output stability.
- Deliverable: green test suite with new reliability-focused coverage.
- Week 5: CI operational readiness
- Add scheduled/manual bounded live-smoke CI job (non-blocking).
- Keep deterministic unit/lint/compile checks as blocking merge gates.
- Deliverable: CI workflow(s) merged with clear pass/fail semantics.
- Week 6: Security and release governance
- Add/validate
SECURITY.md, disclosure flow, and release-note standards. - Add contributor and support-path documentation.
- Deliverable: governance docs merged and linked from README.
- Add/validate
- Week 7: Customer documentation and pilot prep
- Publish quickstart, finding-interpretation, and triage playbooks.
- Prepare pilot runbook and issue-triage process.
- Deliverable: customer docs set complete and review-ready.
- Week 8: Pilot execution and launch decision
- Run pilot with authorized design partners and collect run quality metrics.
- Triage blockers, cut release candidate, and make go/no-go decision.
- Deliverable:
v1.0.0tag if launch gates pass.
-
Milestone
M5-A(Weeks 1-2): Distribution Foundation- Issue: Add installable package metadata and
voltconsole entrypoint.- Acceptance:
pipx install .anduv tool install .both exposevolt --help.
- Acceptance:
- Issue: Add
--versionand centralized version management.- Acceptance: CLI reports project version and release process updates version in one place.
- Issue: Add release checklist and first tagged release workflow.
- Acceptance: documented checklist used to cut a reproducible release candidate.
- Issue: Add installable package metadata and
-
Milestone
M5-B(Weeks 3-5): Reliability and Operator UX- Issue: keep search reliability centered on
commoncrawl.- Acceptance: CLI defaults changed, docs updated, and parser/provider tests pass.
- Issue: Improve degraded-mode guidance in
source_healthand terminal output.- Acceptance: partial/error runs include actionable operator notes with deterministic formatting.
- Issue: Add report fixture tests and upstream-drift reliability tests.
- Acceptance: new tests validate stable schema ordering and common source-failure scenarios.
- Issue: Add non-blocking bounded live-smoke CI workflow.
- Acceptance: workflow runs on schedule/manual trigger and publishes artifacts/results.
- Issue: keep search reliability centered on
-
Milestone
M5-C(Weeks 6-8): Customer Readiness and Launch- Issue: Finalize governance docs (
SECURITY.md,CONTRIBUTING.md, support policy links).- Acceptance: docs merged, linked from README, and tested for clarity in onboarding.
- Issue: Publish customer docs (quickstart + finding triage playbooks).
- Acceptance: new user can complete first successful scan and triage sample findings in under 10 minutes.
- Issue: Run pilot and track launch gates.
- Acceptance: pilot metrics recorded; go/no-go decision logged;
v1.0.0tagged on pass.
- Acceptance: pilot metrics recorded; go/no-go decision logged;
- Issue: Finalize governance docs (
- Finalize the release-candidate checklist and launch criteria.
- Refresh live validation evidence before the next tagged release.
- Continue tightening operator UX around degraded-source handling and public documentation.
- Strict AWS-valid bucket-name filtering before probe execution.
- Region-aware second-phase probes using
x-amz-bucket-regionsignals. - Optional S3 website-endpoint probing (
--s3-website-probe) for static-site exposure. - Endpoint-family awareness in candidate validation (bucket vs access-point/MRAP aliases).
- Optional low retry budget for S3 probe stability (
--s3-probe-retries 1). - Passive reliability hardening for cloaked
NoSuchBucketbehavior:- treat anonymous
NoSuchBucketobject/website responses as ambiguous (unknown) rather than definitive non-existence. - probe unknown-region website endpoints across a conservative region set for stronger passive confirmation.
- treat anonymous
- Dynamic passive canary selection now uses website-probe-aware viability checks (
scripts/select_s3_canary.py), with pilot harness integration.
-
Add strict GCS bucket-name validation before probing.
- Include GCS-specific rules:
3-63chars (or dotful names up to222), no IP-style names, nogoog*prefix, and nogoogle/close misspellings. - Why: removes invalid probes early and prevents wasted budget on impossible candidates.
- Include GCS-specific rules:
-
Add dedicated GCS name-generation tracks for domain-style buckets.
- Keep current hyphenated candidates, and add high-signal dotful candidates from owned domains/hostnames (for example
assets.example.com), because dotful bucket names are first-class in GCS. - Why: materially improves discovery for static-site and domain-aligned bucket naming.
- Keep current hyphenated candidates, and add high-signal dotful candidates from owned domains/hostnames (for example
-
Add XML error-code parsing for GCS responses and classify by error code, not status alone.
- Parse
<Code>from XML responses (AccessDenied,NoSuchBucket, etc.) for list/object probes. - Why:
403and404are much more actionable when paired with XML code, reducing ambiguous outcomes.
- Parse
-
Add second-phase object probe (
GET /<random-probe-key>) to disambiguate existence.- Keep
HEAD+ list probe as primary path, then run object probe only when still ambiguous. - Why: improves true/false existence classification while preserving low-touch behavior.
- Keep
-
Add optional dual-endpoint probing (path-style + virtual-hosted style) with conservative default.
- Probe
https://storage.googleapis.com/<bucket>/...first; optionally fall back tohttps://<bucket>.storage.googleapis.com/...on ambiguous responses. - Why: increases resilience across endpoint behaviors and catches edge cases without changing default operator UX.
- Probe
-
Add confidence guardrails for globally common bucket names.
- Down-rank or suppress weak
likely_existshits when candidate origin is generic (for example single common noun) and target affinity is low. - Why: global bucket namespace creates many unrelated
403 AccessDeniedcollisions; this improves signal precision.
- Down-rank or suppress weak
-
Expand GCS source-health telemetry.
- Track
raw_candidates,filtered_invalid_candidates,filtered_reasons,error_code_counts,ambiguous, andsuppressed_weak_likely. - Why: gives operators transparent diagnostics and supports reliable tuning.
- Track
-
Add optional low retry budget for GCS cloud probes (
0 -> 1) with existing jitter/backoff path.- Why: hardens live reliability under transient network/CDN failures while preserving current defaults.
- PR1: GCS name validator + candidate filtering + telemetry fields.
- PR2: Dotful/domain-style candidate generation path (behind conservative defaults if needed).
- PR3: XML error-code parser + classification matrix updates (
NoSuchBucketvsAccessDenied). - PR4: Second-phase random object probe for ambiguous candidates.
- PR5: Optional dual-endpoint fallback behavior + tests.
- PR6: Confidence guardrails for generic-name collisions + report note updates.
- PR7: Optional GCS probe retry budget + reliability tests + live-smoke refresh.
-
Expand endpoint/suffix coverage beyond
blob.core.windows.net.- Add support for sovereign suffixes (for example
core.usgovcloudapi.net,core.chinacloudapi.cn) and new DNS-zone endpoint patterns (<account>.z[00-99].blob.storage.azure.net). - Why: account discovery and validation currently miss real-world non-default endpoint shapes.
- Add support for sovereign suffixes (for example
-
Strengthen CNAME-driven account discovery from discovered hostnames.
- Detect blob-service endpoints, static website endpoints (
*.web.core.windows.net), and map custom-domain CNAMEs back to storage accounts. - Why: enterprise targets frequently expose storage through custom domains, not raw account hostnames.
- Detect blob-service endpoints, static website endpoints (
-
Add system-container coverage for high-signal exposure paths.
- Probe reserved/system containers with encoded names where applicable (
$web,$root,$logs) in addition to generated names. - Why: static website hosting auto-creates
$web, and these containers are high-value exposure surfaces.
- Probe reserved/system containers with encoded names where applicable (
-
Improve Azure probe pipeline to be endpoint-aware and deterministic.
- Keep current anonymous list probe, but add/standardize container
HEADchecks (restype=container) with explicit API version handling before/alongside list probes. - Why: live behavior differs materially by endpoint and API version, affecting reliability and false negatives.
- Keep current anonymous list probe, but add/standardize container
-
Use error-code-driven classification (not status-only).
- Prioritize
x-ms-error-code+ XML<Code>semantics in classification (NoAuthenticationInformation,AuthenticationFailed,ContainerNotFound,ResourceNotFound,FeatureVersionMismatch). - Why: same HTTP status can map to very different meanings for account/container existence and publicability.
- Prioritize
-
Add optional blob-level anonymous-read checks when list is denied.
- For containers likely configured as blob-public (not container-public), add lightweight object probes (HEAD-first) for common static paths.
- Why: list-denied does not always mean blob reads are denied; current list-only logic can miss real exposures.
-
Add account-first probe caching and scheduling.
- Resolve/account-check once, then fan out container probes only when account reachability is confirmed/likely.
- Why: reduces wasted probes, improves runtime, and increases confidence consistency per account.
-
Expand Azure source-health telemetry for operator triage.
- Add counters for
account_resolved,account_unresolved,error_code_counts,system_container_hits,blob_only_hits, andambiguous. - Why: clear diagnostics make degraded-mode and confidence decisions actionable.
- Add counters for
- PR1: Endpoint suffix expansion + DNS-zone endpoint parsing + account inference upgrades.
- PR2: System-container coverage (
$web/$root/$logs) + validator updates/tests. - PR3: Error-code classification matrix + normalized Azure error telemetry.
- PR4: Endpoint-aware probe orchestration (HEAD/list ordering + account-first caching).
- PR5: Optional blob-only anonymous-read probes for list-denied cases.
- PR6: Optional Azure probe retry budget + reliability/live-smoke refresh.