tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.{
"command": "echo \"AWS_ENDPOINT_URL=$AWS_ENDPOINT_URL\"; echo \"ENFORCE_IAM=$ENFORCE_IAM\"; aws --version",
"description": "Check environment variables and AWS CLI"
}AWS_ENDPOINT_URL=http://localstack:4566 ENFORCE_IAM= aws-cli/2.34.48 Python/3.14.4 Linux/6.12.76-linuxkit exe/aarch64.ubuntu.24 [stdout] AWS_ENDPOINT_URL=http://localstack:4566 ENFORCE_IAM= aws-cli/2.34.48 Python/3.14.4 Linux/6.12.76-linuxkit exe/aarch64.ubuntu.24
{
"command": "aws ssm get-parameters-by-path --path /harbor/boundary --region us-east-1 --output json",
"description": "Read SSM manifest"
}{
"Parameters": [
{
"Name": "/harbor/boundary/policy-arn",
"Type": "String",
"Value": "arn:aws:iam::000000000000:policy/AnalystBoundaryPolicy",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:28.513000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/policy-arn",
"DataType": "text"
},
{
"Name": "/harbor/boundary/identity-arn",
"Type": "String",
"Value": "arn:aws:iam::000000000000:policy/AnalystIdentityPolicy",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:29.252000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/identity-arn",
"DataType": "text"
},
{
"Name": "/harbor/boundary/user-arn",
"Type": "String",
"Value": "arn:aws:iam::000000000000:user/analyst-user",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:30.013000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/user-arn",
"DataType": "text"
},
{
"Name": "/harbor/boundary/kms-key-arn",
"Type": "String",
"Value": "arn:aws:kms:us-east-1:000000000000:key/98fe2000-ee63-4632-bd4a-789de4dff155",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:30.921000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/kms-key-arn",
"DataType": "text"
},
{
"Name": "/harbor/boundary/bucket-name",
"Type": "String",
"Value": "vault-bucket",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:31.872000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/bucket-name",
"DataType": "text"
},
{
"Name": "/harbor/boundary/analyst-access-key-id",
"Type": "String",
"Value": "LKIAQAAAAAAAEBM4ZBA7",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:32.804000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/analyst-access-key-id",
"DataType": "text"
},
{
"Name": "/harbor/boundary/analyst-secret-key",
"Type": "SecureString",
"Value": "kms:alias/aws/ssm:bOK8HabxamDZu+QP6JQz/mZy6zoT2FUsCF8zNFTn",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:33.783000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/analyst-secret-key",
"DataType": "text"
}
]
}
[stdout]
{
"Parameters": [
{
"Name": "/harbor/boundary/policy-arn",
"Type": "String",
"Value": "arn:aws:iam::000000000000:policy/AnalystBoundaryPolicy",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:28.513000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/policy-arn",
"DataType": "text"
},
{
"Name": "/harbor/boundary/identity-arn",
"Type": "String",
"Value": "arn:aws:iam::000000000000:policy/AnalystIdentityPolicy",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:29.252000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/identity-arn",
"DataType": "text"
},
{
"Name": "/harbor/boundary/user-arn",
"Type": "String",
"Value": "arn:aws:iam::000000000000:user/analyst-user",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:30.013000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/user-arn",
…[truncated]{
"command": "aws iam list-policies --scope Local --region us-east-1 --output json",
"description": "List local IAM policies"
}{
"Policies": [
{
"PolicyName": "AnalystBoundary",
"PolicyId": "A1UXDHE7JCZ0EYZGM1G5E",
"Arn": "arn:aws:iam::000000000000:policy/AnalystBoundary",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 0,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2026-05-17T08:15:21.543119+00:00",
"UpdateDate": "2026-05-17T08:15:21.543119+00:00"
},
{
"PolicyName": "AnalystIdentityPolicy",
"PolicyId": "AD84SM88FQJ0QDLE9LANM",
"Arn": "arn:aws:iam::000000000000:policy/AnalystIdentityPolicy",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 1,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2026-05-17T08:15:20.900302+00:00",
"UpdateDate": "2026-05-17T08:15:20.900302+00:00"
}
]
}
[stdout]
{
"Policies": [
{
"PolicyName": "AnalystBoundary",
"PolicyId": "A1UXDHE7JCZ0EYZGM1G5E",
"Arn": "arn:aws:iam::000000000000:policy/AnalystBoundary",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 0,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2026-05-17T08:15:21.543119+00:00",
"UpdateDate": "2026-05-17T08:15:21.543119+00:00"
},
{
"PolicyName": "AnalystIdentityPolicy",
"PolicyId": "AD84SM88FQJ0QDLE9LANM",
"Arn": "arn:aws:iam::000000000000:policy/AnalystIdentityPolicy",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 1,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2026-05-17T08:15:20.900302+00:00",
"UpdateDate": "2026-05-17T08:15:20.900302+00:00"
}
]
}{
"command": "aws iam get-user --user-name analyst-user --region us-east-1 --output json",
"description": "Get analyst-user details"
}{
"User": {
"Path": "/",
"UserName": "analyst-user",
"UserId": "AIDAQAAAAAAAEUHSA7P5D",
"Arn": "arn:aws:iam::000000000000:user/analyst-user",
"CreateDate": "2026-05-17T08:15:23.277381+00:00"
}
}
[stdout]
{
"User": {
"Path": "/",
"UserName": "analyst-user",
"UserId": "AIDAQAAAAAAAEUHSA7P5D",
"Arn": "arn:aws:iam::000000000000:user/analyst-user",
"CreateDate": "2026-05-17T08:15:23.277381+00:00"
}
}{
"command": "aws iam list-attached-user-policies --user-name analyst-user --region us-east-1 --output json",
"description": "List user policies"
}{
"AttachedPolicies": [
{
"PolicyName": "AnalystIdentityPolicy",
"PolicyArn": "arn:aws:iam::000000000000:policy/AnalystIdentityPolicy"
}
]
}
[stdout]
{
"AttachedPolicies": [
{
"PolicyName": "AnalystIdentityPolicy",
"PolicyArn": "arn:aws:iam::000000000000:policy/AnalystIdentityPolicy"
}
]
}{
"command": "aws ssm get-parameter --name /harbor/boundary/analyst-secret-key --with-decryption --region us-east-1 --output json",
"description": "Get decrypted secret"
}{
"Parameter": {
"Name": "/harbor/boundary/analyst-secret-key",
"Type": "SecureString",
"Value": "bOK8HabxamDZu+QP6JQz/mZy6zoT2FUsCF8zNFTn",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:33.783000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/analyst-secret-key",
"DataType": "text"
}
}
[stdout]
{
"Parameter": {
"Name": "/harbor/boundary/analyst-secret-key",
"Type": "SecureString",
"Value": "bOK8HabxamDZu+QP6JQz/mZy6zoT2FUsCF8zNFTn",
"Version": 1,
"LastModifiedDate": "2026-05-17T08:15:33.783000+00:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/harbor/boundary/analyst-secret-key",
"DataType": "text"
}
}{
"command": "aws iam get-policy-version --policy-arn arn:aws:iam::000000000000:policy/AnalystBoundary --version-id v1 --region us-east-1 --output json",
"description": "Get boundary policy document"
}{
"PolicyVersion": {
"Document": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BucketListing",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"NotResource": "arn:aws:s3:::vault-bucket/public/*"
},
{
"Sid": "ObjectOps",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::vault-bucket/Confidential/*"
},
{
"Sid": "PublicGuard",
"Effect": "Deny",
"Action": "s3:*",
"Resource": "arn:aws:s3:::vault-bucket/public/*"
},
{
"Sid": "KmsForVault",
"Effect": "Allow",
"Action": "kms:*",
"Resource": "arn:aws:kms:us-east-1:000000000000:key/98fe2000-ee63-4632-bd4a-789de4dff155"
}
]
},
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2026-05-17T08:15:21.543119+00:00"
}
}
[stdout]
{
"PolicyVersion": {
"Document": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BucketListing",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"NotResource": "arn:aws:s3:::vault-bucket/public/*"
},
{
"Sid": "ObjectOps",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::vault-bucket/Confidential/*"
},
{
"Sid": "PublicGuard",
"Effect": "Deny",
"Action": "s3:*",
"Resource": "arn:aws:s3:::vault-bucket/public/*"
},
{
"Sid": "KmsForVault",
"Effect": "Allow",
"Action": "kms:*",
"Resource": "arn:aws:kms:us-east-1:000000000000:key/98fe2000-ee63-4632-bd4a-789de4dff155"
}
]
},
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2026-05-17T08:15:21.543119+00:00"
}
}{
"command": "aws iam get-policy-version --policy-arn arn:aws:iam::000000000000:policy/AnalystIdentityPolicy --version-id v1 --region us-east-1 --output json",
"description": "Get identity policy document"
}{
"PolicyVersion": {
"Document": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AnalystS3",
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
},
{
"Sid": "AnalystKms",
"Effect": "Allow",
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "AnalystGuard",
"Effect": "Deny",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::vault-bucket/public/*"
}
]
},
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2026-05-17T08:15:20.900302+00:00"
}
}
[stdout]
{
"PolicyVersion": {
"Document": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AnalystS3",
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
},
{
"Sid": "AnalystKms",
"Effect": "Allow",
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "AnalystGuard",
"Effect": "Deny",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::vault-bucket/public/*"
}
]
},
"VersionId": "v1",
"IsDefaultVersion": true,
"CreateDate": "2026-05-17T08:15:20.900302+00:00"
}
}{
"command": "aws s3 ls --region us-east-1; aws kms list-aliases --region us-east-1 --output json | grep -A2 vault",
"description": "Check buckets and KMS alias"
}2026-05-17 08:15:16 vault-bucket
"AliasName": "alias/vault-kms",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/vault-kms",
"TargetKeyId": "98fe2000-ee63-4632-bd4a-789de4dff155",
"CreationDate": "2026-05-17T08:15:15.114032+00:00"
[stdout]
2026-05-17 08:15:16 vault-bucket
"AliasName": "alias/vault-kms",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/vault-kms",
"TargetKeyId": "98fe2000-ee63-4632-bd4a-789de4dff155",
"CreationDate": "2026-05-17T08:15:15.114032+00:00"{
"command": "aws iam list-access-keys --user-name analyst-user --region us-east-1 --output json",
"description": "List analyst access keys"
}{
"AccessKeyMetadata": [
{
"UserName": "analyst-user",
"AccessKeyId": "LKIAQAAAAAAAEBM4ZBA7",
"Status": "Active",
"CreateDate": "2026-05-17T08:15:24.828903+00:00"
}
]
}
[stdout]
{
"AccessKeyMetadata": [
{
"UserName": "analyst-user",
"AccessKeyId": "LKIAQAAAAAAAEBM4ZBA7",
"Status": "Active",
"CreateDate": "2026-05-17T08:15:24.828903+00:00"
}
]
}{
"command": "aws kms get-key-policy --key-id 98fe2000-ee63-4632-bd4a-789de4dff155 --policy-name default --region us-east-1 --output json 2>&1 | head -60",
"description": "Check KMS key policy"
}{
"Policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"EnableIAMUserPermissions\",\n \"Effect\": \"Allow\",\n \"Principal\": {\"AWS\": \"arn:aws:iam::000000000000:root\"},\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n }\n ]\n}"
}
[stdout]
{
"Policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"EnableIAMUserPermissions\",\n \"Effect\": \"Allow\",\n \"Principal\": {\"AWS\": \"arn:aws:iam::000000000000:root\"},\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n }\n ]\n}"
}{
"command": "aws iam get-account-summary --region us-east-1 2>&1 | head -5; echo \"---\"; aws --version",
"description": "Sanity check IAM"
}{
"SummaryMap": {
"Users": 1,
"Groups": 0,
"Roles": 0,
---
aws-cli/2.34.48 Python/3.14.4 Linux/6.12.76-linuxkit exe/aarch64.ubuntu.24
[stdout]
{
"SummaryMap": {
"Users": 1,
"Groups": 0,
"Roles": 0,
---
aws-cli/2.34.48 Python/3.14.4 Linux/6.12.76-linuxkit exe/aarch64.ubuntu.24{
"file_path": "/tmp/identity-policy.json",
"content": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AnalystS3Broad\",\n \"Effect\": \"Allow\",\n \"Action\": \"s3:*\",\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"AnalystKmsBroad\",\n \"Effect\": \"Allow\",\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n }\n ]\n}\n"
}File created successfully at: /tmp/identity-policy.json (file state is current in your context , no need to Read it back)
{
"file_path": "/tmp/boundary-policy.json",
"content": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"S3ConfidentialOnly\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": \"arn:aws:s3:::vault-bucket/confidential/*\"\n },\n {\n \"Sid\": \"S3VaultBucketListing\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:ListBucket\",\n \"s3:GetBucketLocation\"\n ],\n \"Resource\": \"arn:aws:s3:::vault-bucket\"\n },\n {\n \"Sid\": \"KmsVaultOnly\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kms:Decrypt\",\n \"kms:Encrypt\",\n \"kms:GenerateDataKey\",\n \"kms:GenerateDataKeyWithoutPlaintext\",\n \"kms:DescribeKey\",\n \"kms:ReEncryptFrom\",\n \"kms:ReEncryptTo\"\n ],\n \"Resource\": \"arn:aws:kms:us-east-1:000000000000:key/98fe2000-ee63-4632-bd4a-789de4dff155\"\n }\n ]\n}\n"
}File created successfully at: /tmp/boundary-policy.json (file state is current in your context , no need to Read it back)
No file changes, the agent left the workspace untouched.
downloading uv 0.9.7 aarch64-unknown-linux-gnu
Downloading botocore (12.7MiB)
Downloading pygments (1.2MiB)
Downloading pygments
Downloading botocore
Installed 13 packages in 41ms
============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-8.4.1, pluggy-1.6.0 -- /root/.cache/uv/archive-v0/TUuR-_fu-PAk3ItISh_tJ/bin/python
cachedir: .pytest_cache
rootdir: /tests
plugins: json-ctrf-0.3.5
collecting ... collected 27 items
../tests/test_outputs.py::test_01_analyst_user_exists PASSED [ 3%]
../tests/test_outputs.py::test_02_identity_policy_attached_to_user PASSED [ 7%]
../tests/test_outputs.py::test_03_boundary_attached_via_get_user FAILED [ 11%]
../tests/test_outputs.py::test_04_vault_bucket_exists_with_public_access_block PASSED [ 14%]
../tests/test_outputs.py::test_05_kms_alias_and_ssm_pointers_resolve FAILED [ 18%]
../tests/test_outputs.py::test_06_identity_policy_grants_full_s3_and_full_kms PASSED [ 22%]
../tests/test_outputs.py::test_07_identity_policy_has_no_explicit_deny_anywhere FAILED [ 25%]
../tests/test_outputs.py::test_08_user_has_no_admin_managed_policy_attached PASSED [ 29%]
../tests/test_outputs.py::test_09_boundary_effect_allow_only FAILED [ 33%]
../tests/test_outputs.py::test_10_boundary_has_no_NotResource_or_NotAction FAILED [ 37%]
../tests/test_outputs.py::test_11_boundary_object_actions_scoped_to_confidential_prefix FAILED [ 40%]
../tests/test_outputs.py::test_12_boundary_listbucket_uses_s3_prefix_condition FAILED [ 44%]
../tests/test_outputs.py::test_13_boundary_kms_actions_scoped_to_cmk_arn PASSED [ 48%]
../tests/test_outputs.py::test_14_boundary_does_not_grant_kms_create_key_or_wildcard_kms FAILED [ 51%]
../tests/test_outputs.py::test_15_boundary_does_not_grant_iam_self_modify PASSED [ 55%]
../tests/test_outputs.py::test_16_boundary_size_under_managed_policy_limit PASSED [ 59%]
../tests/test_outputs.py::test_17_boundary_allows_confidential_put_via_simulator FAILED [ 62%]
../tests/test_outputs.py::test_18_boundary_denies_public_put_via_simulator PASSED [ 66%]
../tests/test_outputs.py::test_19_boundary_allows_kms_decrypt_via_simulator PASSED [ 70%]
../tests/test_outputs.py::test_20_boundary_denies_kms_create_key_via_simulator PASSED [ 74%]
../tests/test_outputs.py::test_21_analyst_can_put_to_confidential_prefix PASSED [ 77%]
../tests/test_outputs.py::test_22_analyst_cannot_put_to_public_prefix PASSED [ 81%]
../tests/test_outputs.py::test_23_analyst_cannot_create_kms_key FAILED [ 85%]
../tests/test_outputs.py::test_24_analyst_cannot_put_to_a_different_bucket FAILED [ 88%]
../tests/test_outputs.py::test_25_boundary_object_resource_prefix_is_lowercase_confidential FAILED [ 92%]
../tests/test_outputs.py::test_26_ssm_policy_arn_resolves_to_a_live_boundary_managed_policy FAILED [ 96%]
../tests/test_outputs.py::test_27_boundary_default_version_reflects_the_runtime_intended_shape FAILED [100%]
=================================== FAILURES ===================================
____________________ test_03_boundary_attached_via_get_user ____________________
def test_03_boundary_attached_via_get_user():
user = _get_user()
pb = user.get("PermissionsBoundary") or {}
arn = pb.get("PermissionsBoundaryArn")
> assert arn == BOUNDARY_ARN_EXPECTED, (
f"GetUser.User.PermissionsBoundary.PermissionsBoundaryArn={arn!r}; "
f"expected {BOUNDARY_ARN_EXPECTED!r} , the boundary managed policy is defined "
f"but not actually attached to the user as a permissions boundary"
)
E AssertionError: GetUser.User.PermissionsBoundary.PermissionsBoundaryArn=None; expected 'arn:aws:iam::000000000000:policy/AnalystBoundary' , the boundary managed policy is defined but not actually attached to the user as a permissions boundary
E assert None == 'arn:aws:iam::000000000000:policy/AnalystBoundary'
/tests/test_outputs.py:181: AssertionError
__________________ test_05_kms_alias_and_ssm_pointers_resolve __________________
def test_05_kms_alias_and_ssm_pointers_resolve():
kms = _client("kms")
info = kms.describe_key(KeyId="alias/vault-kms")["KeyMetadata"]
assert info["Arn"].startswith(f"arn:aws:kms:{REGION}:{ACCOUNT_ID}:key/")
> assert _ssm(SSM_BOUNDARY_ARN) == BOUNDARY_ARN_EXPECTED
E AssertionError: assert 'arn:aws:iam:...oundaryPolicy' == 'arn:aws:iam:...alystBoundary'
E
E - arn:aws:iam::000000000000:policy/AnalystBoundary
E + arn:aws:iam::000000000000:policy/AnalystBoundaryPolicy
E ? ++++++
/tests/test_outputs.py:200: AssertionError
____________ test_07_identity_policy_has_no_explicit_deny_anywhere _____________
def test_07_identity_policy_has_no_explicit_deny_anywhere():
for s in _stmts(_identity_doc()):
> assert s.get("Effect") != "Deny", (
f"identity policy contains an Effect:Deny statement {s!r} , the design requires the boundary "
f"alone to do the gating; an explicit Deny in the identity policy means the boundary's "
f"semantics aren't being exercised, and the auditor flags the design as broken"
)
E AssertionError: identity policy contains an Effect:Deny statement {'Sid': 'AnalystGuard', 'Effect': 'Deny', 'Action': 's3:PutObject', 'Resource': 'arn:aws:s3:::vault-bucket/public/*'} , the design requires the boundary alone to do the gating; an explicit Deny in the identity policy means the boundary's semantics aren't being exercised, and the auditor flags the design as broken
E assert 'Deny' != 'Deny'
E + where 'Deny' = <built-in method get of dict object at 0xffff9481c340>('Effect')
E + where <built-in method get of dict object at 0xffff9481c340> = {'Action': 's3:PutObject', 'Effect': 'Deny', 'Resource': 'arn:aws:s3:::vault-bucket/public/*', 'Sid': 'AnalystGuard'}.get
/tests/test_outputs.py:228: AssertionError
______________________ test_09_boundary_effect_allow_only ______________________
def test_09_boundary_effect_allow_only():
for s in _stmts(_boundary_doc()):
eff = s.get("Effect")
> assert eff == "Allow", (
f"boundary has a non-Allow statement: {s!r} , a permissions boundary is a CEILING, "
f"not a deny list; anything not listed is implicitly denied by the boundary itself, "
f"and the auditor rejects an explicit Deny in the boundary as a design smell"
)
E AssertionError: boundary has a non-Allow statement: {'Sid': 'PublicGuard', 'Effect': 'Deny', 'Action': 's3:*', 'Resource': 'arn:aws:s3:::vault-bucket/public/*'} , a permissions boundary is a CEILING, not a deny list; anything not listed is implicitly denied by the boundary itself, and the auditor rejects an explicit Deny in the boundary as a design smell
E assert 'Deny' == 'Allow'
E
E - Allow
E + Deny
/tests/test_outputs.py:251: AssertionError
_______________ test_10_boundary_has_no_NotResource_or_NotAction _______________
def test_10_boundary_has_no_NotResource_or_NotAction():
for s in _stmts(_boundary_doc()):
> assert "NotResource" not in s, (
f"boundary statement uses NotResource: {s!r} , NotResource does not invert into an allow-elsewhere, "
f"it inverts the resource match in a way that's almost never what the author meant; the auditor "
f"forbids it in boundary documents"
)
E AssertionError: boundary statement uses NotResource: {'Sid': 'BucketListing', 'Effect': 'Allow', 'Action': ['s3:ListBucket', 's3:GetBucketLocation'], 'NotResource': 'arn:aws:s3:::vault-bucket/public/*'} , NotResource does not invert into an allow-elsewhere, it inverts the resource match in a way that's almost never what the author meant; the auditor forbids it in boundary documents
E assert 'NotResource' not in {'Action': ['s3:ListBucket', 's3:GetBucketLocation'], 'Effect': 'Allow', 'NotResource': 'arn:aws:s3:::vault-bucket/public/*', 'Sid': 'BucketListing'}
/tests/test_outputs.py:260: AssertionError
________ test_11_boundary_object_actions_scoped_to_confidential_prefix _________
def test_11_boundary_object_actions_scoped_to_confidential_prefix():
bucket = _bucket()
expected = f"arn:aws:s3:::{bucket}/confidential/*"
object_actions = {"s3:GetObject", "s3:PutObject", "s3:DeleteObject"}
found_any = False
for s in _stmts(_boundary_doc()):
if s.get("Effect") != "Allow":
continue
actions = set(_as_list(s.get("Action")))
if not (actions & object_actions):
continue
found_any = True
resources = _as_list(s.get("Resource"))
assert "*" not in resources, (
f"boundary object-level Allow statement has Resource '*' (no scope): {s!r} , must be narrowed "
f"to {expected!r}"
)
bad = [r for r in resources if r != expected]
> assert not bad, (
f"boundary object-level Allow statement has Resource={resources!r}; expected exactly [{expected!r}]"
)
E AssertionError: boundary object-level Allow statement has Resource=['arn:aws:s3:::vault-bucket/Confidential/*']; expected exactly ['arn:aws:s3:::vault-bucket/confidential/*']
E assert not ['arn:aws:s3:::vault-bucket/Confidential/*']
/tests/test_outputs.py:286: AssertionError
_____________ test_12_boundary_listbucket_uses_s3_prefix_condition _____________
def test_12_boundary_listbucket_uses_s3_prefix_condition():
bucket = _bucket()
bucket_arn = f"arn:aws:s3:::{bucket}"
found = False
for s in _stmts(_boundary_doc()):
if s.get("Effect") != "Allow":
continue
actions = set(_as_list(s.get("Action")))
if "s3:ListBucket" not in actions:
continue
found = True
resources = _as_list(s.get("Resource"))
> assert bucket_arn in resources, (
f"boundary s3:ListBucket Resource={resources!r} does not include the bucket ARN {bucket_arn!r}; "
f"ListBucket is a bucket-level action and must target the bucket ARN, not an object-prefix ARN"
)
E AssertionError: boundary s3:ListBucket Resource=[] does not include the bucket ARN 'arn:aws:s3:::vault-bucket'; ListBucket is a bucket-level action and must target the bucket ARN, not an object-prefix ARN
E assert 'arn:aws:s3:::vault-bucket' in []
/tests/test_outputs.py:307: AssertionError
________ test_14_boundary_does_not_grant_kms_create_key_or_wildcard_kms ________
def test_14_boundary_does_not_grant_kms_create_key_or_wildcard_kms():
actions = _all_actions(_stmts(_boundary_doc()))
assert "kms:CreateKey" not in actions, (
"boundary grants kms:CreateKey , the analyst could create their own keys outside the design"
)
> assert "kms:*" not in actions, (
"boundary grants kms:* , that's a wildcard over every kms action including CreateKey, "
"and the design forbids it; the boundary's kms grants must be limited to the data-key "
"actions needed to use the existing cmk"
)
E AssertionError: boundary grants kms:* , that's a wildcard over every kms action including CreateKey, and the design forbids it; the boundary's kms grants must be limited to the data-key actions needed to use the existing cmk
E assert 'kms:*' not in ['s3:ListBucket', 's3:GetBucketLocation', 's3:GetObject', 's3:PutObject', 's3:DeleteObject', 's3:*', ...]
/tests/test_outputs.py:350: AssertionError
____________ test_17_boundary_allows_confidential_put_via_simulator ____________
def test_17_boundary_allows_confidential_put_via_si
… (truncated at 12,000 chars, full verifier log is in the trial artifacts)Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_aabb06598bd14a96. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_aabb06598bd14a96 · verifier authoritative; classifier explanatory.