A surface — a client-side tool, a docs site, a marketing page —
should talk only to its own origin. AGSSH-STD-001 pins that property down as 57 testable
rules, and agssh is the
deterministic, fail-closed runner that enforces them against the live deployment.
Profiles
Bronze ⊂ Silver ⊂ Gold, cumulative
Levels
L0 strict · L1 scoped · L2 marketing
Posture
Fail-closed — nothing is green unless proven
Evidence
Externally derived, signed conformance record
This page eats its own dog food.
agssh.dev is a static surface published behind Cloudflare, and it passes AGSSH-STD-001
at its highest bar. The badge above is generated by agssh scanning this very
site — a fail-closed claim that reproduces from the
signed conformance record (and its
SBOM). The standard that says "prove it" proves it.
The 57 rules
Nine families, three cumulative profiles (Bronze ⊂ Silver ⊂ Gold), three strictness levels (L0 strict air-gap · L1 scoped egress · L2 marketing). Full normative text is in the PDF.
AG-NET — Egress & Air-Gap
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-NET-01 | Self-host every runtime dependency | MUST | CRITICAL | Bronze | L0 L1 L2 |
AG-NET-02 | Override library default CDN loaders | MUST | CRITICAL | Bronze | L0 L1 L2 |
AG-NET-03 | Same-origin workers; constrain worker-src | MUST | HIGH | Silver | L0 L1 L2 |
AG-NET-04 | Constrain connect-src | MUST | CRITICAL | Bronze | L0 L1 (conditional · L2) |
AG-NET-05 | No third-party egress during load | MUST | HIGH | Silver | L0 (SHOULD · L1) |
AG-NET-06 | No third-party connection priming | MUST | MEDIUM | Silver | L0 L1 (SHOULD · L2) |
AG-NET-07 | Service Worker hygiene | MUST | HIGH | Silver | when a service worker is registered |
AG-NET-08 | Violation/error reporting stays same-origin | MUST | MEDIUM | Silver | L0 L1 |
AG-NET-09 | External _blank links sever the opener; privacy surfaces sever the referrer | MUST | MEDIUM | Bronze | L0 L1 L2 |
AG-CSP — Content Security Policy
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-CSP-01 | Ship a CSP | MUST | HIGH | Bronze | L0 L1 L2 |
AG-CSP-02 | Deny by default; enumerate; forbid bypass primitives | MUST | HIGH | Bronze | L0 L1 L2 |
AG-CSP-03 | Clickjacking control must be header-delivered | MUST | HIGH | Bronze | L0 L1 L2 |
AG-CSP-04 | Stage report-only before enforcing | SHOULD | MEDIUM | Silver | all (mandatory before first enforcing deploy) |
AG-CSP-05 | Force HTTPS subresources | MUST | MEDIUM | Silver | L0 L1 L2 |
AG-CSP-06 | Trusted Types for DOM sinks | MUST | HIGH | Silver | L0 L1 (SHOULD · L2) |
AG-HDR — Transport & Response Headers
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-HDR-01 | HSTS with a real max-age | MUST | HIGH | Bronze | header-capable backends |
AG-HDR-01a | HSTS scope is sticky — gate it | MUST | HIGH | Silver | before enabling AG-HDR-01 |
AG-HDR-02 | Disable MIME sniffing | MUST | HIGH | Bronze | header-capable |
AG-HDR-03 | X-Frame-Options | MUST | HIGH | Bronze | header-capable (pairs with AG-CSP-03) |
AG-HDR-04 | Referrer-Policy | MUST | MEDIUM | Silver | header-capable |
AG-HDR-05 | Permissions-Policy | MUST | MEDIUM | Silver | header-capable |
AG-HDR-06 | Cross-origin isolation for threaded WASM | MUST | MEDIUM | Gold | when SharedArrayBuffer / threaded WASM is used |
AG-HDR-07 | Cache discipline for fingerprinted assets | SHOULD | LOW | Silver | header-capable |
AG-HDR-08 | TLS floor | MUST | HIGH | Silver | header-capable |
AG-DNS — DNS & Issuance Trust Anchors
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-DNS-01 | CAA pins certificate issuance | MUST | HIGH | Silver | L0 L1 L2 |
AG-DNS-02 | DNSSEC enabled | SHOULD | MEDIUM | Silver | L0 L1 L2 |
AG-DNS-03 | No danglable records (subdomain takeover) | MUST | HIGH | Silver | L0 L1 L2 |
AG-SUP — Supply Chain & Build Integrity
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-SUP-01 | SRI on any unavoidable cross-origin subresource | MUST | HIGH | Silver | L0 L1 L2 |
AG-SUP-02 | Pin dependencies by integrity hash | MUST | HIGH | Silver | L0 L1 L2 |
AG-SUP-03 | Reproducible build; pinned toolchain | SHOULD | MEDIUM | Silver | L0 L1 L2 |
AG-SUP-04 | No secrets in shipped output | MUST | HIGH | Bronze | L0 L1 L2 |
AG-SUP-05 | No unintended source maps | SHOULD | LOW | Silver | L0 L1 L2 |
AG-SUP-06 | No known-vulnerable dependencies | MUST | HIGH | Bronze | L0 L1 L2 |
AG-SUP-07 | SBOM emitted and retained | SHOULD | MEDIUM | Gold | L0 L1 L2 |
AG-SUP-08 | Signed releases / build provenance | SHOULD | MEDIUM | Gold | L0 L1 L2 |
AG-CI — Build Pipeline / CI Hardening
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-CI-01 | Pin third-party Actions/steps to a full commit SHA | MUST | HIGH | Silver | L0 L1 L2 |
AG-CI-02 | Least-privilege workflow tokens | MUST | HIGH | Silver | L0 L1 L2 |
AG-CI-03 | No untrusted code in a privileged context | MUST | CRITICAL | Silver | L0 L1 L2 |
AG-CI-04 | Secrets are not exposed to forks or echoed | MUST | HIGH | Silver | L0 L1 L2 |
AG-CI-05 | Protected branch with the conformance gate required | SHOULD | MEDIUM | Silver | L0 L1 L2 |
AG-CI-06 | Automated contributors run under scoped identity and the same gate | SHOULD | MEDIUM | Gold | L0 L1 L2 |
AG-PRV — Privacy & Consent
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-PRV-01 | Zero telemetry on air-gapped surfaces | MUST | CRITICAL | Bronze | L0 L1 (privacy tools) |
AG-PRV-02 | Prior blocking of non-essential third parties | MUST | CRITICAL | Bronze | L2 (and anywhere a tracker exists) |
AG-PRV-03 | Self-host fonts | MUST | HIGH | Bronze | L0 L1 L2 |
AG-PRV-04 | Minimize storage & fingerprinting | MUST | MEDIUM | Silver | L0 L1 (SHOULD · L2) |
AG-PRV-05 | Cookie attributes where cookies exist | MUST | HIGH | Silver | when any cookie is set |
AG-PRV-06 | Third-party embeds isolated and consent-gated | MUST | MEDIUM | Silver | L2 (forbidden · L0 L1) |
AG-OUT — Output / Document Hygiene
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-OUT-01 | Neutralize output metadata | MUST | MEDIUM | Silver | file-generating tools |
AG-OUT-02 | Deterministic output | SHOULD | LOW | Gold | file-generating tools |
AG-OUT-03 | In-browser only, no server round-trip | MUST | CRITICAL | Bronze | file-generating tools |
AG-GOV — Governance & Conformance Integrity
| Rule | Requirement | Obl. | Severity | Profile | Levels |
AG-GOV-01 | Waivers can never cover a MUST | MUST | CRITICAL | Bronze | all profiles |
AG-GOV-02 | Waivers auto-expire; the runner enforces it | MUST | HIGH | Silver | when deviations exist |
AG-GOV-03 | Deviation budget / debt ceiling | MUST | HIGH | Silver | L0 L1 L2 |
AG-GOV-04 | Segregation of duties on waivers | MUST | HIGH | Gold | when deviations exist (Gold) |
AG-GOV-05 | Conformance record is externally derived and signed | MUST | HIGH | Gold | L0 L1 L2 (Gold) |
AG-GOV-06 | Active egress canary - prove the wall, do not observe its silence | MUST | HIGH | Silver | L0 L1 |
AG-GOV-07 | Build environment is ephemeral and hermetic | MUST | HIGH | Gold | L0 L1 L2 (Gold) |
Run it yourself
Point the runner at any live URL and read the verdict — no build step:
go install github.com/fabriziosalmi/agssh/cmd/agssh@latest |
agssh -config .airgap.yml -profile Gold |
See the README for the GitHub Action
and MCP-server entry points, and the PDF for the full normative text.