Putting Age Verification in Context: Promise, Burden, and the Case for Sound Governance
Try the Interactive Explorer To accept the example data and see the results, click the colorful "Evaluate" button in the lower right-hand corner of either:
- Policy (TOML)
- Candidate data (CSV)
Age verification systems sit at the intersection of:
- minor protection
- privacy and data exposure
- surveillance risk
- implementation complexity and user burden
Different approaches shift these tradeoffs in materially different ways.
For example:
- stronger assurance often increases data collection and retention
- centralized systems increase coordination but raise surveillance concerns
- lower-friction systems reduce burden but may weaken protection
This project treats age verification not as a single technical problem, but as a governance and infrastructure design problem.
Each candidate approach is evaluated across six dimensions:
- Assurance Level – strength of age verification
- Privacy Exposure – amount and sensitivity of user data revealed
- Data Retention – how long data persists
- Centralization – where authority and control reside
- User Burden – effort required by individuals
- Reusability – whether verification can be reused across contexts
These are combined into four interpretive lenses:
- Minor Protection
- Privacy Risk
- Surveillance Risk
- Implementation Complexity
The explorer includes representative approaches such as:
- Self Declaration
- Document Upload
- Third-Party Age Token
- Device-Based Estimation
- Government Digital ID
These are not recommendations—they are reference patterns for exploring structural tradeoffs.
The Explorer:
- applies a configurable policy (TOML)
- evaluates candidate approaches (CSV)
- computes weighted profiles across dimensions
- surfaces tensions and rule-based warnings
- enables interactive inspection of outcomes
The system is designed to make assumptions explicit and outcomes inspectable.
This project does not advocate for a specific solution.
It provides a structured way to examine:
- how design choices affect outcomes
- where tradeoffs become significant
- how governance assumptions shape results
This project provides a structured framework for exploring tradeoffs under explicit assumptions and constraints. It:
- frames the issue as one of infrastructure and governance
- recognizes the distribution of costs and benefits
- emphasizes integration with broader systems rather than isolated analysis
The goal is to make tradeoffs visible and inspectable across multiple dimensions.
The contribution is the framework for structured exploration, not the specific values used in any given scenario.
- Constraints, thresholds, and weights are configurable
- Assumptions are explicit and inspectable
- Results are comparative and scenario-dependent
This project does not determine outcomes or recommend decisions. It provides a way to examine how different assumptions and constraints shape results.
Working files are found in these areas:
- data/ - source inputs and scenario configuration
- docs/ - narrative, assumptions, and analysis
- src/ - implementation
- Loads possible configurations from CSV and policy constraints from TOML
- Evaluates hard constraints for each candidate (PASS / FAIL)
- Evaluates scenario-level decisions (APPROVE / CONDITIONAL / REJECT)
- Exports results as JSON for the web Explorer
- Interactive web Explorer for non-technical users
Show command reference
After you get a copy of this repo in your own GitHub account,
open a machine terminal in your Repos folder:
# Replace username with YOUR GitHub username.
git clone https://github.com/username/explorer-age-verification
cd explorer-age-verification
code .uv self update
uv python pin 3.14
uv sync --extra dev --extra docs --upgrade
uvx pre-commit install
git add -A
uvx pre-commit run --all-files
# repeat if changes were made
git add -A
uvx pre-commit run --all-files
uv run python -m explorer_age_verification.cli --candidates data/raw/candidates.csv --policy data/raw/policy.toml --output-json docs/data/results.json
uv run ruff format .
uv run ruff check . --fix
uv run zensical build
git add -A
git commit -m "update"
git push -u origin mainTest page:
uv run python -m http.server 8000

