Repository navigation
Allow OIDC deployment of Telegram rollout alarms and notifications #131
Description
Allow OIDC deployment of Telegram rollout alarms and health schedules
Status: complete — corrected Gate B source is integrated/applied/effective, and normal main CI successfully deployed the accepted default-off observability realization
Tags: enhancement, assistant, infra, testing, P1
Depends on: satisfied — corrected #128 source/transform graph, #140/#143 remediation, credentialed Gate B apply, and normal-CI dark deployment evidence are complete
Blocks: none — #128 retains its separate HUMAN subscription confirmation, staged rollout, and alarm canaries
Next owner: none
Resume condition: reopen only if normal CloudFormation deployment again fails on the constrained Telegram observability permissions or the accepted conditional graph cannot be realized
Related: #124, #129, #130
Evidence: normal push run 31545689094 created the all-off topic, three retained log groups, and three disabled generated health schedules, reached UPDATE_COMPLETE, seeded, and passed deployed smoke with every conversational rollout flag and alarm-subscription confirmation false; run 31711997388 later reconfirmed the default-off OIDC deploy path. The accepted transforms contain exactly 17 condition-gated alarm definitions; the correct dark realization has zero instantiated alarms. The unshipped #166 rollout is later work and does not invalidate this completed permission issue.
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.
The prior rollback evidence is superseded by normal push run 31545689094. That run used the accepted all-false controls, added the rollout topic, three retained custom log groups, and three generated disabled health schedules, reached terminal UPDATE_COMPLETE, completed runtime seeding, and passed deployed smoke without an authorization denial. The accepted transform verification already proves all 17 exact condition-gated alarm definitions; dark mode correctly instantiates zero alarm resources. With ConversationalAlarmSubscriptionConfirmed=false, zero active alarms, and no template subscription, there was no paging or message-content path. Later normal run 31711997388 reconfirmed the stable default-off deployment.
Historical source boundary
The accepted corrected change was limited to:
sandbox/dataops/template.github-actions.yaml
sandbox/dataops/tests/test_template_github_actions.py
sandbox/dataops/tests/fixtures/issue_128_observability.synthetic.yaml
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:
- 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, andresult-dispatcher; - exactly 17 simple
AWS::CloudWatch::Alarmresources with exact
${FullDocsStackName}-conversational-<suffix>names and the one topic action; - heartbeat suffixes
execution-worker-heartbeat-stale,
recovery-heartbeat-stale, andresult-dispatcher-heartbeat-staleuse
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:
execution-outcome-unknown
execution-failure-queue-visible
recovery-oldest-due-age
execution-worker-heartbeat-stale
recovery-heartbeat-stale
result-delivery-outcome-unknown
result-delivery-oldest-pending
result-dispatcher-heartbeat-stale
result-delivery-failed
telegram-webhook-failures
model-failures
voice-failures
photo-failures
typefully-draft-failed
media-cleanup-failed
retention-cleanup-failed
execution-failed-safe
#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.
Authoritative references:
- https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-resource-tags.html
- https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html
- https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_alarms_and_tagging.html
- https://docs.aws.amazon.com/service-authorization/latest/reference/list_cloudwatch.html
SNS topic lifecycle and tag-on-create
Retain exactly:
sns:CreateTopic
sns:DeleteTopic
sns:GetTopicAttributes
sns:SetTopicAttributes
on the one exact topic ARN.
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:
aws:cloudformation:logical-id
aws:cloudformation:stack-id
aws:cloudformation:stack-name
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.
Authoritative references:
- https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html
- https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsns.html
Retained log groups
Retain the accepted exact policy:
logs:CreateLogGroupandlogs:PutRetentionPolicyon the base and:*
forms for only the three custom/dataops/${FullDocsStackName}/conversational
groups;logs:DescribeLogGroupsalone onResource: "*";- 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. - One generated observability policy attaches only to the deploy role and
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. - Put/read/delete permissions cover only the 17 exact alarm ARNs and retain
the exact alarm-action condition. -
cloudwatch:TagResourcecovers only the same 17 exact alarm ARNs, has no
misleading system-tag condition, and no CloudWatch list/untag action is
added. - SNS lifecycle covers only the exact topic; separate
sns:TagResourceis exact-topic and accepts only the three non-null
CloudFormation system tag keys. - No optional tolerated SNS read, publish/subscription, topic-policy, KMS,
wildcard, or other action is added. - Log-group policy remains exact and unchanged except for size bookkeeping
if statement ordering changes. - Corrected compact policy is <=5,632 characters and all prior quota/
attachment headroom remains safe. - Final fixture matches Roll out and cut over the Telegram conversational MVP #128's 17 alarms with exactly three
missing-as-breaching heartbeat alarms and 14 not-breaching alarms. - 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. - Fresh final Roll out and cut over the Telegram conversational MVP #128 source/build/transforms and all
sandbox/dataopstests,
SAM lint, resolved-size checks, and diff checks pass. - Independent IAM/security and PM review accept the corrected commit range
and exact final Roll out and cut over the Telegram conversational MVP #128 graph before source integration. - [HUMAN/AWS] Corrected Gate B source is integrated; credentialed apply reached terminal success; the effective policy matches the accepted permissions and is in sync.
- [HUMAN] A normal-CI Roll out and cut over the Telegram conversational MVP #128 dark deployment realizes the accepted conditional graph without authorization denial, unexpected paging, or leakage: one topic, three retained log groups, and three disabled health-schedule rules are live; zero alarms are instantiated while every rollout flag is false, and the accepted transforms retain the exact 17 condition-gated alarm definitions.
Required tests
Run:
uv run --with pytest python -m pytest sandbox/dataops/tests -q
sam validate --lint --template-file sandbox/dataops/template.github-actions.yaml
git diff --check 2a1b95f...HEADParsed structural/mutation tests must prove:
- exact statement/action/resource/condition sets;
- SNS tag requests are non-null and limited to the three system keys;
- CloudWatch tag access is exact-ARN and not incorrectly tied to
cloudwatch:AlarmActions; - no new list/read/untag/data-plane/wildcard/self-admin action;
- exact 3/14 heartbeat missing-data split;
- exact transformed worker pulse rule/permission and reuse of existing Gate A
EventBridge/Lambda permission statements; - deterministic resolved policy sizes/attachments and 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
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-sam output or self-compare an in-test constant.
Sequencing and apply
- Roll out and cut over the Telegram conversational MVP #128 SWE produces the replacement runtime/SAM candidate.
- Assistant and Architect accept its heartbeat/maintenance behavior and fresh
graph. - Allow OIDC deployment of Telegram rollout alarms and notifications #131 SWE corrects the existing isolated IAM candidate and fixture.
- Independent IAM/security Tester and PM accept the exact corrected range.
- Integrate accepted source into
aws-infra/mainwith
Refs DataTalksClub/dataops#131; addhuman. - A credentialed operator reviews change sets/live attachments and applies
dataops-github-actionswithCAPABILITY_NAMED_IAM. - Verify terminal stack state and effective policy before Roll out and cut over the Telegram conversational MVP #128 commit/push.
- On-Call verifies the default-off app deployment creates the exact graph and
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.
Activity
alexeygrigorev commentedon Jul 30, 2026
PM GROOMED — READY FOR ISOLATED AWS-INFRA IMPLEMENTATION
Validated the intake author (
alexeygrigorev) and reviewed #128's full re-groomed rollout contract, Architect/On-Call findings, accepted #124/#129/#130 policy chain, currentaws-infra/origin/mainat2a1b95f, resolved policy sizes/attachments, and official CloudWatch/SNS/Logs authorization/resource behavior.Binding decisions now encoded in #131:
AWS::CloudWatch::Alarmresources, oneConversationalRolloutAlarmTopic, exactly three new custom retained log groups, and no other observability family.alias/aws/sns, outputs only its ARN, and contains no stack subscription, endpoint, contact, or topic policy. Therefore the deploy role gets no Subscribe/Unsubscribe/Confirm/Publish permission and no KMS permission. Subscription confirmation remains out-of-band/HUMAN./aws/lambda/...groups are never declared/adopted/deleted. New groups use exact/dataops/${FullDocsStackName}/conversational/{backend,execution,result-dispatcher}names, 30-day retention, and retain policies.PutMetricAlarmplus exact read/delete on the 17 alarm ARNs. Put is condition-bound to the one exact SNS alarm action. There is no metric data plane, state forcing, dashboard/composite/anomaly/canary, wildcard alarm, or tag capability.DescribeLogGroupsread action. Retained log groups cannot be deleted by this role.Readiness/dependency:
origin/mainusing the frozen contract.humanafter source integration. Credentialed apply/effective-policy/default-off evidence is required before closure; Roll out and cut over the Telegram conversational MVP #128 separately owns subscription confirmation and alarm canaries.No repository file, commit, branch, push, merge, AWS stack, alarm, topic, subscription, log group, provider, or runtime state was changed during grooming.
alexeygrigorev commentedon Jul 30, 2026
Software Engineer handoff — isolated observability deploy policy ready for security review
Implemented the frozen #131 IAM contract as a separate commit directly above accepted/pushed #130. No remote push/merge, AWS call/apply, dirty-checkout edit, or DataOps source edit was performed.
Isolated branch
DataTalksClub/aws-infra/home/alexey/git/.worktrees/aws-infra-131issue-131-conversational-rollout-observability-deploy-role2a1b95f4fd0f4d8d0d24e6edf4a337281c2aea79bbb0841653603ee0830747fbb0df43979df0a0ebRefs DataTalksClub/dataops#131Changed only the shared deploy-role source and its focused test assets:
sandbox/dataops/template.github-actions.yamlsandbox/dataops/tests/test_template_github_actions.pysandbox/dataops/tests/fixtures/issue_128_observability.synthetic.yamlExact managed-policy boundary
Added one generated-name
AWS::IAM::ManagedPolicy,ConversationalRolloutObservabilityDeployPolicy, attached only viaRoles: [!Ref GitHubActionsDeployRole]; it has no fixedManagedPolicyNameand grants no policy self-administration.Its five exact statements are:
cloudwatch:PutMetricAlarmon the 17 frozen exact alarm ARNs. The statement requires both:Null: { cloudwatch:AlarmActions: "false" }, preventing an absent alarm action;ForAllValues:ArnEqualsbinding every action to the one exact${FullDocsStackName}-conversational-rollout-alarmstopic ARN.cloudwatch:DescribeAlarmsandcloudwatch:DeleteAlarmson the same 17 exact alarm ARNs.sns:CreateTopic,DeleteTopic,GetTopicAttributes, andSetTopicAttributeson the one exact rollout topic ARN.logs:CreateLogGroupandPutRetentionPolicyon the base and:*forms of exactly the backend, execution, and result-dispatcher/dataops/.../conversational/...groups.logs:DescribeLogGroupsalone onResource: "*", the policy's sole wildcard resource.No CloudWatch metric data plane/state forcing/composite/dashboard/anomaly/canary/tag action; SNS publish/subscription/policy/endpoint/tag action; KMS action; log deletion/data-plane/query/export/filter/subscription/policy/index/KMS/delivery action; or IAM self-management was added.
The inline, Sponsor compute/service, and dispatcher policies remain domain-pure. All #124/#129/#130 structural and adversarial preservation tests remain active.
Combined automated evidence
PASS:
Mutation tests reject missing/extra/broad alarm ARNs; absent/different/additional alarm actions; CloudWatch data plane and other resource families; SNS publish/subscription/policy/tag/KMS; log deletion/data-plane/broad resources/additional wildcard actions; fixed policy name/extra role/self-administration; and all earlier-policy regressions.
Resolved sizes and replacement headroom
Actual policy documents were default/pseudo-value resolved and compact JSON serialized:
Live external attachments remain a mandatory operator inspection before apply.
#128 graph status — explicit pre-merge blocker
#128 is not implemented yet; no DataOps worktree or template currently contains
ConversationalRolloutAlarmTopic. Therefore no honest final #128 build or SAM transform comparison can be reported now.A parsed, public-safe synthetic fixture captures the frozen PM contract independently from the policy constants:
alias/aws/sns/output and no subscription/topic policy;The fixture intentionally asserts:
FINAL #128 BUILD/TRANSFORM REVALIDATION IS REQUIRED BEFORE MERGE/ACCEPTANCE. Once #128 exists, an independent reviewer must fresh-build and translate default-off plus every controlling switch state, compare actual topic/groups/alarm subsets/names/actions/conditions/retention/ownership and prohibited resource types to the fixture/policy, and reject or regroom #131 on any drift. This commit must not be pushed/merged or applied based only on the synthetic fixture.
READY FOR INDEPENDENT IAM/SECURITY REVIEW of the committed policy and tests, with final #128 graph verification explicitly pending.
alexeygrigorev commentedon Jul 30, 2026
TEST PASS — IAM source under frozen specification only
Independently reviewed aws-infra commit
bbb0841653603ee0830747fbb0df43979df0a0ebatop accepted2a1b95f. This is a conditional source/security pass, not final #131 merge/PM acceptance and not authorization to apply AWS changes.Source/security verdict
PASS for the committed IAM source against the frozen #128 graph:
ConversationalRolloutObservabilityDeployPolicy, attached only toGitHubActionsDeployRole; no fixed name, inline-policy growth, other-role attachment, or policy self-administration;PutMetricAlarmis limited to the exact 17 frozen alarm ARNs and requires a presentcloudwatch:AlarmActionsvalue whose every member equals the one exact rollout SNS topic ARN;DescribeAlarms/DeleteAlarmsuse the same exact 17 ARNs;CreateTopic,DeleteTopic,GetTopicAttributes, andSetTopicAttributeson the single exact topic ARN—no publish, subscription, topic-policy, endpoint, tag, or KMS administration;CreateLogGroup/PutRetentionPolicyon the base and:*ARN forms of the three frozen backend, execution, and result-dispatcher custom groups;DescribeLogGroupsalone hasResource: "*", the sole wildcard;AWS's current service-authorization reference confirms alarm ARNs are supported for
PutMetricAlarm,DescribeAlarms, andDeleteAlarms, andcloudwatch:AlarmActionsis supported byPutMetricAlarm. AWS's alarm-action guidance confirms that condition key is the intended control for restricting alarm actions.Independent evidence
Independent resolved-size/quota check:
Commit history is linear above
2a1b95fand includes accepted9b5b888and PR #18/#124 ancestry. The isolated aws-infra worktree remained clean and only the three handed-off files differ from the base.Mandatory unresolved pre-merge gate
The fixture is correctly and conspicuously marked:
It is not an actual #128 build. #128 remains open/unimplemented, and the current DataOps template does not contain
ConversationalRolloutAlarmTopicor the frozen alarm/log-group logical IDs. Therefore this test pass cannot establish that the eventual application graph matches these permissions.Before #131 merge or final PM acceptance, an independent reviewer must fresh-build and SAM-transform the implemented #128 default-off template and every controlling switch state, then compare the actual topic, three log groups, 17 alarm subsets/names/actions/conditions/retention/ownership, and prohibited resource types against the frozen fixture and this policy. Any drift requires #131 correction or explicit regrooming. Live external managed-policy attachments must also be inspected before the later credentialed apply.
Verdict: TEST PASS for source-under-frozen-spec; final build/transform verification remains a hard pre-merge/PM gate. No commit, push, merge, AWS call, or apply was performed.
alexeygrigorev commentedon Jul 30, 2026
ARCHITECTURE BLOCKED —
bbb0841must not proceed or be appliedThe final build/transform architecture gate is blocked. Full evidence and the exact frozen fingerprint are in the #128 Architect review.
Two hard blockers prevent #131 commit
bbb0841653603ee0830747fbb0df43979df0a0ebfrom proceeding to final review, merge acceptance, or credentialed Gate B apply:0; a stopped/stalled component publishes nothing; and each alarm usesTreatMissingData: notBreaching. The worker, recovery, and result-dispatcher stale alarms therefore cannot detect the failure they name. Fix or regroom the metric/alarm semantics, prove fresh/stale/stopped states, then refreeze the graph and IAM contract.sns:CreateTopicbut omitssns:TagResource. CloudFormation automatically supplies system tags, and the archived official AWS SNS provider explicitly declares system-tag-on-create support, merges those system tags intoCreateTopic, and includessns:TagResourcein its resource-role permissions. AWS documents that taggedCreateTopicrequires both permissions. With no separate CloudFormation service role, the OIDC deploy credentials must carry the needed resource permission. The exact-topic lifecycle policy is therefore not deployable as written.The second finding is not an argument to add every action declared by the provider. Its read path deliberately tolerates authorization denial for
ListTagsForResource,ListSubscriptionsByTopic, andGetDataProtectionPolicy; those are not asserted as hard blockers. The definite missing create permission issns:TagResource, which should remain exact-topic and condition-restricted to CloudFormation system tag keys where supported, with structural tests.One additional permission question requires explicit PM/IAM resolution before acceptance:
bbb0841also omitscloudwatch:TagResourcefor all 17 alarms. AWS documents that creating tagged alarms requires it, while CloudFormation documents automatic system tags. Establish authoritatively whether this alarm provider/deployment path passes system tags. If yes, grant it only over the exact 17 alarm ARNs with supported conditions and tests; if no, record the authoritative basis in the groomed contract. Do not use a live apply to discover the answer.The regenerated #128 source and fresh built graphs otherwise match #131's synthetic fixture exactly: one topic, three retained 30-day log groups, 17 alarms, no subscriptions/topic policies/forbidden observability resources, and active-alarm counts of dark 0, execution 6, ingress 7, voice 9, photo 9, Typefully external 7, and fully staged 17. The rest of
bbb0841remains least-privilege and structurally exact against that frozen graph.Verdict: ARCHITECTURE BLOCKED. Do not merge/apply
bbb0841; correct or explicitly regroom, then repeat independent transform/IAM review.I did not change the issue body or labels, edit repository files, commit, push, merge, deploy, call AWS, or apply CloudFormation. The only external effect here is this requested cross-linked review comment.
alexeygrigorev commentedon Jul 30, 2026
PM REGROOMED — IAM/FIXTURE CORRECTION REQUIRED
Commit
bbb0841remains isolated and must not be merged or applied.Binding IAM decisions:
sns:TagResourceon the exact topic in a separate statement, requirenon-null
aws:TagKeys, and allow only the three CloudFormation system tagkeys. Add no tolerated optional SNS reads.
cloudwatch:TagResourceon only the exact 17 alarm ARNs. CloudFormationsupplies system tags and AWS maps tagged alarm creation to this permission.
Do not condition it on AWS-prefixed tag keys because CloudWatch explicitly
says those keys cannot be used for tag-based authorization; exact ARNs are
the reliable bound.
semantics and the SAM-generated worker health EventBridge rule/Lambda
permission. Prove existing Gate A IAM covers those schedule edges; do not add
EventBridge/Lambda actions to the observability policy.
exact tag statements: <=5,632 characters, retaining >=512 bytes of headroom.
Sequence remains #128 replacement and specialist graph acceptance first, then
#131 correction/security/PM review, source integration, credentialed Gate B
apply, and only then #128 commit/push.
READY FOR #128 REPLACEMENT; #131 CORRECTION MAY PREPARE BUT FINAL GRAPH REVIEW IS BLOCKED
alexeygrigorev commentedon Jul 30, 2026
Software Engineer interim handoff — tagging correction complete; final graph revalidation pending
Corrected the known #131 tag-on-create IAM slice in the isolated
aws-infraworktree atop parked commitbbb0841653603ee0830747fbb0df43979df0a0eb. This remains uncommitted and must not be merged, pushed, or applied yet.Implemented IAM boundary
cloudwatch:TagResourceto the existing unconditioned alarm lifecycle statement over only the same exact 17 alarm ARNs. It is not tied tocloudwatch:AlarmActionsor any unreliable AWS-prefixed tag-key condition.sns:TagResourcestatement over only the exact rollout topic ARN.aws:TagKeysand usesForAllValues:StringEqualswith exactly:aws:cloudformation:logical-idaws:cloudformation:stack-idaws:cloudformation:stack-nameChanged in this correction slice:
sandbox/dataops/template.github-actions.yamlsandbox/dataops/tests/test_template_github_actions.pyThe synthetic fixture was deliberately not finalized in this slice.
sandbox/dataops/tests/fixtures/issue_128_observability.synthetic.yamlremains markedSynthetic: trueandRequiresFinalBuildTransformRevalidation: truepending #128's final generated worker health rule/permission inventory, hashes, and exact transform edges.Verification
Resolved compact policy evidence:
Resolved observability policy SHA-256:
Mutation coverage now rejects missing/broad/misplaced CloudWatch tagging, alarm-action or tag-key conditions on the CloudWatch tag call, missing/broad SNS tagging, absent/non-enforcing
aws:TagKeys, missing or extra permitted tag keys, optional SNS reads/untag, CloudWatch list/untag/data plane, and EventBridge/Lambda additions to the observability policy.INTERIM TAGGING SLICE COMPLETE. FINAL #128 FIXTURE/TRANSFORM/INVENTORY REVALIDATION REMAINS A HARD BLOCKER BEFORE TESTER/PM ACCEPTANCE, COMMIT, MERGE, OR APPLY.
alexeygrigorev commentedon Jul 30, 2026
Software Engineer replacement handoff — corrected IAM and final #128 graph frozen
This supersedes the conditional tagging-only handoff:
#131 (comment).
The corrected #131 candidate is complete in the isolated
aws-infraworktree atop parked commitbbb0841653603ee0830747fbb0df43979df0a0eb. It remains uncommitted and has not been pushed, merged, or applied.Corrected exact IAM boundary
cloudwatch:PutMetricAlarmremains limited to the exact 17 alarm ARNs and requires a presentcloudwatch:AlarmActionsset whose every value is the one exact rollout topic ARN.cloudwatch:DeleteAlarms,cloudwatch:DescribeAlarms, andcloudwatch:TagResourceshare the same exact 17 ARNs in the unconditioned lifecycle statement. The tag call has no alarm-action condition and no unreliable AWS-prefixed tag-key condition.CreateTopic,DeleteTopic,GetTopicAttributes, andSetTopicAttributeson the one exact topic ARN.sns:TagResourcestatement requiresNull: { aws:TagKeys: "false" }andForAllValues:StringEqualsover exactly the three CloudFormation system keys.Final replacement #128 graph evidence
Consumed the authoritative #128 replacement handoff:
#128 (comment)
Verified before fixture finalization:
Ran a fresh six-state source translation into an isolated ignored aws-infra evidence directory. The regenerated inventory was byte-identical to the authoritative inventory. Every state has 88 resources and the exact frozen transform hashes:
The checked-in public-safe fixture now freezes the actual graph and no longer contains the synthetic/final-revalidation markers. It asserts:
TreatMissingData: breaching, while the other 14 usenotBreaching;ConversationalExecutionWorkerFunctionExecutionHealthPulse/...Permission;ConversationalExecutionWorkerFunctionExecutionRecovery/...Permission;ConversationalResultDispatcherFunctionResultDelivery/...Permission;Structural tests prove the generated rules have no explicit names and fit Gate A's stack-prefixed EventBridge rule boundary. Worker permissions fit Gate A's exact execution-worker Lambda family; result-delivery permission fits the existing exact dispatcher family. Both contain the required
AddPermission/RemovePermissiondeployment APIs. No Gate A or observability action was broadened.Verification
Every command exited 0:
Fresh graph comparison additionally reported:
Resolved policy sizes and preservation hashes:
Final candidate file hashes:
No commit, push, merge, issue-body/label edit, AWS call, CloudFormation apply, policy attachment, application deploy, subscription, alarm, or runtime/provider action was performed.
READY FOR ARCHITECT AND INDEPENDENT IAM/SECURITY TESTER REVIEW.
alexeygrigorev commentedon Jul 30, 2026
ARCHITECT PASS — corrected IAM and final #128 graph
I independently re-reviewed the corrected, uncommitted #131 candidate in
/home/alexey/git/.worktrees/aws-infra-131, based on parked commitbbb0841653603ee0830747fbb0df43979df0a0ebabove accepted base2a1b95f4fd0f4d8d0d24e6edf4a337281c2aea79, against the authoritative repaired #128 replacement handoff.Architecture passes. #131 is authorized to proceed to independent IAM/security Tester and PM review. This is not authorization to commit, merge, push, or perform a credentialed Gate B apply.
Exact corrected IAM boundary
cloudwatch:PutMetricAlarmremains limited to the exact 17 frozen alarm ARNs and requires a presentcloudwatch:AlarmActionsset whose every member is the one exact rollout topic ARN.cloudwatch:DeleteAlarms,cloudwatch:DescribeAlarms, and the requiredcloudwatch:TagResourceuse exactly those same 17 alarm ARNs. Alarm tagging has no inapplicable alarm-action or AWS-prefixed tag-key condition.CreateTopic,DeleteTopic,GetTopicAttributes, andSetTopicAttributeson the one exact rollout topic ARN.sns:TagResourcestatement requires non-nullaws:TagKeysand usesForAllValues:StringEqualsover only:aws:cloudformation:logical-idaws:cloudformation:stack-idaws:cloudformation:stack-name:*pairs with onlyCreateLogGroupandPutRetentionPolicy;logs:DescribeLogGroupsremains the sole wildcard-resource action.GitHubActionsDeployRole, with no fixed name or policy self-administration.The resolved observability policy is 5,369 characters, below the regroomed 5,632 ceiling and IAM's 6,144 limit, leaving 775 characters of IAM headroom. Steady-state attachments remain 4/10; the simultaneous replacement model remains 8/10.
Exact final fixture/graph match
The fixture no longer carries the synthetic/final-revalidation markers. It matches the repaired #128 inventory and freezes:
TreatMissingData: breachingand 14 alarms withnotBreaching;ConversationalExecutionWorkerFunctionExecutionHealthPulse/...Permission;ConversationalExecutionWorkerFunctionExecutionRecovery/...Permission;ConversationalResultDispatcherFunctionResultDelivery/...Permission;Fn::Ifstates, functions, targets, worker action inputs, permission source ARNs, and absent dispatcher input;I independently regenerated the six #128 transforms twice. They were deterministic, each contained 88 resources, and matched the fixture hashes exactly:
Frozen #128 graph anchors:
The inventory's framed-content untracked digest is
dc50ff5129307087debb9470455cdf6c55d1fd59ab375a77b04f7f57b08178ac; the independently requested canonical aggregate of the seven sorted per-file digests is792c024c2d0189f0c70cbbb6fa7b59fe101a2a3932b4ad991ac3cb5a0afedcff. Both reproduce from the same seven files; there is no candidate-content mismatch.Corrected #131 fingerprints:
Independent verification
Structural mutation coverage rejects missing, misplaced, conditioned, broadened, or additional tagging; weakened/missing SNS tag-key enforcement; missing/extra/broad alarm or topic resources; optional reads and data-plane actions; EventBridge/Lambda leakage; policy placement/name drift; and regressions to the accepted Gate A, dispatcher, #124, #129, and #130 boundaries.
Verdict: ARCHITECT PASS. READY FOR INDEPENDENT IAM/SECURITY TESTER REVIEW, but not yet for merge or apply. Source integration, PM acceptance, credentialed Gate B apply, effective-permission inspection, and terminal stack verification remain separate mandatory gates.
I did not edit repository files, the issue body, or labels; did not commit, push, merge, deploy, attach a policy, or apply CloudFormation; and made no AWS/runtime/provider mutation. The only external effect in this step is this requested review comment.
alexeygrigorev commentedon Jul 30, 2026
TEST PASS — independent IAM/security review
The corrected automated #131 candidate passes independent IAM/security testing. This PASS authorizes Product Manager review only; it does not authorize commit, merge, push, AWS apply, #128 deployment, or issue closure.
Exact candidate and scope
DataTalksClub/aws-infra,/home/alexey/git/.worktrees/aws-infra-131main/origin/main:2a1b95f4fd0f4d8d0d24e6edf4a337281c2aea79bbb0841653603ee0830747fbb0df43979df0a0ebbbb0841:aa2e04121100ec575ecabaf4cd90038c4ffaa52dc1ebf9650a6a0c540c29cb252a1b95f:008169ebf688bdbd66fae6055e820380bff8faa36fac7776090d0c033074b69cExactly three authorized tracked paths are dirty and there are no untracked additions:
sandbox/dataops/template.github-actions.yaml— SHA-2563d6ed1a042970e53439d49d80e23034d1da8d3b42f21c310c1537fbffd30951fsandbox/dataops/tests/test_template_github_actions.py— SHA-256bda8e337b0a4c098d7d49a772dca8fa0f1fea2ea4131a651e68b68a0a6526132sandbox/dataops/tests/fixtures/issue_128_observability.synthetic.yaml— SHA-25629df7ff925c13cbf1558e24a7fb0eefad397d6da8fc41adbca3f4a6af2e226daExecuted verification
Every command exited 0:
ConversationalRolloutObservabilityDeployPolicyTest: 16 passed, 55 subtests passed.sandbox/dataops/tests: 50 passed, 105 subtests passed.sam validate --lint --template-file sandbox/dataops/template.github-actions.yaml: valid SAM template, with metadata and credential files disabled.git diff --check, base-range diff check, and correction-range diff check: passed.Exact IAM boundary
The generated-name
ConversationalRolloutObservabilityDeployPolicyretains the same logical resource ID asbbb0841, has noManagedPolicyName, and attaches only toGitHubActionsDeployRole. The correction is an in-place policy-document update, not a new role, attachment target, service role, or policy-administration surface.The resolved observability document contains only:
cloudwatch:PutMetricAlarmon exactly the frozen 17 alarm ARNs, conditioned by:Null: { cloudwatch:AlarmActions: "false" }; andForAllValues:ArnEqualsrequiring every alarm action to equal the one exact${FullDocsStackName}-conversational-rollout-alarmstopic ARN.cloudwatch:DeleteAlarms,cloudwatch:DescribeAlarms, andcloudwatch:TagResourceon exactly those same 17 alarm ARNs, with no condition on the separate tag call.CreateTopic,DeleteTopic,GetTopicAttributes, andSetTopicAttributeson the one exact rollout topic ARN.sns:TagResourcestatement with:Null: { aws:TagKeys: "false" }; andForAllValues:StringEqualsallowing onlyaws:cloudformation:logical-id,aws:cloudformation:stack-id, andaws:cloudformation:stack-name.logs:CreateLogGroupandlogs:PutRetentionPolicyon only the base and:*ARNs of the backend, execution, and result-dispatcher custom log groups.logs:DescribeLogGroupsalone onResource: "*", the only wildcard resource statement.The complete observability action set is therefore exactly:
No optional SNS list/read, publish, subscription, confirmation, topic-policy, endpoint, untag, or KMS capability exists. No CloudWatch list, untag, metric data plane, alarm-state forcing, dashboard/composite/anomaly/canary capability exists. No log deletion, stream/event data plane, query/export/filter/subscription/policy/KMS/delivery capability exists. No EventBridge, Lambda, IAM self-administration, broad resource, or extra wildcard was added to this policy.
Direct parsed comparison proves the accepted
GitHubActionsDeployRole, Sponsor compute policy, Sponsor service policy, and conversational dispatcher policy are byte-equivalent to base2a1b95f; #124/#129/#130 remain preserved.Resolved sizes, hashes, and attachment quota
3aaec33e0624faaafa3a7e6d5381415c80481dea5b7a6f51f1365663ce4b3a61.14276c7b72f3dc1b6d81a695d27c77274b4e861869ee0a519114851044bb64fb.991f8670747081dabd407d4fe8e101c1b9c4d7620722274b65b9325bdfefea04.435213eed7933be4ae303aae1b14ef72f09a42a4a6cf2c1f6fa99706455b827f.Structural mutation evidence
The shipped focused/full suites retain the complete prior mutation corpus. In addition, I ran 19 independent in-memory security mutations; 19/19 were rejected:
Fresh #128 graph proof
I regenerated all six transforms from the current frozen #128 source into an automatically removed external scratch directory rather than self-comparing the checked-in fixture. The fresh inventory was byte-identical to the authoritative inventory:
fb272bbddbde1a41cb2b5ae92cf0923baa03815a517df143119731fee2ef8ee5f5d053beb24013a5ef8daf01ff6522e3bf1ed673e616ac3dbdcf07609f3be7aaa8a9203638d27297f4c5a1f36b983e3731099f419bb0c8bdefaf19b8c64b1a4cFresh transform hashes, each with exactly 88 resources:
Direct normalized source/built comparison matches the topic, three retained 30-day log groups, 17 alarms, schedule inputs, and topic output. The alarm suffix set is exact; exactly three heartbeat alarms are
breachingand the other 14 arenotBreaching.The transformed graph contains exactly these rule/permission pairs:
ConversationalExecutionWorkerFunctionExecutionHealthPulse/...Permission;ConversationalExecutionWorkerFunctionExecutionRecovery/...Permission;ConversationalResultDispatcherFunctionResultDelivery/...Permission.A separate fresh dark transform directly proves all three rules have no explicit
Name. Their exact conditions,Fn::Ifenabled/disabled states, rates, targets, fixed worker inputs, dispatcher no-input behavior, permission principals, functions, and source ARNs match the fixture. Existing Gate A stack-prefixed EventBridge lifecycle/tagging and exact worker/dispatcherlambda:AddPermission/RemovePermissionfamilies cover these generated edges. The observability policy contains no EventBridge or Lambda action.The fixture contains no conditional-finalization marker, private sentinel, credential-shaped value, or prohibited resource declaration. No private #78 material or private repository was read.
Remaining mandatory HUMAN gates
This issue must remain open and must not be marked done after automated Tester/PM acceptance. After accepted source integration, preserve the required
humantracking state until a credentialed operator completes all of the following:dataops-github-actionswithCAPABILITY_NAMED_IAM.#128 separately owns subscription confirmation and alarm canaries.
I did not edit repository files, the issue body, or labels; did not commit, push, merge, deploy, dispatch, attach a policy, call AWS or a provider, or apply CloudFormation. The only external effect is this requested review comment.
TEST PASS — Tester authorizes Product Manager review. Keep #131 open for the HUMAN gates above.
alexeygrigorev commentedon Jul 30, 2026
PM final acceptance — ACCEPTED locally; HUMAN apply remains open
I accept the corrected #131 candidate after the independent SWE, Architect, and Tester chain and direct PM verification against the exact parked bytes. This is the infrastructure prerequisite for #128: #128
Reviewed handoffs:
Exact accepted fingerprint
/home/alexey/git/.worktrees/aws-infra-131bbb0841653603ee0830747fbb0df43979df0a0eb2a1b95f4fd0f4d8d0d24e6edf4a337281c2aea79aa2e04121100ec575ecabaf4cd90038c4ffaa52dc1ebf9650a6a0c540c29cb25008169ebf688bdbd66fae6055e820380bff8faa36fac7776090d0c033074b69c3d6ed1a042970e53439d49d80e23034d1da8d3b42f21c310c1537fbffd30951fbda8e337b0a4c098d7d49a772dca8fa0f1fea2ea4131a651e68b68a0a652613229df7ff925c13cbf1558e24a7fb0eefad397d6da8fc41adbca3f4a6af2e226daThe only candidate paths are the deploy-role template, its focused tests, and the corrected fixture required by the issue.
Product/operator acceptance evidence
ConversationalRolloutObservabilityDeployPolicyattaches only toGitHubActionsDeployRole; no service role or policy self-administration is introduced.cloudwatch:PutMetricAlarmis restricted to the exact 17 alarm ARNs and requires the exact rollout-topic alarm action. Describe/delete/tag access is restricted to the same 17 ARNs. CloudWatch tagging has no unreliableaws:system-tag authorization condition.sns:TagResourcepermission rejects a missing key set and accepts onlyaws:cloudformation:logical-id,aws:cloudformation:stack-id, andaws:cloudformation:stack-name.:*forms of the three custom groups; onlylogs:DescribeLogGroupsusesResource: "*".50 passed, 105 subtests passed; strict SAM lint passed; diff checks passed. The source/build/inventory and all six transformed-state hashes match the accepted Roll out and cut over the Telegram conversational MVP #128 review chain.Shipping and HUMAN apply instruction
This acceptance authorizes source integration, not an AWS apply:
Refs DataTalksClub/dataops#131(Refs #131in this issue's shorthand).human, leave Allow OIDC deployment of Telegram rollout alarms and notifications #131 open, integrate intoaws-infra/main, and push.aws-infradoes not deploy itself through CI/CD.dataops-github-actionswithCAPABILITY_NAMED_IAMand observe terminal success or an explained CloudFormation rollback.Rollback is through CloudFormation and the prior accepted template, never manual IAM edits or destructive resource cleanup.
Checklist normalization
I normalized the issue body to the verified state: the first 13 criteria are checked. The final
[HUMAN]apply/dark-deployment criterion remains unchecked. No non-checkbox issue-body content, candidate files, labels, commits, branches, AWS state, application deployment, or provider state was changed by PM review.alexeygrigorev commentedon Jul 30, 2026
ON-CALL — expected no-run; credentialed HUMAN apply required
Verified the
DataTalksClub/aws-inframain push for #131.Exact pushed and accepted source
origin/main:ddbaf2893bf2985d32e5a33310fe57e2f4ac9452bbb0841653603ee0830747fbb0df43979df0a0eb2a1b95f4fd0f4d8d0d24e6edf4a337281c2aea79bbb0841:aa2e04121100ec575ecabaf4cd90038c4ffaa52dc1ebf9650a6a0c540c29cb252a1b95f:008169ebf688bdbd66fae6055e820380bff8faa36fac7776090d0c033074b69c3d6ed1a042970e53439d49d80e23034d1da8d3b42f21c310c1537fbffd30951fbda8e337b0a4c098d7d49a772dca8fa0f1fea2ea4131a651e68b68a0a652613229df7ff925c13cbf1558e24a7fb0eefad397d6da8fc41adbca3f4a6af2e226da435213eed7933be4ae303aae1b14ef72f09a42a4a6cf2c1f6fa99706455b827f, 5,369 compact charactersThese fingerprints exactly match the accepted SWE, Architect, Tester, and PM review chain.
GitHub Actions / deployment status
Terminal classification: EXPECTED NO-RUN.
Deploy shared authentication;.github/workflows/deploy-shared-auth.ymlandsandbox/auth/**;sandbox/dataops/**paths.Therefore this source push scheduled no CI/CD job and performed no automatic CloudFormation apply, IAM mutation, or DataOps application deployment.
aws-infradoes not automatically deploy this stack.The accepted source was integrated through a clean isolated worktree. The primary
aws-infracheckout still contains unrelated dirty user changes and was not touched, cleaned, reset, staged, committed, or pushed.Credentialed operator gate
Keep #131 open with
human. A credentialed operator must:dataops-github-actionsstack and live managed-policy attachments ineu-west-1.ddbaf2893bf2985d32e5a33310fe57e2f4ac9452, create an UPDATE change set fromsandbox/dataops/template.github-actions.yamlwithCAPABILITY_NAMED_IAM.ConversationalRolloutObservabilityDeployPolicy(AWS::IAM::ManagedPolicy) and its attachment exclusively toGitHubActionsDeployRole. There must be no unexpected role/policy/resource change, replacement, attachment, action, resource, or condition drift. Stop rather than execute if the live baseline or change set differs.UPDATE_COMPLETE, or record an explained CloudFormation rollback with the failing events. Rollback must use CloudFormation and the prior accepted template, never manual IAM edits or destructive resource cleanup.The effective policy must contain exactly:
It must retain:
PutMetricAlarmon exactly the 17 accepted alarm ARNs with a non-nullcloudwatch:AlarmActionsset whose every value is the one exact rollout-topic ARN;sns:TagResourcestatement requiring a non-nullaws:TagKeysset limited to the three CloudFormation system keys;:*custom-log-group ARN forms;logs:DescribeLogGroupsas the soleResource: "*"action;Only terminal stack success plus effective Gate A and corrected Gate B verification releases the #128 commit/push hold. DataOps
origin/mainremains the accepted #128 basef08cfc750cebc601db8b71024168741f8ef4aadbat this check; recheck it immediately before shipping #128. Use the normal DataOps CI/CD path for the all-off dark deployment and leave #131 open until the remaining HUMAN dark-deployment evidence is complete.I did not trigger or rerun a workflow, call AWS, inspect credentials, apply CloudFormation, deploy the application, edit the issue body or labels, edit files, commit, push, or touch the unrelated dirty primary checkout. The only external effect of this on-call step is this requested status comment.
ON-CALL DONE: EXPECTED NO-RUN; WAITING FOR CREDENTIALED HUMAN APPLY
alexeygrigorev commentedon Jul 30, 2026
CREDENTIALED OPERATOR — Gate A + Gate B effective; #128 hold released
Completed the accepted sequential CloudFormation operator plan for stack
dataops-github-actionsineu-west-1.Exact accepted source
2a1b95f4fd0f4d8d0d24e6edf4a337281c2aea79ddbaf2893bf2985d32e5a33310fe57e2f4ac94523d6ed1a042970e53439d49d80e23034d1da8d3b42f21c310c1537fbffd30951fbda8e337b0a4c098d7d49a772dca8fa0f1fea2ea4131a651e68b68a0a652613229df7ff925c13cbf1558e24a7fb0eefad397d6da8fc41adbca3f4a6af2e226daBefore each operation, the exact clean source, accepted hashes, focused suites, strict SAM lint, and CloudFormation change-set inventory were revalidated. Gate A passed 34 tests plus 50 mutation subtests. Gate B passed 50 tests plus 105 mutation subtests.
Sequential CloudFormation result
Gate A was applied first from its independently reviewed change set. It reached terminal
UPDATE_COMPLETEand created exactly:SponsorCommunicationsComputeDeployPolicySponsorCommunicationsServiceDeployPolicyConversationalResultDispatcherDeployPolicyIt also updated
GitHubActionsDeployRolein place only atProperties.Policies; there was no role replacement or trust/name/session change.A fresh Gate B change set was then created against that effective baseline. Its authoritative inventory contained exactly one addition:
ConversationalRolloutObservabilityDeployPolicy(AWS::IAM::ManagedPolicy), generated name, attached only toGitHubActionsDeployRoleThere was no role modification, other addition, deletion, replacement, or attachment change. Gate B execution reached terminal
UPDATE_COMPLETE; the observability policy was the only resource created in that update. No rollback or failure event occurred.Effective IAM evidence
The stack now owns exactly the deploy role plus the four accepted managed-policy resources. The role has:
dataops-v1-deploy;DataTalksClub/dataopsmainwith audiencests.amazonaws.com.Every managed policy has one default version and is attached only to the deploy role, with no user or group attachment. Independent live-document comparison matched the accepted resolved source exactly:
The effective observability boundary is exactly the accepted one:
cloudwatch:PutMetricAlarmon the 17 exact alarm resources, requiring a non-null alarm-action set whose every value is the exact rollout topic;aws:TagKeyslimited to the three CloudFormation system keys;:*custom log-group resources;logs:DescribeLogGroupsas the sole wildcard-resource action;Drift and release decision
Post-Gate-B drift detection completed successfully:
UPDATE_COMPLETEIN_SYNC0IN_SYNCGate A and Gate B are now effective and exact. This releases #128 from the IAM prerequisite hold for its normal commit/push and all-off dark deployment through DataOps CI/CD.
No manual IAM edit, manual DataOps application deployment, provider call, subscription action, alarm canary, or runtime mutation was performed. Keep #131 open until #128's remaining default-off dark-deployment On-Call evidence confirms the exact graph, no authorization denial, no unexpected paging, and no leakage.
CREDENTIALED OPERATOR PASS — GATE A+B EFFECTIVE; #128 HOLD RELEASED
alexeygrigorev commentedon Jul 30, 2026
ON-CALL CROSS-CHECK — #131 NOT YET LIVE-VERIFIED
Exact-SHA workflow
79ed0adb3c9f020a435f9604879be2331b6968fdpassed checks but rolled back during normal CI deployment because of the unrelated #129ses:TagResourcedenial on the Sponsor SES configuration set:https://github.com/DataTalksClub/dataops/actions/runs/30591398299
The rollout SNS topic began creation and was cancelled/deleted during rollback. No SNS, CloudWatch, or custom-log-group IAM denial was observed, but the stack never reached a state where #131's full dark observability graph/no-paging assertions could be verified. The restored stack has no six-control #128 parameter set.
Keep #131 open with
human. Gate B's live app-deployment criterion remains unchecked until #129 is corrected/applied and a later normal CI deployment reaches terminal success. No manual deployment, alarm/subscription change, or AWS mutation was performed by On-Call.alexeygrigorev commentedon Jul 31, 2026
ON-CALL ATTEMPT 2 — GATE B NOT YET LIVE-ACCEPTED
Workflow attempt 2
passed all checks and reached AWS, but failed before the #128 observability
graph could remain deployed. The rollout topic was created and then deleted
during rollback; no rollout alarms or schedules are live, and the restored
stack is the prior 38-resource graph.
The initiating failures were the #130 dispatcher generated-role name
truncation and an all-at-once Sponsor CRM multi-GSI update. There was no
CloudWatch/SNS/log IAM denial, but this run does not satisfy #131's default-off
deployment/On-Call criterion. Keep #131 open with
human.Canonical evidence and retained-queue reconciliation:
#128 (comment)
alexeygrigorev commentedon Jul 31, 2026
PM STATUS RECONCILIATION — corrected Gate B effective; live alarm graph pending
bbb0841candidate was superseded. The corrected source/final graph passed Architecture, independent IAM/security testing, and PM acceptance.ddbaf2893bf2985d32e5a33310fe57e2f4ac9452was integrated, applied, and verified effective andIN_SYNCby the credentialed operator. The source-correction/apply portion of the HUMAN criterion is complete.PM decision: keep #131 open with
human. Closure requires one normal-CIall-off deployment that leaves the exact 17-alarm/topic/health-schedule graph
live and On-Call confirmation of no authorization denial, unexpected page, or
information leakage. It must not be replaced by a manual app deployment or a
claim based only on effective IAM.
No code, AWS, IAM, workflow, environment, flag, paging, or provider action was
performed during this reconciliation.
alexeygrigorev commentedon Jul 31, 2026
PM tracker reconciliation — effective Gate B separated from live graph acceptance
Preserved the corrected/effective Gate B and prior review evidence. Replaced the stale #141 dependency with #140 lifecycle acceptance plus #143 ownership remediation, recorded On-Call and the terminal-success 17-alarm graph resume signal, and removed the premature
humanlabel while live agent verification remains. No AWS or criterion change occurred.alexeygrigorev commentedon Aug 13, 2026
PM final acceptance — default-off normal-CI gate satisfied
The final #131 criterion is complete. The previously blocked rollout was superseded by normal push run 31545689094 at
5ac8b39c39e358cdec41b192bad984b8a46a2daa:false, includingConversationalAlarmSubscriptionConfirmed=false;UPDATE_COMPLETE;The old criterion text conflated the frozen 17-alarm transform graph with its all-off runtime realization. The already accepted transforms contain exactly 17 condition-gated alarm definitions, while dark mode correctly instantiates zero alarm resources. With zero active alarms, a newly created topic,
ConversationalAlarmSubscriptionConfirmed=false, and no subscription resource in the accepted template, there was no paging or message-content delivery path. Normal run 31711997388 later reconfirmed the stable default-off OIDC deployment.The corrected Gate B source, reviewed credentialed apply, effective-policy fingerprint, attachments, and
IN_SYNCverification were already accepted. #128 continues to own subscription confirmation, staged rollout, and alarm canaries; those are not #131 closure gates. The unshipped #166 sequence is later application-stack work and does not reopen this completed IAM issue.PM decision: all #131 acceptance criteria are satisfied; close as completed. Reopen only on recurrence of the bounded observability-deploy authorization failure or inability to realize the accepted conditional graph.
This reconciliation made no repository edit, test run, AWS/IAM call, workflow dispatch, credential/provider change, or data operation.