You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Allow OIDC deployment of Telegram rollout alarms and health schedules
Status: corrected Gate B source integrated/applied/effective; production dark 17-alarm graph verification blocked by #136 (through #140 and #141)
Tags: enhancement, human, assistant, infra, testing, P1
Depends on: corrected #128 source/transform graph satisfied; successful normal CI deployment after #136 (which depends on #140, which depends on #141)
Blocks: #128 production/HUMAN closure only — source integration and IAM apply are complete
Related: #124, #129, #130
Current review state
The blocked bbb0841653603ee0830747fbb0df43979df0a0eb candidate was superseded by corrected Gate B source ddbaf2893bf2985d32e5a33310fe57e2f4ac9452. Independent Architecture, IAM/security, Tester, and PM reviews passed; the corrected source was integrated, applied through its reviewed CloudFormation change set, verified effective, and found IN_SYNC. No source correction or IAM apply remains.
Normal-CI attempt 2 produced no CloudWatch, SNS, or log IAM denial, but downstream rollback removed the rollout topic before the 17-alarm and health-schedule graph could remain live. The only remaining criterion is the normal-CI dark-deployment observation after #136 → #140 → #141 clears.
Final review uses fresh replacement #128 source/build/transforms, not the old
fixture.
The observability family remains:
one ConversationalRolloutAlarmTopic, exact name ${FullDocsStackName}-conversational-rollout-alarms, alias/aws/sns, ARN
output only, no subscription/topic policy/contact;
exactly three retained 30-day custom log groups: backend, execution, and result-dispatcher;
exactly 17 simple AWS::CloudWatch::Alarm resources with exact ${FullDocsStackName}-conversational-<suffix> names and the one topic action;
heartbeat suffixes execution-worker-heartbeat-stale, recovery-heartbeat-stale, and result-dispatcher-heartbeat-stale use TreatMissingData: breaching;
the other 14 alarms retain TreatMissingData: notBreaching;
no subscription, topic policy, dashboard, composite, anomaly, canary,
metric/filter/subscription, or additional observability family.
Keep the same 17 suffixes already enumerated by bbb0841:
#128 adds one execution-conditioned two-minute health-pulse Schedule event to
the existing execution worker. The SAM transform therefore adds one
stack-prefixed AWS::Events::Rule and one AWS::Lambda::Permission targeting ConversationalExecutionWorkerFunction, in addition to the existing recovery
and result-dispatcher schedule resources. Update the fixture/final graph test
with the exact generated logical IDs, state/condition, input, target, and
permission ownership.
Do not add EventBridge or Lambda actions to the observability managed policy.
The accepted Gate A deploy policy already covers stack-prefixed EventBridge
rule lifecycle/tagging and Add/RemovePermission on the exact worker function
family. Structural tests must prove the new transformed resources fit those
existing statements without changing them.
Managed-policy placement and quotas
Retain one generated-name ConversationalRolloutObservabilityDeployPolicy, attached only to GitHubActionsDeployRole. Do not set ManagedPolicyName, grow the nearly full
inline policy, mix domains into Sponsor/dispatcher policies, or grant policy
self-administration.
The corrected compact observability policy must be <= 5,632 characters,
leaving at least 512 below IAM's 6,144-character managed-policy limit. Preserve
all prior policy ceilings and the four-policy steady-state/eight-policy
replacement attachment model. Recompute from resolved documents.
Exact corrected OIDC permissions
CloudWatch alarm lifecycle and tag-on-create
Retain cloudwatch:PutMetricAlarm on only the exact 17 alarm ARNs, with:
a non-null cloudwatch:AlarmActions; and
every action equal to the one exact rollout topic ARN.
Retain cloudwatch:DescribeAlarms and cloudwatch:DeleteAlarms on those exact
17 ARNs.
Add cloudwatch:TagResource on only those same 17 exact alarm ARNs. It is
required because CloudFormation automatically supplies system tags, the alarm
resource supports tags, and AWS maps tagged alarm creation to cloudwatch:TagResource in addition to PutMetricAlarm.
Do not place TagResource in the alarm-action-conditioned Put statement:
that condition is not present on the separate tag call. Keep it in a separate
statement or with the unconditioned exact-ARN lifecycle statement.
Do not condition CloudWatch tag permission on the three aws: system tag keys.
Although CloudWatch exposes generic request-tag condition keys, its alarm
tagging guidance explicitly says tag names beginning aws: cannot be used for
tag-based authorization control. The exact 17 ARNs are the reliable boundary.
Add no UntagResource, ListTagsForResource, metric data plane, state forcing,
composite/dashboard/anomaly/canary, or wildcard alarm capability.
Add a separate sns:TagResource statement on that same exact topic ARN.
Require a non-null aws:TagKeys request and use ForAllValues:StringEquals (or an independently proven equivalent) limiting
the request to:
The condition must reject a missing key set and any customer/extra tag key.
SNS documents aws:TagKeys for TagResource; the official CloudFormation SNS
provider supplies system tags on create.
Do not add ListTagsForResource, ListSubscriptionsByTopic, GetDataProtectionPolicy, UntagResource, publish, subscription,
confirmation, topic-policy, endpoint, KMS, wildcard, or other optional action.
The provider deliberately tolerates denial of the optional reads; they are not
proven deployment blockers.
logs:CreateLogGroup and logs:PutRetentionPolicy on the base and :*
forms for only the three custom /dataops/${FullDocsStackName}/conversational
groups;
logs:DescribeLogGroups alone on Resource: "*";
no delete, stream/event data plane, query/export/filter/subscription/policy,
KMS, delivery, or additional wildcard.
Acceptance criteria
Changes remain limited to the deploy-role template, focused tests, and
corrected public-safe fixture.
Fixture/transform assertions include the new worker health EventBridge
rule/Lambda permission and prove existing Gate A IAM covers them.
Mutation tests reject missing/broad tag actions, extra tag keys, absent aws:TagKeys, broad resources, optional reads, data plane, self-admin,
existing-policy drift, and every prior adversarial mutation.
[HUMAN/AWS] Corrected Gate B source is integrated; credentialed apply reached terminal success; the effective policy matches the accepted permissions and is in sync.
Fresh-build #128 into an isolated directory and translate dark, execution,
ingress, voice, photo, Typefully-external, and fully staged states. Compare
actual logical IDs, names, actions, conditions, schedules, permissions,
retention/retain policies, and prohibited families. Do not use stale .aws-sam output or self-compare an in-test constant.
Rollback uses CloudFormation and the prior accepted template, never manual IAM
editing or destructive resource cleanup.
Out of scope
#128 runtime implementation, extra alarms/metrics, subscription/contact
management, notifications, provider/Telegram calls, secrets, application
deployment outside CI, manual IAM edits, dashboards/composites/anomalies/
canaries, log data plane, optional provider reads, and any other repository or
stack.
Allow OIDC deployment of Telegram rollout alarms and health schedules
Status: corrected Gate B source integrated/applied/effective; production dark 17-alarm graph verification blocked by #136 (through #140 and #141)
Tags:
enhancement,human,assistant,infra,testing,P1Depends on: corrected #128 source/transform graph satisfied; successful normal CI deployment after #136 (which depends on #140, which depends on #141)
Blocks: #128 production/HUMAN closure only — source integration and IAM apply are complete
Related: #124, #129, #130
Current review state
The blocked
bbb0841653603ee0830747fbb0df43979df0a0ebcandidate was superseded by corrected Gate B sourceddbaf2893bf2985d32e5a33310fe57e2f4ac9452. Independent Architecture, IAM/security, Tester, and PM reviews passed; the corrected source was integrated, applied through its reviewed CloudFormation change set, verified effective, and foundIN_SYNC. No source correction or IAM apply remains.Normal-CI attempt 2 produced no CloudWatch, SNS, or log IAM denial, but downstream rollback removed the rollout topic before the 17-alarm and health-schedule graph could remain live. The only remaining criterion is the normal-CI dark-deployment observation after #136 → #140 → #141 clears.
Historical source boundary
The accepted corrected change was limited to:
That source stage is complete. It preserved #124/#129/#130 and introduced no DataOps application-source or CloudFormation service-role change.
Replacement #128 graph contract
Final review uses fresh replacement #128 source/build/transforms, not the old
fixture.
The observability family remains:
ConversationalRolloutAlarmTopic, exact name${FullDocsStackName}-conversational-rollout-alarms,alias/aws/sns, ARNoutput only, no subscription/topic policy/contact;
backend,execution, andresult-dispatcher;AWS::CloudWatch::Alarmresources with exact${FullDocsStackName}-conversational-<suffix>names and the one topic action;execution-worker-heartbeat-stale,recovery-heartbeat-stale, andresult-dispatcher-heartbeat-staleuseTreatMissingData: breaching;TreatMissingData: notBreaching;metric/filter/subscription, or additional observability family.
Keep the same 17 suffixes already enumerated by
bbb0841:#128 adds one execution-conditioned two-minute health-pulse
Scheduleevent tothe existing execution worker. The SAM transform therefore adds one
stack-prefixed
AWS::Events::Ruleand oneAWS::Lambda::PermissiontargetingConversationalExecutionWorkerFunction, in addition to the existing recoveryand result-dispatcher schedule resources. Update the fixture/final graph test
with the exact generated logical IDs, state/condition, input, target, and
permission ownership.
Do not add EventBridge or Lambda actions to the observability managed policy.
The accepted Gate A deploy policy already covers stack-prefixed EventBridge
rule lifecycle/tagging and Add/RemovePermission on the exact worker function
family. Structural tests must prove the new transformed resources fit those
existing statements without changing them.
Managed-policy placement and quotas
Retain one generated-name
ConversationalRolloutObservabilityDeployPolicy, attached only toGitHubActionsDeployRole. Do not setManagedPolicyName, grow the nearly fullinline policy, mix domains into Sponsor/dispatcher policies, or grant policy
self-administration.
The corrected compact observability policy must be
<= 5,632characters,leaving at least 512 below IAM's 6,144-character managed-policy limit. Preserve
all prior policy ceilings and the four-policy steady-state/eight-policy
replacement attachment model. Recompute from resolved documents.
Exact corrected OIDC permissions
CloudWatch alarm lifecycle and tag-on-create
Retain
cloudwatch:PutMetricAlarmon only the exact 17 alarm ARNs, with:cloudwatch:AlarmActions; andRetain
cloudwatch:DescribeAlarmsandcloudwatch:DeleteAlarmson those exact17 ARNs.
Add
cloudwatch:TagResourceon only those same 17 exact alarm ARNs. It isrequired because CloudFormation automatically supplies system tags, the alarm
resource supports tags, and AWS maps tagged alarm creation to
cloudwatch:TagResourcein addition toPutMetricAlarm.Do not place
TagResourcein the alarm-action-conditioned Put statement:that condition is not present on the separate tag call. Keep it in a separate
statement or with the unconditioned exact-ARN lifecycle statement.
Do not condition CloudWatch tag permission on the three
aws:system tag keys.Although CloudWatch exposes generic request-tag condition keys, its alarm
tagging guidance explicitly says tag names beginning
aws:cannot be used fortag-based authorization control. The exact 17 ARNs are the reliable boundary.
Add no
UntagResource,ListTagsForResource, metric data plane, state forcing,composite/dashboard/anomaly/canary, or wildcard alarm capability.
Authoritative references:
SNS topic lifecycle and tag-on-create
Retain exactly:
on the one exact topic ARN.
Add a separate
sns:TagResourcestatement on that same exact topic ARN.Require a non-null
aws:TagKeysrequest and useForAllValues:StringEquals(or an independently proven equivalent) limitingthe request to:
The condition must reject a missing key set and any customer/extra tag key.
SNS documents
aws:TagKeysforTagResource; the official CloudFormation SNSprovider supplies system tags on create.
Do not add
ListTagsForResource,ListSubscriptionsByTopic,GetDataProtectionPolicy,UntagResource, publish, subscription,confirmation, topic-policy, endpoint, KMS, wildcard, or other optional action.
The provider deliberately tolerates denial of the optional reads; they are not
proven deployment blockers.
Authoritative references:
Retained log groups
Retain the accepted exact policy:
logs:CreateLogGroupandlogs:PutRetentionPolicyon the base and:*forms for only the three custom
/dataops/${FullDocsStackName}/conversationalgroups;
logs:DescribeLogGroupsalone onResource: "*";KMS, delivery, or additional wildcard.
Acceptance criteria
corrected public-safe fixture.
preserves Add transactional approval and durable execution recovery #124/Repair DataOps OIDC SES configuration-set tag-on-create permission #129/Repair dispatcher generated-role IAM prefix for CloudFormation rollback #130 policies unchanged.
the exact alarm-action condition.
cloudwatch:TagResourcecovers only the same 17 exact alarm ARNs, has nomisleading system-tag condition, and no CloudWatch list/untag action is
added.
sns:TagResourceis exact-topic and accepts only the three non-nullCloudFormation system tag keys.
wildcard, or other action is added.
if statement ordering changes.
attachment headroom remains safe.
missing-as-breaching heartbeat alarms and 14 not-breaching alarms.
rule/Lambda permission and prove existing Gate A IAM covers them.
aws:TagKeys, broad resources, optional reads, data plane, self-admin,existing-policy drift, and every prior adversarial mutation.
sandbox/dataopstests,SAM lint, resolved-size checks, and diff checks pass.
and exact final Roll out and cut over the Telegram conversational MVP #128 graph before source integration.
Required tests
Run:
Parsed structural/mutation tests must prove:
cloudwatch:AlarmActions;EventBridge/Lambda permission statements;
preservation.
Fresh-build #128 into an isolated directory and translate dark, execution,
ingress, voice, photo, Typefully-external, and fully staged states. Compare
actual logical IDs, names, actions, conditions, schedules, permissions,
retention/retain policies, and prohibited families. Do not use stale
.aws-samoutput or self-compare an in-test constant.Sequencing and apply
graph.
aws-infra/mainwithRefs DataTalksClub/dataops#131; addhuman.dataops-github-actionswithCAPABILITY_NAMED_IAM.no alarm pages. Roll out and cut over the Telegram conversational MVP #128 owns subscription confirmation and alarm canaries.
Rollback uses CloudFormation and the prior accepted template, never manual IAM
editing or destructive resource cleanup.
Out of scope
#128 runtime implementation, extra alarms/metrics, subscription/contact
management, notifications, provider/Telegram calls, secrets, application
deployment outside CI, manual IAM edits, dashboards/composites/anomalies/
canaries, log data plane, optional provider reads, and any other repository or
stack.