Aither World awwall

awwall

Say what a workload may reach, and watch everything else fail closed.

What It Does

Instead of trusting

that a service only talks to the hosts you think it talks to

You check

an explicit egress allowlist, where a denial names the rule that denied it

Overview

awwall/README
Every other gate asks about the CALLER — who they are, what role they hold, whether they are human. Nothing asks what a workload is allowed to REACH. So a service quietly dials whatever its config says, and when that config is stale the failure is a DNS or connect error naming a host with no relationship to the problem — the symptom points at an innocent service. Measured on our own fleet 2026-08-23: 11 registry entries pointed at hosts that did not exist while the real container was running, and every one of those failures named the wrong subsystem.

awwall

Egress allowlist that fails closed: declare what a workload may reach, watch everything else fail with the rule that denied it.

What It Does

awwall is a Python package that provides an egress allowlist policy engine. It works by:

  1. Failing closed by default — an empty policy denies all outbound connections
  2. Allowing only what you declare — add rules for hosts you trust
  3. Explaining denials — when a connection is blocked, you see exactly which rule (or lack thereof) caused it
  4. Multiple output formats — emit policy as JSON, /etc/hosts, or shell commands for iptables

Rules come in three types: - exactexample.com matches only example.com - domainexample.com matches example.com, api.example.com, v1.api.example.com, etc. - glob*.example.com matches any subdomain

Installation

```bash
pip install awwall

The Adoption Guarantee

Block one outbound host for one workload and watch the call fail closed with the rule that denied it.

```bash
# 1. Create an empty policy (denies everything)
$ awwall list
No rules defined (default: deny everything)

# 2. Check if google.com is allowed
$ awwall check google.com
$ echo $?
1  # Denied!

# 3. Explain why
$ awwall explain google.com
DENIED: google.com
  Reason: Policy is empty (default deny)

# 4. Allow one host
$ awwall allow github.com --type domain --description "GitHub repositories"
Added: github.com (domain)

# 5. Check again
$ awwall check github.com
$ echo $?
0  # Allowed!

$ awwall check api.github.com
$ echo $?
0  # Subdomains allowed too (domain rule)

# 6. But google.com is still blocked
$ awwall check google.com
$ echo $?
1  # Still denied

$ awwall explain google.com
DENIED: google.com
  Reason: No rule matched (checked 1 rule(s))

CLI Commands

awwall allow <host>

Add a host to the allowlist.

```bash
awwall allow api.example.com                    # Inferred as exact match
awwall allow example.com --type domain          # Explicit domain rule (allows subdomains)
awwall allow *.cdn.com --type glob              # Glob pattern
awwall allow example.com --description "Prod API" --type exact

awwall check <host>

Check if a host is allowed (exit 0 = allowed, exit 1 = denied).

```bash
awwall check example.com        # Silent
awwall check example.com -v     # Verbose output

awwall explain <host>

Explain why a host is allowed or denied.

```bash
$ awwall explain api.example.com
ALLOWED: api.example.com
  Matched rule: example.com (type: domain)
  Description: Production API

awwall emit --format <format>

Emit policy in different formats.

```bash
awwall emit --format json                # Print as JSON
awwall emit --format hosts               # /etc/hosts format
awwall emit --format iptables            # Shell script with iptables rules
awwall emit --format json --output policy.json  # Save to file

awwall list

List all rules in the policy.

```bash
$ awwall list
Policy rules (2 total):

  1. api.example.com [exact] - Production API
  2. example.com [domain] - All subdomains

awwall --self-test

Run self-tests to verify the policy engine.

```bash
$ awwall --self-test
Running awwall self-tests...
  [PASS] Empty policy denies all
  [PASS] Exact match works
  [PASS] Exact match rejects subdomains
  [PASS] Domain match includes subdomains
  [PASS] Domain match rejects different domain
  [PASS] Glob pattern works
  [PASS] Glob rejects non-matching
  [PASS] Case insensitive matching
  [PASS] Whitespace trimming works
  [PASS] Rejects malformed policy
  [PASS] Missing policy file defaults to deny-all

All self-tests passed!

Policy File Format

By default, policies are stored in ~/.awwall/policy.json:

```json
{
  "rules": [
    {
      "pattern": "api.example.com",
      "rule_type": "exact",
      "description": "Production API"
    },
    {
      "pattern": "example.com",
      "rule_type": "domain",
      "description": "All example.com subdomains"
    },
    {
      "pattern": "*.cdn.com",
      "rule_type": "glob",
      "description": "CDN patterns"
    }
  ]
}

Specify a different file with --policy-file:

```bash
awwall --policy-file /etc/awwall/prod.json check example.com

Exit Codes

