What a branch can change,
and what it can judge.

Emfirge reads far more of your account than it can change on a branch. This page is the honest line between the two. Anything on the wrong side of it is listed as unmodeled or unknown instead of passing.

View .md
Figure 1. The 18 resource types a branch can change today. Each pip is an operation it supports: green for add, outlined for modify, red for delete.

Resources a branch can change

Eighteen resource types today.

Resource typeAddModifyDeleteNotes
ec2_instanceyesadd: yesyesmodify: yesyesdelete: yes
security_groupyesadd: yesyesmodify: yesyesdelete: yesAttachments derive from instance sg_ids.
rds_instanceyesadd: yesyesmodify: yesyesdelete: yes
s3_bucketyesadd: yesyesmodify: yesyesdelete: yesPublic-by-bucket-policy is detected. policy_public is derived from policy.
lambda_functionyesadd: yesyesmodify: yesyesdelete: yes
network_aclyesadd: yesyesmodify: yesyesdelete: yesModify replaces the complete entries and/or associated_subnet_ids.
iam_roleyesadd: yesyesmodify: yesyesdelete: yesModify covers the trust policy.
iam_role_policyadd: noyesmodify: yesdelete: noReplaces the complete access_statements list of an existing role, by role ARN.
iam_useryesadd: yesyesmodify: yesdelete: noModify sets the console and access-key flags, or replaces the complete statement list.
iam_instance_profileyesadd: yesmodify: nodelete: noThe ID is the instance profile ARN; the one field is role_arn.
nat_gatewayyesadd: yesmodify: nodelete: noAWS assigns the ID; subnet_id and connectivity_type are needed.
route_tableyesadd: yesyesmodify: yesdelete: noModify replaces the complete routes list. New internet-gateway routes need attachment evidence.
rds_snapshotyesadd: yesmodify: noyesdelete: yesAdd is a manual snapshot of an existing database.
ebs_volumeyesadd: yesmodify: noyesdelete: yessize_gb is required for an add.
ebs_snapshotadd: nomodify: noyesdelete: yes
dynamodb_tableadd: noyesmodify: yesyesdelete: yesModify sets point-in-time recovery or deletion protection. Adding a table is not modeled.
cloudfront_distributionadd: noyesmodify: yesdelete: noModify changes enabled, aliases, price class, web ACL, origins and cache behaviors. Adding or deleting a distribution is not modeled.
scheduler_scheduleyesadd: yesyesmodify: yesyesdelete: yesEventBridge Scheduler schedules.

Most types also carry tags; a tag change replaces the complete user tag set, and aws: tags are kept. The live endpoint GET /branches/capabilities is the authoritative list, and GET /branches/field-catalog lists every settable field with the AWS API member it stands for, taken from AWS's own API models. A value AWS would reject is rejected.

Not modeled.

Every resource type that is not in the table, and every operation left empty in it. A change to one of them is read but not modeled: it is listed as unmodeled and cannot pass.


When emfirge can't model it

Anything not modeled is listed. It never passes quietly.

  • A change to an unmodeled type or operation is listed as unmodeled and makes the verdict stricter (unmodeled_change warns; unmodeled_delete blocks).
  • A missing value AWS requires is flagged unspecified_values, never filled with a guess.
  • A source that was not collected is an unknown in the answer, not a silent "nothing found".
  • A scanner that did not run is reported as not run; coverage_warnings says the result is not full coverage.

Lenses and their status

Each lens looks at the branch from one angle. Together they feed the checks.

LensAsksStatus
SecurityDoes this expose something, or open a privilege-escalation path?Live
DependenciesWhat breaks if this is removed? Is it still in use? Can it be recovered?Live
ComplianceWhich CIS AWS Foundations 1.5 and SOC 2 controls flip? Uncovered controls are never pass. These are mapped checks, not an audit.Live
CostWhat does it cost before and after? AWS Price List, us-east-1 only, provisioned charges only, no load-balancer capacity units.Early
LimitsWill it hit an AWS quota? AWS default quotas only, not your approved increases, and no forecasting.Early
YoursBring your own evaluator against the same branch.Planned

Usage-based cost (data transfer, requests, invocations) is excluded and labelled unknown. Application latency, throughput and runtime correctness need a real run and are not modeled.


What each check is built from

The engine parts and the data behind each of the six checks.

CheckEngine partsData sources
DataDependencies lens: a deleted data store against the snapshots and backups that survive. Recovery points the branch removes: deleted snapshots, backups, versioning or point-in-time recovery turned off.Your read-only scan: EBS volumes and snapshots, RDS snapshots and backup settings, S3 versioning, DynamoDB tables.
ExposureSecurity lens: the ingress-rule diff, internet reachability over security groups, network ACLs, route tables and gateways, S3 public access, role trust, RDS default ports. Opt-in IAM Access Analyzer checks, which can only make the verdict stricter.Your scan. AWS documentation for S3 public access and RDS ports. IAM Access Analyzer, with your role, only after you accept an estimate.
MoneyCost lens: provisioned cost before and after, per resource and in total.The AWS Price List (us-east-1 on-demand prices, vendored).
AvailabilityDependencies lens: the dependency graph walked up to 10 levels, and lost internal and internet paths. Role permission facts, the CloudFront Host-header fact, schedules turned off or deleted, recent use.Your scan: network interfaces, IAM role last-used. policy_sentry IAM action data. AWS CloudFront documentation. CloudTrail and CloudWatch evidence over 90 days, opt-in.
ControlSecurity lens: admin access added or removed, privilege-escalation paths added, permissions added, S3 access logging.pathfinding.cloud (92 escalation paths). policy_sentry IAM action data. Your scan: IAM roles and users, S3 logging.
Outside worldA per-service table written by hand (AWS Support, Service Quotas, SES, Route 53 Domains, Marketplace, Savings Plans), and schedule changes.AWS documentation, one page cited per table entry. Your scan: EventBridge Scheduler schedules.

The Compliance lens (CIS 1.5 and SOC 2, from Prowler) feeds emfirge context --compliance, and the Limits lens feeds the capacity reason in the verdict. Neither is part of the six checks. Lenses are internals; they are named here so you can see where each answer comes from.


Where the checks come from

Public data where a source exists, kept next to every fact. The few facts with no public source are written by hand, cite the AWS docs, and are tested.

Where the checks come from

Counts from the repo
92

privilege-escalation paths, from pathfinding.cloud

92
55
32
21
21
PATHSREADSNATIVEPROWLERCROSSWALK
SourceUsed for
pathfinding.cloudIAM privilege-escalation paths (92)
policy_sentryIAM access levels and the catalog of actions per service
ProwlerCIS 1.5 and SOC 2 control lists, and scanner severities
AWS API models and Price ListThe field catalog, and provisioned cost
CheckovAn advisory configuration scanner on each verdict. It warns; it does not block on its own. Trivy is off.

The numbers in the chart are counted from the repository, not estimated. Every behavior is pinned by a numbered law, a property test that must always hold; there are 89, numbered L1 to L92 (L37 to L39 are not used). Read the laws.