Preflight policies
Three built-in policies. Each name, revision, rule, and action is fixed for Preflight v1. Choose the weakest policy that matches your real gate; do not call a stricter policy a security audit.
Decision meanings
- PASS — every rule in this exact policy revision passes on the Census facts and source times in the result.
- REVIEW — at least one rule needs human judgment, or a required fact is missing, stale, or inconclusive.
- BLOCK — a confirmed hard failure violates the policy, or
strict@1fails closed on required identity or hosted-liveness evidence.
Precedence is BLOCK, then REVIEW, then PASS. A PASS never authorizes install or execution.
Compare the three policies
| Policy | Identity requirement | Hosted liveness | Unknown required fact |
|---|---|---|---|
baseline@1 | Any; identity is context | Observe only | REVIEW |
first-party@1 | First party | Observe only | REVIEW |
strict@1 | First party | Fresh live proof when a remote is claimed; 48-hour maximum age | BLOCK |
baseline@1
Use this public preview default when you need a minimum evidence gate but do not require first-party identity. A proven impersonation or hard distribution failure still blocks. Missing minimum evidence reviews.
first-party@1
Use this when the server must belong to the product brand. Proven first-party identity passes that rule. Conflicting ownership blocks. Unknown identity reviews.
strict@1
Use this fail-closed gate when first-party identity is required and a claimed hosted endpoint must have fresh live proof. Unknown identity, unknown hosted liveness, and hosted evidence at least 48 hours old block. Package-only rows have hosted liveness marked not applicable.
Finding actions shared by all three
| Reason code | Action |
|---|---|
brand_impersonation | BLOCK |
brand_claim_without_identity | REVIEW |
repo_gone | BLOCK |
repo_archived | REVIEW |
npm_package_missing | BLOCK |
pypi_package_missing | BLOCK |
npm_deprecated | BLOCK |
repo_no_push_6mo | REVIEW |
osv_package_advisory | REVIEW |
Each claimed npm or PyPI package is evaluated on its own. One good artifact does not erase a missing or deprecated artifact. OSV evidence is package-name scoped, not installed-version scoped.
Exact policy objects
[
{
"schema_version": 1,
"id": "builtin:baseline",
"revision": 1,
"ruleset_id": "preflight-ruleset",
"ruleset_revision": 1,
"name": "baseline@1",
"identity_requirement": "any",
"hosted_liveness": "observe_only",
"unknown_required": "review",
"findings": {
"brand_impersonation": "block",
"brand_claim_without_identity": "review",
"repo_gone": "block",
"repo_archived": "review",
"npm_package_missing": "block",
"pypi_package_missing": "block",
"npm_deprecated": "block",
"repo_no_push_6mo": "review",
"osv_package_advisory": "review"
}
},
{
"schema_version": 1,
"id": "builtin:first-party",
"revision": 1,
"ruleset_id": "preflight-ruleset",
"ruleset_revision": 1,
"name": "first-party@1",
"identity_requirement": "first_party",
"hosted_liveness": "observe_only",
"unknown_required": "review",
"findings": {
"brand_impersonation": "block",
"brand_claim_without_identity": "review",
"repo_gone": "block",
"repo_archived": "review",
"npm_package_missing": "block",
"pypi_package_missing": "block",
"npm_deprecated": "block",
"repo_no_push_6mo": "review",
"osv_package_advisory": "review"
}
},
{
"schema_version": 1,
"id": "builtin:strict",
"revision": 1,
"ruleset_id": "preflight-ruleset",
"ruleset_revision": 1,
"name": "strict@1",
"identity_requirement": "first_party",
"hosted_liveness": "require_fresh_live",
"max_liveness_age_hours": 48,
"unknown_required": "block",
"findings": {
"brand_impersonation": "block",
"brand_claim_without_identity": "review",
"repo_gone": "block",
"repo_archived": "review",
"npm_package_missing": "block",
"pypi_package_missing": "block",
"npm_deprecated": "block",
"repo_no_push_6mo": "review",
"osv_package_advisory": "review"
}
}
]
Limits
Preflight uses public evidence. It does not analyze code or malware. It does not inspect requested permissions, scopes, data access, or runtime isolation. Source facts can change after their displayed time. Every result states these limits and has a valid_until time.