A policy file that cannot be parsed exits with code 2 (cannot judge), never 0. This prevents silent failures.

Python API

```python
from awwall import Policy, AllowRule

# Create a policy
policy = Policy([
    AllowRule("example.com", "exact"),
    AllowRule("api.other.com", "domain"),
])

# Check a host
allowed, matching_rule = policy.check("api.other.com")
if allowed:
    print(f"Allowed by rule: {matching_rule.pattern}")
else:
    print("Denied: no rule matched")

# Load from file
policy = Policy.from_file("/path/to/policy.json")

# Load from dict
policy = Policy.from_dict({"rules": [...]})

# Export
print(policy.to_hosts_format())
print(policy.to_iptables_format())

Testing

```bash
pytest tests/test_awwall.py -v

The test suite includes: - Default deny verification — empty policy blocks everything - Rule type tests — exact, domain, and glob matching - Negative tests — verify rules DON'T match when they shouldn't - Fail-closed proofs — malformed policy is treated as empty (deny all) - Roundtrip tests — export and reimport preserves semantics

Design Principles

  1. Fail closed by default — empty policy denies all, malformed policy denies all
  2. Transparent denials — every denied connection names the rule that caused it
  3. Simple rules — exact, domain suffix, and glob patterns cover 99% of real use cases
  4. No magic — no attempt to detect "safe" IPs or make assumptions
  5. Exportable — policy can be rendered for other tools (hosts file, iptables, etc.)

License

MIT

The Aitherium Ecosystem

Portable tools you adopt one at a time. Each one works alone.

AitherConnectAitherConnectBrowser extension — federated AI search, page context, and the Living OS overlay. AitherZeroAitherZeroPowerShell 7+ automation framework — numbered, self-describing scripts. aitherkvcacheaitherkvcacheNear-optimal KV cache quantization for LLM inference — sub-byte compression. awaskawaskYour agent asks you a question — and acts on your answer. awbacawbacRole-based access control that fails closed and explains itself. awbrowseawbrowseA portable browser client — navigate, console, network, DOM, screenshot. awditawditAn append-only audit trail whose gaps are DETECTABLE. awdkawdkBuild AI agent fleets — 3 lines, any backend, local or cloud. awfindawfindA portable search client — query, results, ranking. awgitawgitSemantic version control on top of git — edit-ops and leases. awgraphawgraphA semantic code graph for agents — AST + tree-sitter, call graphs. awiamawiamWho is this caller? A directory and session store that fails honestly. awknoawknoThe man page for the Aither World — every brick, stack and law, offline. awknowledgeawknowledgeHow to run a coding agent so the result survives — the laws, with evidence. awmawmA portable, scoped agent memory. awmailawmailGive an agent an email address — send, and actually receive. awnboardawnboardA front gate you can put in front of anything, and hand someone the key to. awnestawnestProve there is a human before you let them into the nest. awnetawnetThe agentic web — agents host a mesh, and agents join one. awnixawnixA Linux you can hand to an agent — immutable base, capabilities included. awnodeawnodeA lightweight local gateway — bridges your apps to the AI backends you chose. awpackawpackFirst-party agent packs — the ones we build, versioned and installable on their own. awpredictawpredictPredict what your environment does next, and how surprised you were. awprismawprismTurn a failure into ranked hypotheses — and say what would confirm each one. awreasonawreasonA portable reasoning client — sessions, phases, thoughts, and the chain that produced the answer. awrecoverawrecoverLabelled snapshots with an all-or-nothing restore. awrecurseawrecurseAnswer a question over a context far larger than the window — recursively, with the trace kept. awrelayawrelayPortable agent messaging — findings, alerts, coordination. awrenaawrenaPut two agents head to head and get a verdict you can check. awreplawreplA REPL an agent can actually use — state that survives between turns. awresearchawresearchAsk a research question, get a cited report you can check. awriseawriseWake an agent on a schedule, let it do one thing, and put it back to sleep. awrunawrunA priority-aware queue and dispatcher for agentic runs and ad-hoc CI builds. It also judges whether the runner pool is big enough for the queue it is draining, and can ask a host to grow it -- reserving capacity is zero-sum, so a saturated pool needs more of it, not a different share of it. awsealawsealSign an artifact so a stranger can verify it. awshawshYour terminal answers you -- type a question where a command would go. awshareawsharePublish an artifact and fetch it back verified. awskillsawskillsPortable agent skills — self-contained procedures an agent loads on demand. awtollawtollWhat every tool call costs you in context, measured from your own transcripts. awtunnelawtunnelReach a service that has no public address. gobbonet-agenticgobbonet-agenticGobboNet campaigns with a real agent brain — scoped memory, graph recall.