Repository navigation
Make sandbox the only active DataOps deployment and rollout target #145
Description
Make sandbox the only active DataOps deployment and rollout target
Status: done — usual-OIDC source shipped at d0c2b5033d3272c7eda9db61868cd106742e2bb0; source checks passed, automatic deployment failed closed at existing guard-cloudformation-table-stack-id-absent, and zero migration runs occurred
Tags: bug, infra, testing, migration, P0
Depends on: None — this pre-#136 boundary repair can proceed while #143 independently owns Sponsor table ownership reconciliation
Blocks: None — the #145 source prerequisite is complete; #136 and its downstream graph remain independently blocked by #143 and later fresh gates
Next owner: None for #145; the authorized HUMAN data owner/operator continues with #143 Phase 0 classification
Resume condition: Closed/completed for the source correction. Do not rerun, bypass, or classify the failed deployment as success; #136 resumes only after #143 records an accepted ownership outcome and fresh pre-dispatch gates pass.
Authoritative product decision — simple existing OIDC
DataOps runs only in the shared AWS sandbox for now. Current work must not require, create, select, deploy, mutate, smoke-test, or roll out a production target. Any future production work requires new user authorization and a separately groomed issue.
Use the same existing exact GitHub Actions OIDC role/trust path used by ordinary DataOps deployment and the other projects: exact repository DataTalksClub/dataops, exact branch refs/heads/main, and exact audience sts.amazonaws.com. The Sponsor migration job must have no GitHub Actions environment binding. Do not rename dataops-v1-production to another environment; remove the job-level environment key entirely.
No GitHub environment is created or configured. No environment OIDC subject is added. No independent-reviewer, self-review, or administrator-bypass gate exists under this simplified model. The user explicitly chose this tradeoff. Safety remains in the manual-only trigger, exact actor gate, exact existing main-branch OIDC trust, exact runtime identity/resource checks, shared non-cancelling deployment concurrency, and the complete #136 fail-closed migration state machine.
The current stack, role, table, bucket, and domain names are legacy neutral identities. Do not rename or replace them under this correction. Sandbox does not declassify Sponsor, finance, contact, Telegram, Mailchimp, Trello, or other operational data; existing privacy, integrity, backup, retention, rollback, and explicit later HUMAN controls remain.
Current state and issue graph
- Ordinary application deployment uses
.github/workflows/deploy-dataops-v1.yml, the existing exact main-branch OIDC subject,samconfig.tomlenvironmentfull-sandbox, roledataops-github-actions-deploy, and stackdataops-v1. - The Sponsor migration incorrectly declares nonexistent GitHub environment
dataops-v1-production. An environment-bound job receives an environment subject that the existing exact main-branch trust does not admit. - The accepted correction is to remove that binding, so the migration uses the already-admitted exact main-branch subject. The existing AWS trust and deploy-role permissions remain unchanged.
- Reconcile Sponsor CRM table ownership with CloudFormation #143 independently blocks Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 on Sponsor table ownership. Close out the retained CloudTrail audit session record #141 is not a blocker. Completing Make sandbox the only active DataOps deployment and rollout target #145 does not satisfy Reconcile Sponsor CRM table ownership with CloudFormation #143, authorize Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 dispatch, or prove table ownership.
- Through Migrate Sponsor CRM GSIs in a protected stage-only workflow #136, the current application/Sponsor/Telegram closure chain remains blocked. Real provider or operational-data gates outside that chain must identify sandbox before they run.
Superseded local candidates — preserve, never activate
The earlier protected-environment design and every PASS bound to it are superseded by this user decision. They remain historical evidence only and do not pass or authorize the replacement.
DataOps superseded candidate:
- base
b9470340c2837931a7c1c0cb0cb2148b82216cc7; - accepted tree
38687cbdf297530c5d37fd6509c871dec8a4f7dc; - full-index binary diff SHA-256
f9e7c7df7f416a580c7a6c938dedb27c7e6d222a2980852fdf648afa03aeae2c; - local unpushed commit
672c205eb58c36c3dbf8c6fe1787ec1d2b0cbc86(Use sandbox protected migration boundary).
aws-infra superseded candidate:
- base
d370385556344bb6841f88473c12397c326a6b5a; - accepted tree
081a96837d6d3d998a802e0b4762c629bdd1a733; - full-index binary diff SHA-256
86553f62fa929b4ff222fc51df237802005fe996cb83150adc2f64faddf04d0c; - local unpushed commit
8cd8b37ea77c7ad47bd2fb0d10b4c53e17fb94d0(Trust DataOps sandbox environment OIDC subject).
Neither commit is present on a remote branch. Do not push, merge, cherry-pick, rebase, amend, reset, force-move, delete, or apply either superseded branch/commit. Do not apply the superseded aws-infra trust template. Preserve the worktrees and historical issue comments. Build the replacement in a fresh clean DataOps worktree/branch from current main; do not layer it on either superseded commit.
Scope — DataOps only
Change only:
.github/workflows/migrate-sponsor-crm-gsis.yml;scripts/deploy/README.md; andscripts/deploy/sponsor-crm-gsi-core.test.mjs.
Required behavior:
- Remove the migration job's
environmentkey entirely. The parsed job must not have anenvironmentproperty, environment URL, environment secret/variable dependency, or environment approval path. - Preserve
workflow_dispatchas the only trigger and exact actoralexeygrigorevas the job gate. - Preserve exact repository/main-ref/SHA validation, existing OIDC role and audience/subject assumptions, account/partition/region/stack/logical-resource/physical-table/ARN/TableId checks, and every accepted Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 ownership/schema/state/integrity check before mutation.
- Preserve shared
dataops-v1-deployconcurrency withcancel-in-progress: false, the exact migration command, migration-only behavior, cleanup/recovery, and all Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 fail-closed logic. - Preserve
.github/workflows/deploy-dataops-v1.ymland its exact accepted SAM command byte-for-byte. Do not add migration behavior to ordinary deployment or application deployment to the migration workflow. - Update the focused public-safe README to describe the simple existing-main-branch OIDC model accurately. Remove the superseded environment → trust → workflow activation procedure and every implication that a GitHub environment or extra trust subject is required.
- Update focused tests to parse the workflow and prove the migration job has no
environment, remains manual/actor/main/repository/OIDC/concurrency/migration-only, contains no production target, and leaves ordinary deployment unchanged. - Do not change
infra/template.full.yaml,samconfig.toml, application resources, migrator/guard runtime source, package files, stack/resource names, flags, provider configuration, or any source repository outside DataOps.
Because the workflow bytes and trust model differ from both #136's older accepted fingerprint and #145's superseded candidate, freeze a new exact base, NUL-safe path inventory, candidate tree, full-index binary diff hash, and final file hashes. All earlier #145 Architecture/Security/Tester/PM decisions are historical only; every role reviews the new fingerprint.
Acceptance criteria
- The migration job has no GitHub Actions
environmentkey or environment-dependent secret/variable/approval path. - The migration uses the existing exact main-branch OIDC role/trust path; no environment subject, AWS trust change, deploy-role permission change, or
aws-infrasource/apply is required. - The migration remains
workflow_dispatch-only, exact-actor constrained, exact repository/main/SHA/OIDC/account/region/stack/table bound, shared non-cancelling, migration-only, and fail-closed under the complete accepted Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 contract. - No active workflow names or selects
dataops-v1-productionor any production environment/target. - The ordinary deploy workflow, exact SAM command, application template,
full-sandboxconfig, runtime resources, stack/resource names, flags, and provider configuration are unchanged. - The DataOps candidate changes exactly the three owned paths and records exact base/path/tree/diff/file fingerprints from a fresh clean worktree based on current
main. - Superseded commits
672c205eb58c36c3dbf8c6fe1787ec1d2b0cbc86and8cd8b37ea77c7ad47bd2fb0d10b4c53e17fb94d0, their branches/worktrees, and historical comments remain preserved but unpushed, unmerged, unapplied, and unused by the replacement. - Focused tests parse every active workflow, assert the migration job lacks
environment, pin the ordinary deploy workflow/SAM command, and reject production/alternate target drift. - Architecture accepts the new exact fingerprint, simple main-branch OIDC shape, unchanged identities, and Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 fresh-review carry-forward.
- Security accepts the new exact fingerprint, exact actor/repository/main/OIDC boundary, unchanged trust/least privilege, and no environment/reviewer gate.
- Tester runs the complete required verification below with exact commands, exit codes, and counts. No UI changed, so screenshots are not required.
- PM accepts the simplified operator flow and confirms no superseded candidate was activated or represented as current.
- Software Engineer commits the accepted DataOps-only replacement with
Closes #145; noaws-infracommit is created, merged, pushed, or applied. - Orchestrator merges/pushes only the accepted replacement commit; On-Call verifies source CI and records that no migration/application workflow was dispatched under Make sandbox the only active DataOps deployment and rollout target #145.
- No GitHub environment creation/configuration, AWS trust/permission mutation, migration dispatch, application deploy, provider call, Telegram action, feature enablement, queue action, private-evidence inspection, or data mutation occurs under Make sandbox the only active DataOps deployment and rollout target #145.
Required verification
From the fresh DataOps replacement worktree:
npm run test:sponsor-gsi-migrator
uv run --with pytest python -m pytest -q tests/infra
git diff --checkTester must additionally:
- parse all active
.github/workflows/*.ymland prove the migration job has noenvironmentproperty; - prove
workflow_dispatchis the only migration trigger, actor is exact, runtime repository/ref/SHA checks remain exact, and shared non-cancelling concurrency is unchanged; - prove the migration still uses the existing role and contains only the accepted migration command after setup;
- prove no active workflow contains
dataops-v1-productionor selects a production target; - reproduce the ordinary deploy workflow SHA-256 and accepted SAM-command digest from the pre-Make sandbox the only active DataOps deployment and rollout target #145 base;
- verify
infra/template.full.yaml,samconfig.toml, migrator/guard runtime source, and every non-owned path are byte-identical to the accepted base; and - verify both superseded local commits remain outside all remote refs and no
aws-infradiff is part of the replacement.
No aws-infra test, SAM trust-template validation, AWS-backed check, workflow dispatch, browser test, or screenshot is required for this DataOps-only source gate.
Test scenarios
Authorized main-branch manual dispatch uses the usual OIDC subject
Given exact actor alexeygrigorev manually dispatches the accepted workflow on exact DataTalksClub/dataops main
When GitHub issues the OIDC token without a job environment
Then it has the existing exact main-branch subject admitted by the unchanged deploy-role trust, and the complete runtime preflight still must pass before mutation.
Alternate actor, repository, ref, or identity is attempted
Given another actor, repository, branch/tag/PR ref, SHA/identity mismatch, account, region, stack, or table identity
When the job gate, unchanged exact main-branch trust, and runtime preflight evaluate it
Then it is skipped or fails closed before migration mutation.
Production or environment binding is reintroduced
Given a job environment, environment subject, dataops-v1-production, another production target, or caller-selectable target is added
When parsed workflow tests run
Then the candidate fails.
Existing ownership blocker remains
Given #145 source is integrated while #143 remains incomplete
When #136 readiness is assessed
Then migration and ordinary deployment remain blocked; sandbox naming and simple OIDC do not establish Sponsor table ownership or authorize dispatch.
Superseded candidate is encountered
Given either preserved local superseded commit or its historical PASS comments
When replacement integration is considered
Then it is recognized as historical only and is never merged, pushed, applied, or treated as evidence for the new fingerprint.
Role and release sequence
- Software Engineer creates a fresh clean DataOps worktree/branch from current
main, implements only the three owned paths, does not commit, and freezes the exact replacement fingerprint. - Architecture reviews the replacement workflow/OIDC shape and Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 carry-forward.
- Security reviews exact actor/repository/main/OIDC/least-privilege boundaries and the explicit absence of an independent environment reviewer gate.
- Tester runs the complete required verification against the same frozen fingerprint.
- Product Manager performs final acceptance against the simplified operator journey.
- Software Engineer commits with
Closes #145only after all gates pass. - Orchestrator merges/pushes through the normal local-main process.
- On-Call monitors source CI. No workflow dispatch, deployment, environment action, or AWS mutation is part of Make sandbox the only active DataOps deployment and rollout target #145.
Deferred child boundary
#146 remains a separate post-#136 sandbox runtime/export-provenance correction. It no longer waits for GitHub-environment or extra-trust evidence; it still waits for the accepted #145 DataOps-only correction and #136 migration plus ordinary sandbox deployment.
Out of scope
- Any
aws-infrasource change, CloudFormation trust apply, deploy-role trust/permission change, or alternate OIDC subject. - Any GitHub Actions environment creation, configuration, secret, variable, reviewer, bypass, protection, or HUMAN environment gate.
- Any production environment, deployment, data action, smoke, rollout, or future-production design.
- Dispatching/rerunning migration or application workflows.
- Changing Sponsor ownership logic, GSI state-machine behavior, Reconcile Sponsor CRM table ownership with CloudFormation #143 evidence requirements, or table/resource identity.
- Changing
infra/template.full.yaml,samconfig.toml,.github/workflows/deploy-dataops-v1.yml, application runtime, export schemas,DataOpsEnvironment, orDATAOPS_ENV. - Renaming stacks, roles, tables, buckets, queues, functions, domains, or retained resources.
- Provider/Telegram calls, feature enablement, operational-data writes, queue reconciliation, Support contact, private-evidence inspection, or cleanup.
- Modifying
../aws-infra,../dtc-operations,../datatasks,../podcast-assistant, or any repository other than the three exact DataOps paths.
Activity
alexeygrigorev commentedon Aug 2, 2026
PM GROOMED — sandbox-only pre-#136 boundary is agent-ready
The authoritative correction is now expressed as the smallest safe pre-#136 change:
aws-infraadds exactly the sandbox-environment OIDC subject while retaining the exact ordinarymainbranch subject and every permission boundary.dataops-v1-sandboxwith main-only deployment, an independent reviewer, no self-review, and no administrator bypass.The current dirty
aws-infracheckout is explicitly excluded. SWE must use a clean isolated worktree from currentorigin/mainand preserve all user-owned changes.Runtime/export
DataOpsEnvironmentlabeling is excluded because changing the application template or ordinary deploy parameters before #136 would invalidate its accepted template/deploy contract. A concise post-#136 raw child intake is returned separately to the orchestrator; no child was created.needs groomingis removed and the issue now hasbug,infra,testing,migration, andP0. Exact next role: Software Engineer, producing the frozen two-repository candidate without AWS/GitHub-environment mutation and without committing before Architecture, Security, Tester, and PM review.alexeygrigorev commentedon Aug 2, 2026
ARCHITECTURE BLOCK — candidate bytes are sound; cross-repository activation order is not closed
I independently reviewed only the two frozen uncommitted candidates and made no edit, commit, AWS call, workflow dispatch, GitHub-environment change, or private-evidence inspection.
Fingerprint binding
DataOps:
/home/alexey/git/dataops/.tmp/worktrees/issue-145b9470340c2837931a7c1c0cb0cb2148b82216cc77df62fa5eab070f551b30e4e89c4c2e15e3ead6c76ce90f72c181e2735705f47959ce7ed6608e5b2b2036c5ba1b7c8d70b4c0366aws-infra:/home/alexey/git/aws-infra-worktrees/issue-145-sandbox-oidcd370385556344bb6841f88473c12397c326a6b5a79ad598d96f69097ded0aa780d83b9c6dc5558ca6700afbab784b0c94cc25e1b4428cd137e5e8610202ef394948b2124a1dd0472Both path inventories are exact and
git diff --checkis clean.Static architecture findings
PASS — exact trust shape. The sandbox deploy-role trust retains exact audience
sts.amazonaws.comand the exact ordinaryDataTalksClub/dataopsmain-branch subject, then adds only the exactdataops-v1-sandboxenvironment subject. Owner/repository/branch parameters are additionally closed to their one accepted value. There is noStringLike, wildcard subject, production subject, alternate branch/tag/PR/environment/repository, or alternate audience in the accepted trust object. Parsed mutation tests cover these rejections.PASS — unchanged least privilege and identities. The
aws-infratemplate diff changes only parameter constraints andAssumeRolePolicyDocument; it changes no permission action/resource, managed-policy attachment, role/session property, retention property, stack/resource identity, or unrelated resource. Existing permission fingerprints remain frozen in tests. The DataOps diff changes only the migration workflow, direct public documentation, and focused test; application template,samconfig.toml, migrator/guard runtime, package files, stack/resource names, flags, and provider configuration are unchanged.PASS — ordinary deploy/SAM bytes.
.github/workflows/deploy-dataops-v1.ymlremains byte-identical with SHA-2564611d88891fcb3031a94b0140b7238686e6e68feb68824ac7332d1a71180b14c;infra/template.full.yamlandsamconfig.tomlare also byte-identical to the supplied DataOps base. The focused test pins the ordinary deploy workflow digest.PASS — sandbox-only active workflow target. The migration now names only
dataops-v1-sandbox; the active workflow inventory contains no production environment/target. Manual-only trigger, actor gate, shared non-cancelling concurrency, OIDC role, and migration-only command remain unchanged.PASS with required carry-forward — #136 fingerprint. This deliberately changes #136’s migration-workflow bytes, so its earlier accepted full candidate fingerprint cannot authorize dispatch. The new #145 fingerprint and later effective environment/trust evidence must be inputs to fresh #136 Architecture/Security review after #143; historical #136 evidence remains historical.
Blocking finding — unsafe activation-order window
The code and trust are individually correct, but neither candidate nor the current #145 sequencing defines one mandatory cross-repository activation order.
An environment-bound GitHub OIDC token uses the environment subject and no longer carries the branch subject. If the new sandbox environment subject is applied to AWS trust before
dataops-v1-sandboxexists with main-only deployment, an independent required reviewer, self-review prevention, and administrator-bypass prevention, a workflow job referencing that name can receive the now-admitted subject without the intended GitHub protection boundary. The workflow runtime checks do not replace the missing pre-credential environment approval.The current issue says both HUMAN actions happen after source integration but does not order environment configuration versus effective trust versus DataOps workflow activation. The READMEs describe the subjects but not a monotonic activation sequence. “No dispatch is authorized” is necessary but is not a technical prevention against accidental or premature dispatch.
Required repair
Freeze a replacement candidate and update the public-safe source/handoff contract to require this exact order:
dataops-v1-sandboxfirst and prove main-only deployment, at least one independent required reviewer, self-review prevented, and administrator bypass disabled.aws-infrasource and apply/read back the exact two-subject trust only after step 2 passes. Source integration alone remains non-effective.Alternatively, another sequence may pass only if it proves there is never an interval in which an active workflow can obtain the environment subject before all GitHub protections are effective. State the proof explicitly; inference from actor intent is insufficient.
At minimum, place the order in the durable public-safe deployment documentation already touched by this candidate and reconcile the #145 role/release sequence. Add a focused assertion if the order is represented in machine-readable workflow/configuration state. Preserve all passing trust, permission, workflow, identity, and ordinary-deploy properties above.
Verdict: ARCHITECTURE BLOCK. Re-review only a newly frozen two-repository fingerprint after the activation order is explicit. Tester commands remain for the Tester role; this architecture review did not substitute for them.
alexeygrigorev commentedon Aug 2, 2026
SECURITY PASS — exact frozen source candidates only
I independently reviewed the two uncommitted candidates against the complete #145 sandbox-only contract. I made no source edit, commit, AWS call, GitHub environment/configuration change, workflow dispatch, Support contact, or private-evidence inspection.
Frozen fingerprints
DataOps:
b9470340c2837931a7c1c0cb0cb2148b82216cc77df62fa5eab070f551b30e4e89c4c2e15e3ead6c76ce90f72c181e2735705f47959ce7ed6608e5b2b2036c5ba1b7c8d70b4c0366aws-infra:
d370385556344bb6841f88473c12397c326a6b5a79ad598d96f69097ded0aa780d83b9c6dc5558ca6700afbab784b0c94cc25e1b4428cd137e5e8610202ef394948b2124a1dd0472Both diffs pass
git diff --check; both worktrees contain only the three declared modified paths.Trust and least-privilege decision
The deploy-role trust remains one exact Allow statement for the existing GitHub OIDC provider and
sts:AssumeRoleWithWebIdentity. Its Condition contains onlyStringEqualswith:aud=sts.amazonaws.com;repo:DataTalksClub/dataops:ref:refs/heads/mainsubject; andrepo:DataTalksClub/dataops:environment:dataops-v1-sandboxsubject.Owner, repository, and branch parameters are additionally restricted to their one exact allowed value, so the substitutions cannot be caller-selected. Parsed/adversarial tests reject production or other environments, other branch/tag/pull-request subjects, other repository/owner, wildcard subjects, alternate audiences,
StringLike, missing conditions, and parameter broadening.The exact three-path diff changes no deploy permission action/resource, inline or managed-policy attachment, role name, maximum session duration, retention policy, stack/account/region/resource boundary, or unrelated resource. Existing exact permission-policy fingerprints, inventory, attachment counts, and quota checks remain green. The README correctly describes this as an additive trust change with permissions unchanged.
DataOps sandbox boundary
The migration changes only
dataops-v1-productionto exactdataops-v1-sandbox. It remainsworkflow_dispatch-only, exact-actor constrained, main/repository/runtime checked, under shared non-cancelling deployment concurrency, OIDC-based, and migration-only. The accepted #136 guard/migrator runtime and ownership state machine are untouched.The ordinary deploy workflow is untouched and its complete source digest is pinned by the passing test. Parsed active-workflow coverage finds no production environment/target name. The candidate does not create or select a production resource, change legacy stack/resource identities, alter flags/providers/runtime labeling, or authorize use of production credentials/data. Sandbox continues not to declassify operational or Sponsor data.
Protected environment and evidence boundary
This PASS is source-only. The environment OIDC subject does not encode its branch/reviewer rules; therefore exact
dataops-v1-sandboxremains blocked until an authorized administrator separately proves:mainmay deploy;Only the sanitized environment name, rule counts/results, UTC time, verifier role, and PASS/FAIL may be public. Reviewer identity/contact details, screenshots, private links, secrets, and provider/resource identifiers remain prohibited.
Likewise, source integration does not make the AWS trust effective. The later HUMAN change set must prove exactly one non-replacing trust-policy change and no permission, attachment, role/session, tag, or unrelated-resource change before an authorized sandbox operator applies it and records sanitized read-back evidence.
Neither HUMAN setup action authorizes dispatch. #143 remains the independent Sponsor ownership blocker, and #136 still requires its fresh gates. This review authorizes no environment mutation, AWS mutation, workflow run, deployment, provider call, feature enablement, queue/data action, or private evidence access.
Verification
npm run test:sponsor-gsi-migrator— PASS, 64/64uv run --with pytest python -m pytest sandbox/dataops/tests -q— PASS, 72 tests / 181 subtestsgit diff --checkin both worktrees — PASSVerdict: SECURITY PASS for the two exact frozen source candidates. Advance to Tester and PM; preserve both separate HUMAN gates and every #136/#143 blocker.
alexeygrigorev commentedon Aug 2, 2026
REPLACEMENT SECURITY PASS — README-only activation-order repair
I independently delta-reviewed the replacement candidates against the prior Security PASS and the Architecture activation-order block. I made no source edit, commit, AWS call, GitHub environment/configuration change, workflow dispatch, Support contact, or private-evidence inspection.
Replacement fingerprints
DataOps:
b9470340c2837931a7c1c0cb0cb2148b82216cc738687cbdf297530c5d37fd6509c871dec8a4f7dcf9e7c7df7f416a580c7a6c938dedb27c7e6d222a2980852fdf648afa03aeae2caws-infra:
d370385556344bb6841f88473c12397c326a6b5a081a96837d6d3d998a802e0b4762c629bdd1a73386553f62fa929b4ff222fc51df237802005fe996cb83150adc2f64faddf04d0cBoth worktrees still contain only the three owned paths and pass
git diff --check. Relative to the previously passed trees, the exact delta is one file in each repository:scripts/deploy/README.mdonly;sandbox/dataops/README.mdonly.The migration workflow, Sponsor tests, OIDC trust template, and infrastructure tests are byte-identical to the prior Security-passed candidates. Therefore the prior exact two-subject
StringEqualstrust, exact audience, adversarial denials, unchanged permissions/attachments/role/session/resources, ordinary-deploy digest, and sandbox-only workflow findings remain valid for these replacement trees. Tester must still run the issue's required commands; this delta review does not replace Tester.Security assessment of the partial order
The new durable documentation closes the unsafe interval with one mandatory monotonic order:
dataops-v1-sandbox, proving main-only deployment, an independent required reviewer, self-review prevention, and disabled administrator bypass.This order is security-sound. Before step 2, AWS does not admit the environment subject. Between steps 2 and 3, the admitted subject is dormant because no active workflow names it, while the already-proven environment protection exists. After step 3, credential issuance remains behind the effective protected environment. Missing either proof blocks activation.
The recovery wording also remains fail-closed. If workflow source appears active prematurely, it keeps #145 blocked, forbids dispatch, and requires correction only through the normal reviewed source lifecycle. It explicitly forbids deleting or broadening either protection ad hoc. It does not authorize an agent or operator to mutate GitHub, AWS, trust, workflow state, or source outside the separately approved owner/gate and normal lifecycle.
Evidence and authorization boundary
The README additions contain only public-safe environment/issue names and control results. They add no reviewer identity, private link, screenshot, secret, raw provider/resource identifier, or operational evidence. #145's sanitized evidence contract remains unchanged.
These documents specify ordering; they grant no authority. Security PASS does not authorize environment creation/configuration, trust application, source integration, workflow dispatch, deployment, provider/data action, or private-evidence access. Each HUMAN operation still needs its exact owner and accepted gate. Trust source remains ineffective until separately applied and verified. Environment setup never authorizes dispatch. #143 remains independent and #136 remains blocked.
Verdict: REPLACEMENT SECURITY PASS for the two exact fingerprints above. The prior Security PASS is superseded only as a fingerprint binding; all of its substantive controls carry forward, now with the Architecture-required activation order closed.
alexeygrigorev commentedon Aug 2, 2026
ARCHITECTURE PASS — monotonic activation and partial-state rollback are closed
I independently re-reviewed the replacement uncommitted candidates. I made no source edit, commit, AWS call, workflow dispatch, GitHub-environment change, or private-evidence inspection.
Replacement fingerprint binding
DataOps:
b9470340c2837931a7c1c0cb0cb2148b82216cc738687cbdf297530c5d37fd6509c871dec8a4f7dcf9e7c7df7f416a580c7a6c938dedb27c7e6d222a2980852fdf648afa03aeae2caws-infra:d370385556344bb6841f88473c12397c326a6b5a081a96837d6d3d998a802e0b4762c629bdd1a73386553f62fa929b4ff222fc51df237802005fe996cb83150adc2f64faddf04d0cBoth worktrees contain only their three declared paths and both diffs pass
git diff --check.Original block repair
Both owned READMEs now impose the same exact monotonic activation order:
dataops-v1-sandbox, proving main-only deployment, at least one required reviewer independent from the dispatcher, self-review disabled, and administrator bypass disabled.aws-infrasource be integrated and an authorized sandbox AWS operator apply/read back the exact additive two-subject trust with unchanged permissions.This removes the previously identified interval in which AWS could admit an environment subject before the GitHub protection boundary existed.
Partial-state and rollback review
The documented sequence fails closed in every rollout partial state:
The proof chain must remain valid through activation; invalidation returns the rollout to the blocked/no-dispatch path. Rollback does not delete or broaden either protection ad hoc.
Carried-forward architecture findings
The workflow, trust template, and tests are unchanged from the previously inspected source candidate; the replacement changes only the two owned README contracts. Reinspection of the complete current diffs confirms:
aud=sts.amazonaws.comand exactly the existing main-branch subject plusdataops-v1-sandboxenvironment subject;StringLike, production, alternate environment/branch/tag/PR/repository/owner/audience path;The #136 migration-workflow fingerprint remains invalidated by #145. Historical #136 acceptance cannot authorize dispatch; fresh reviews and effective-boundary evidence are still required after #143.
Verdict: ARCHITECTURE PASS for only the two replacement fingerprints above. The earlier Security verdict is bound to the superseded trees, so the next specialist gate is Security re-review of these exact bytes, followed by Tester and PM. This pass authorizes no environment/AWS mutation, merge, push, deployment, or dispatch.
alexeygrigorev commentedon Aug 2, 2026
TEST PASS — exact replacement two-repository source candidates
I independently tested the two frozen uncommitted replacement candidates supplied by the orchestrator and bound by the replacement Security and Architecture PASS comments. I did not edit source, commit, push, call AWS, configure a GitHub environment, dispatch a workflow, deploy, inspect private evidence, or mutate application/data state.
Frozen fingerprint binding
DataOps worktree
/home/alexey/git/dataops/.tmp/worktrees/issue-145:b9470340c2837931a7c1c0cb0cb2148b82216cc738687cbdf297530c5d37fd6509c871dec8a4f7dcf9e7c7df7f416a580c7a6c938dedb27c7e6d222a2980852fdf648afa03aeae2c.github/workflows/migrate-sponsor-crm-gsis.yml,scripts/deploy/README.md,scripts/deploy/sponsor-crm-gsi-core.test.mjsaws-infraworktree/home/alexey/git/aws-infra-worktrees/issue-145-sandbox-oidc:d370385556344bb6841f88473c12397c326a6b5a081a96837d6d3d998a802e0b4762c629bdd1a73386553f62fa929b4ff222fc51df237802005fe996cb83150adc2f64faddf04d0csandbox/dataops/README.md,sandbox/dataops/template.github-actions.yaml,sandbox/dataops/tests/test_template_github_actions.pyBoth values exactly match the replacement PASS bindings. Final file SHA-256 values were:
aada8e6f...274b3, README42918e43...6c4e, test2848d739...f417;aws-infraREADMEd8c7cb05...862a, templatebabce03f...098, test16285f31...d7a.Required commands and results
DataOps:
npm run test:sponsor-gsi-migrator— exit0; 64 tests passed, 0 failed/skipped/cancelled/todo; duration72034.694494 ms.uv run --with pytest python -m pytest -q tests/infra— exit0; 40 passed in12.23s.git diff --check b9470340c2837931a7c1c0cb0cb2148b82216cc7...HEAD— exit0.git diff --check HEADwas also run against the actual working-tree candidate — exit0.aws-infra:uv run --with pytest python -m pytest sandbox/dataops/tests -q— exit0; 72 tests passed, 181 subtests passed in0.83s.sam validate --lint --template-file sandbox/dataops/template.github-actions.yaml— exit0; valid SAM/CloudFormation template. A telemetry/metadata-disabled invocation also passed independently.git diff --check d370385556344bb6841f88473c12397c326a6b5a...HEAD— exit0.git diff --check HEADagainst the actual uncommitted candidate — exit0.Independent workflow and trust verification
workflow_dispatch, exact environmentdataops-v1-sandbox, exact actor gate, shareddataops-v1-deploynon-cancelling concurrency, exact sandbox region/role shape, and only the migration command.dataops-v1-productionor other parsed production target references.4611d88891fcb3031a94b0140b7238686e6e68feb68824ac7332d1a71180b14c; the accepted SAM command digest test remains5a6f6391...d270and passed.infra/template.full.yaml,samconfig.toml, migrator, guard, application resources, flags, providers, and runtime/export labeling are outside the exact path inventory and remain unchanged.mainref and exactdataops-v1-sandboxenvironment, under exactaud=sts.amazonaws.comandStringEqualsonly.StringLike, missing condition, wildcard/production subject, alternate audience, or widened owner/repo/branch parameters).Policies:is byte-identical to the base (SHA-256016205f2...c1eincluding the marker; independently hashed policy suffix4ebd256b...edf). Full infrastructure tests also preserved permission fingerprints, action/resource decisions, attachment/inventory counts, and policy-size headroom.Worktree and external-state isolation
aws-inframain checkout remained exactly unchanged before and after testing. Its HEAD, porcelain-status SHA-2567b6e3466...e8b00, tracked-diff SHA-2563aa71590...091, cached state, and listed user-owned paths all match the pre-test snapshot.sam validate --lintwas local.Acceptance criteria in issue order
full-sandbox, runtime/resources/names/flags/providers unchanged.aws-infracoverage, exact fingerprints, quota/count, and no-broadening checks passed.Refsforms.dataops-v1-sandboxenvironment has not been configured/read back.The later HUMAN gates and #143 remain blocking exactly as designed. This TEST PASS authorizes no source activation, environment/trust mutation, deployment, or dispatch.
Verdict: TEST PASS for only DataOps tree
38687cbdf297530c5d37fd6509c871dec8a4f7dcand aws-infra tree081a96837d6d3d998a802e0b4762c629bdd1a733.alexeygrigorev commentedon Aug 2, 2026
PM ACCEPT — sandbox-only source and operator handoff accepted
I reviewed the exact replacement candidates, the replacement Architecture and Security decisions, the full Tester evidence, and the bounded current-tracker reconciliation. I made no file edit, commit, push, AWS call, GitHub-environment/configuration change, workflow dispatch, deployment, provider/data action, or private-evidence inspection. The only external writes in this PM gate were the explicitly required public issue-body routing updates and this acceptance comment.
Exact accepted source fingerprints
DataOps:
b9470340c2837931a7c1c0cb0cb2148b82216cc738687cbdf297530c5d37fd6509c871dec8a4f7dcf9e7c7df7f416a580c7a6c938dedb27c7e6d222a2980852fdf648afa03aeae2caws-infra:d370385556344bb6841f88473c12397c326a6b5a081a96837d6d3d998a802e0b4762c629bdd1a73386553f62fa929b4ff222fc51df237802005fe996cb83150adc2f64faddf04d0cI independently reconstructed both trees again, reproduced both diff hashes, and confirmed clean
git diff --checkresults. These are the same bytes covered by the replacement Security PASS, replacement Architecture PASS, and TEST PASS.Product acceptance
dataops-v1-sandbox; active workflow parsing found no production target, and no production environment, stack, deployment, migration, provider smoke, or rollout is created or authorized.aws-infra72 tests plus 181 subtests, local SAM lint, parsed workflow/trust adversarial checks, exact path/fingerprint checks, and both working-tree diff checks. UI/screenshots are correctly N/A.Bounded tracker reconciliation
Current routing and still-unchecked target-specific gates were changed from production to sandbox only where applicable in #30, #41, #71, #113–#115, #120–#122, #124–#127, #129, #131, #134, and #136. #140 now names the separate exact protected sandbox-environment gate while preserving its completed route-A rejection and #143 handoff.
#108, #119, #128, #137, and already-regroomed sandbox-only #143 were inspected and required no bounded edit. Their current routing was already target-neutral or sandbox-correct. #143 remains unchanged and still blocks #136.
No checked criterion, historical comment/evidence/fingerprint, generic deployed-runtime meaning, or issue outside the specified set was rewritten. On #145 I checked only the PM-owned acceptance/reconciliation criterion supported by this review. Source commit, On-Call, protected-environment, and effective-trust HUMAN criteria remain unchecked, and the issue remains open.
Verdict: PM ACCEPT for only the exact two source fingerprints above. Next owner is Software Engineer for the two accepted source commits without activation; subsequent owners must preserve the documented environment → trust → workflow order. This acceptance authorizes no infrastructure or runtime mutation.
alexeygrigorev commentedon Aug 8, 2026
PM AMENDMENT — REGROOMED to the usual existing main-branch OIDC model
The user explicitly selected the simple model used by the other projects. #145 is now DataOps-only and agent-ready again.
Why no extra configuration is needed
The ordinary DataOps workflow already assumes the sandbox deploy role with an OIDC token whose exact subject is the repository
DataTalksClub/dataopsonrefs/heads/main. The current migration job'senvironment: dataops-v1-productionchanges the token subject from that branch subject to an environment subject, which the existing trust correctly does not admit.The simple correction is therefore to remove the migration job's
environmentkey entirely. It is not renamed. With no job environment, the migration uses the same existing exact main-branch OIDC trust/role as ordinary DataOps deployment and the other projects. No GitHub environment, additional OIDC subject,aws-infrasource change, trust apply, or reviewer/bypass HUMAN gate is needed.This deliberately removes independent environment approval. The retained controls are
workflow_dispatchonly, exact actoralexeygrigorev, the exact repository/main-branch OIDC trust, exact repository/ref/SHA/OIDC/account/region/stack/table runtime checks, shared non-cancelling concurrency, and all accepted #136 fail-closed migration/ownership/state logic.Superseded, not passed or deleted
The earlier protected-environment design and its Architecture, Security, Tester, and PM PASS decisions are historical only. They do not pass the replacement.
38687cbdf297530c5d37fd6509c871dec8a4f7dc, difff9e7c7df7f416a580c7a6c938dedb27c7e6d222a2980852fdf648afa03aeae2c, and local unpushed commit672c205eb58c36c3dbf8c6fe1787ec1d2b0cbc86are superseded.aws-infratree081a96837d6d3d998a802e0b4762c629bdd1a733, diff86553f62fa929b4ff222fc51df237802005fe996cb83150adc2f64faddf04d0c, and local unpushed commit8cd8b37ea77c7ad47bd2fb0d10b4c53e17fb94d0are superseded.Both local commits remain outside all remote refs. Their branches, worktrees, commits, and historical comments remain preserved. They must not be merged, pushed, cherry-picked, amended, reset, deleted, reused, or applied. In particular, the
aws-infratrust commit must never be applied.Replacement scope and gates
The replacement changes only:
.github/workflows/migrate-sponsor-crm-gsis.yml;scripts/deploy/README.md; andscripts/deploy/sponsor-crm-gsi-core.test.mjs.It removes the job
environment, updates focused documentation/tests, and preserves ordinary deploy/OIDC/SAM bytes plus every #136 runtime safeguard. A fresh clean DataOps worktree from currentmainmust produce a new base/path/tree/diff/file fingerprint. All replacement criteria are unchecked and require fresh Architecture, Security, Tester, and PM decisions before commit.There is no
aws-infracandidate, cross-repository test/commit, environment→trust activation sequence, or environment HUMAN gate in the amended workflow. #143 still independently blocks #136, and #136 still requires fresh pre-dispatch reviews after #145 and #143. No dispatch or deployment is part of #145.I also made only the bounded current-routing corrections needed for consistency:
Labels remain
bug,infra,testing,migration,P0; the block graph remains correct. The issue stays open.Exact next role: Software Engineer. Create a fresh clean DataOps worktree/branch from current
main, implement only the three owned paths without commit, preserve both superseded local branches/worktrees, and return the newly frozen DataOps-only fingerprint for Architecture and Security review.This amendment made no file edit, commit, push, AWS call, GitHub environment/configuration change, workflow dispatch, deployment, or runtime/data mutation. Only the authorized public issue-body routing updates and this comment were written.
alexeygrigorev commentedon Aug 8, 2026
ARCHITECTURE PASS — DataOps-only usual main-branch OIDC candidate
I independently reviewed only the final frozen uncommitted replacement candidate. I made no source edit, commit, push, AWS call, GitHub environment/configuration change, workflow dispatch, deployment, or private-evidence inspection.
Exact fingerprint binding
/home/alexey/git/dataops/.tmp/worktrees/issue-145-usual-oidcb9470340c2837931a7c1c0cb0cb2148b82216cc795c7004538aa64d0e50035c228baf7a47d426a6ec73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7.github/workflows/migrate-sponsor-crm-gsis.yml,scripts/deploy/README.md,scripts/deploy/sponsor-crm-gsi-core.test.mjsThe worktree has exactly those three unstaged modifications, no staged/untracked candidate path, and clean
git diff --check.OIDC and workflow architecture
PASS — removal, not rename. The migration job has no
environmentproperty. It has no environment URL, environment secret/variable reference, environment approval path, or custom OIDC audience. The candidate does not create or namedataops-v1-sandbox; it removes the misleadingdataops-v1-productionbinding.PASS — usual existing trust path. With no job environment, GitHub emits the normal branch-form subject. The unchanged current
aws-infratrust source uses exactStringEqualsforaud=sts.amazonaws.comandsub=repo:${GitHubOwner}/${GitHubRepo}:ref:refs/heads/${GitHubBranch}; the current DataOps values areDataTalksClub,dataops, andmain. The workflow assumes the unchanged exact role ARNarn:aws:iam::817685572750:role/dataops-github-actions-deploy, regioneu-west-1, and fixed migration session name. Noaws-infrapath, trust condition, alternate subject, role permission, or application resource is part of this candidate.PASS — coherent credential boundary.
workflow_dispatchremains the only trigger and the job-level gate remains exactgithub.actor == 'alexeygrigorev'. A dispatch on another ref cannot satisfy the exact main-branch AWS trust, so credential acquisition fails. Before the migrator makes its first AWS request, unchanged runtime validation checks exact event, actor, repository, owner,refs/heads/main, SHA shape, run identity, and region. The first bounded AWS read validates exact account/partition/principal; subsequent unchanged pre-mutation checks bind exact stack name/StackId, logical resource, physical table, ARN, TableId, CloudFormation ownership tags, template/schema, and healthy GSI prefix. Every stage revalidates identity and state before execution.This is architecturally coherent without a GitHub Actions environment. The deliberate tradeoff is that exact actor
alexeygrigorevis the sole manual authorization and there is no independent environment reviewer. That is the explicit user-selected model; it introduces no new credential subject or permission surface relative to ordinary deployment.Migration and deployment isolation
PASS — #136 fail-closed logic unchanged. The core, migrator, and guard runtime files are byte-identical to base. Shared concurrency remains
dataops-v1-deploywithcancel-in-progress: false; the final job step remains only the exact staged migration command. There is no SAM build/package/deploy, ordinary app deployment, guard bypass, or workflow chaining in the migration job.PASS — production excluded. Parsed-focused coverage requires every active workflow to contain no production target and requires the migration job to have no environment key. The candidate contains no
dataops-v1-productionworkflow target; documentation says #145 authorizes no dispatch and preserves sandbox operational-data handling.PASS — ordinary deployment and identities unchanged.
.github/workflows/deploy-dataops-v1.ymlis byte-identical to base with SHA-2564611d88891fcb3031a94b0140b7238686e6e68feb68824ac7332d1a71180b14c.infra/template.full.yamlremainsfb272bbd...ee5,samconfig.tomlremainsbd49bdb2...73e, and package files, runtime resources, flags, provider configuration, stack/resource identities, migrator, and guard are unchanged.Supersession and downstream gates
The replacement branch is rooted directly at
b947034; superseded DataOps commit672c205eb58c36c3dbf8c6fe1787ec1d2b0cbc86is not an ancestor. That commit and supersededaws-infracommit8cd8b37ea77c7ad47bd2fb0d10b4c53e17fb94d0remain present in their local worktrees and are contained by zero remote refs. This candidate reuses neither commit and contains noaws-infrachange. Earlier #145 PASS comments remain historical only.#143 remains the independent Sponsor ownership blocker. The README explicitly prohibits dispatch under #145 and routes any later migration through fresh #136 Architecture, Security, and HUMAN gates after #143. Simple OIDC does not establish ownership, authorize data loss, or authorize migration/application deployment.
Architecture static review does not replace the required Tester commands. The focused test additions are structurally appropriate: they assert no parsed/source environment key, exact role/session/region shape, no custom audience, ordinary-deploy digest stability, exact runtime repo/ref contract, and alternate repository/ref/SHA failure before AWS calls.
Verdict: ARCHITECTURE PASS for only tree
95c7004538aa64d0e50035c228baf7a47d426a6eand diffc73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7. Advance this exact fingerprint to Security review, then Tester and PM. This PASS authorizes no commit, push, dispatch, deployment, GitHub environment action, AWS mutation, or use of either superseded commit.alexeygrigorev commentedon Aug 8, 2026
SECURITY PASS — final frozen DataOps-only usual-OIDC candidate
I independently reviewed only the final frozen uncommitted candidate in
/home/alexey/git/dataops/.tmp/worktrees/issue-145-usual-oidc. I made no source edit, commit, push, AWS call, GitHub environment/configuration change, workflow dispatch, deployment, or private-evidence inspection. Earlier candidate hashes and their historical decisions were not reused.Exact fingerprint binding
b9470340c2837931a7c1c0cb0cb2148b82216cc795c7004538aa64d0e50035c228baf7a47d426a6ec73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7.github/workflows/migrate-sponsor-crm-gsis.yml,scripts/deploy/README.md,scripts/deploy/sponsor-crm-gsi-core.test.mjse5e64ced853b5ca7a391a9f979c4fd6e50811d5daec5775bd605f8c184384c1f; README0a82e1e95d1eac7982834501a578fc32fe1dfa1d92441bbc519796a5357e408a; test94b92919aad80bf85294393894187b1d6f961553e9848dadf27a2ea8f6de3e9cgit diff --check b9470340c2837931a7c1c0cb0cb2148b82216cc7passed.Security findings
environment: dataops-v1-productionline. It adds no trigger, principal, trust subject, permission, secret, variable, input, audience override, target selector, or production reference.workflow_dispatch, exact job actoralexeygrigorev,contents: readplus job-localid-token: write, shareddataops-v1-deployconcurrency withcancel-in-progress: false, fixed regioneu-west-1, fixed rolearn:aws:iam::817685572750:role/dataops-github-actions-deploy, fixed session namedataops-v1-sponsor-gsi-migration, and the single exact migration command. The ordinary deploy workflow is byte-identical to base (4611d888...b14c). All active workflow source is free of a production target.aws-infraat accepted based370385556344bb6841f88473c12397c326a6b5aadmits only exactaud=sts.amazonaws.comand exactsub=repo:DataTalksClub/dataops:ref:refs/heads/mainunderStringEquals. This candidate contains noaws-infrapath and changes neither trust nor deploy-role policy. Removing the job environment therefore makes this workflow use an already-admitted principal; it does not add a principal class or broaden IAM permissions.GITHUB_SHA, dispatch event, actor, workspace, and both AWS region variables before its first AWS CLI call. The existing OIDC trust independently rejects alternate repository/ref subjects before role assumption. Runtime caller validation pins account817685572750and the exact deploy role before stack/table reads.dataops-v1, logical resourceDataOpsSponsorCrmTable, physical tabledataops-v1-sponsor-crm, stack ARN, table ARN/TableId and ownership-tag checks, exact checked-in template arguments, migration-only command, and the full Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 fail-closed state machine.infra/template.full.yaml,samconfig.toml, migrator/core/guard runtime, and the ordinary deploy workflow are byte-identical to base.672c205eb58c36c3dbf8c6fe1787ec1d2b0cbc86and aws-infra commit8cd8b37ea77c7ad47bd2fb0d10b4c53e17fb94d0still exist in their preserved local worktrees/branches, occur in no remote-tracking ref, and are not ancestors of either accepted base. The final candidate neither layers on nor uses them.Residual-risk disposition
Accepted for this user-selected simple model: there is no independent GitHub-environment reviewer or second-person approval, and the issue dependency/HUMAN dispatch gates are process controls rather than a technical GitHub dependency lock. A compromise of the approved actor/repository main-branch authority, or an unauthorized manual dispatch that satisfies those identities, therefore has no environment-review backstop. Also, SHA is validated and bound as the actual workflow commit provenance rather than compared with a source-hardcoded allowlist; the HUMAN #136 gate must approve the eventual integrated SHA. These are the explicit simplicity tradeoffs recorded by the user, not new trust or permission expansion in this diff.
No source change here authorizes a dispatch or AWS action. It only repairs the source identity mismatch so that a later separately authorized #136 dispatch can use the unchanged usual main-branch OIDC path.
Verdict: SECURITY PASS for exactly tree
95c7004538aa64d0e50035c228baf7a47d426a6e/ diffc73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7. Any byte, trust/policy, dependency, or dispatch-plan change requires fresh Security review.alexeygrigorev commentedon Aug 8, 2026
TEST PASS — final frozen DataOps-only usual main-branch OIDC candidate
I independently tested only the frozen uncommitted candidate in
/home/alexey/git/dataops/.tmp/worktrees/issue-145-usual-oidc. I made no file edit, commit, push, AWS call, workflow dispatch, deployment, GitHub environment/configuration change, private-evidence inspection, or data/provider action. UI/screenshots are N/A because the exact diff contains only workflow, public deployment README, and focused test source.Exact candidate binding
b9470340c2837931a7c1c0cb0cb2148b82216cc795c7004538aa64d0e50035c228baf7a47d426a6ec73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7.github/workflows/migrate-sponsor-crm-gsis.ymlscripts/deploy/README.mdscripts/deploy/sponsor-crm-gsi-core.test.mjse5e64ced853b5ca7a391a9f979c4fd6e50811d5daec5775bd605f8c184384c1f,0a82e1e95d1eac7982834501a578fc32fe1dfa1d92441bbc519796a5357e408a,94b92919aad80bf85294393894187b1d6f961553e9848dadf27a2ea8f6de3e9c/home/alexey/git/dataops/.git/worktrees/issue-145-usual-oidc; main checkout remained clean.Commands and results
npm run test:sponsor-gsi-migrator— exit0; 65 tests, 65 pass, 0 fail/skipped/cancelled/todo.uv run --with pytest python -m pytest -q tests/infra— exit0; 40 passed.git diff --check b9470340c2837931a7c1c0cb0cb2148b82216cc7— exit0; no output.git diff --full-index --binary b9470340c2837931a7c1c0cb0cb2148b82216cc7 | sha256sum— exit0; reproducedc734847...71a7.git diff --name-only -z b9470340c2837931a7c1c0cb0cb2148b82216cc7plus a read-onlypython - <<'PY'Git-tree reconstruction — exit0; exact 3-path inventory and tree95c700...a6e.node --input-type=module - <<'NODE'with independentjs-yamlJSON-schema assertions — exit0; parsed all 6 active workflows:assistant-ci.yml,deploy-dataops-v1.yml,migrate-sponsor-crm-gsis.yml,typefully-analyzer.yml,validate-dataops-content.yml,validate-planning-docs.yml./home/alexey/.nvm/versions/node/v24.13.1/bin/node scripts/deploy/sponsor-crm-gsi-migrator.mjs migrate infra/template.full.yaml infra/template.full.yaml, usingenv -i PATH=/nonexistentand overriding actor, repository, owner, dev ref, tag ref, PR ref, or SHA — each exit1with the expected pre-AWS fail-closed category; the aggregate assertion command exited0.PATH=/nonexistentmade an AWS call impossible even if a check regressed.sha256sumplus byte comparison togit show b947034...:<path>— exit0; protected-file results below.git for-each-ref --contains=<superseded> refs/remotesin each repo andgit merge-base --is-ancestoragainst each accepted base — exit0for the aggregate assertions; zero remote refs contain either superseded commit and neither is an ancestor of the accepted base.gh api repos/DataTalksClub/dataops/environmentsandgh run list --workflow migrate-sponsor-crm-gsis.yml --event workflow_dispatch— exit0; 0 environments, 0 migration dispatch runs.Independent workflow and protected-byte evidence
Parsed migration shape is exact:
workflow_dispatch, with no caller input/target selector;github.actor == 'alexeygrigorev';environment, environment URL,secrets.*,vars.*, or credentialaudienceoverride;contents: readand job-localid-token: write;dataops-v1-deploy,cancel-in-progress: false;eu-west-1, rolearn:aws:iam::817685572750:role/dataops-github-actions-deploy, sessiondataops-v1-sponsor-gsi-migration;set -euo pipefailplusnode scripts/deploy/sponsor-crm-gsi-migrator.mjs migrate infra/template.full.yaml infra/template.full.yaml;dataops-v1-production.The unchanged runtime validates exact repository
DataTalksClub/dataops, owner,refs/heads/main, lower-case 40-hexGITHUB_SHA, dispatch event, actor, run identity, and both region variables before its first AWS request.CONTRACTremains exact account817685572750, region, stackdataops-v1, logical IDDataOpsSponsorCrmTable, and physical tabledataops-v1-sponsor-crm. The seven adversarial cases all stopped before AWS.At accepted
aws-infrabased370385556344bb6841f88473c12397c326a6b5a, the unchanged trust is exactStringEqualsforaud=sts.amazonaws.comandsub=repo:DataTalksClub/dataops:ref:refs/heads/main; defaults remain the exact role/stack/region above. There is noaws-infracandidate or trust/policy change.Protected working bytes equal base:
4611d88891fcb3031a94b0140b7238686e6e68feb68824ac7332d1a71180b14csam deploycommand:5a6f6391d8be4c5b6219e5e9c94d7249d312ccab1d743b4d7bf20cb6d082d270infra/template.full.yaml:fb272bbddbde1a41cb2b5ae92cf0923baa03815a517df143119731fee2ef8ee5samconfig.toml:bd49bdb2eefeb1342b393531a90dcbb4ebf4a368f427d63de3bde776dfea473e(full-sandboxremains present)fe5a2944b8da2721e8a1df061b1ac283ccea2e6ce35df20920229e5c4fc94b10e5b076b75ee03fa47aa263bba6cf766b847045805dab35f7a13c36c6a049bd35ca2ccdfec35fdfeb114800b5146d2e9c057b16132ab861cb6ea2ce6195923aaapackage.json:4102f3e021b64d687418783d981dd6a7fd3eeadd326070e56ddfa5e19cfc3df8package-lock.json:47f803105ef2e5148e082a295a342b66b97e8386dcbbc736c2384f182d5e5e12The exact three-path inventory proves every other non-owned path, including runtime resources, flags, provider configuration, identities, SAM/template/config, and ordinary deployment, is unchanged.
Acceptance criteria in issue order
aws-infra, or apply change.full-sandbox, runtime/resources/names/flags/providers are byte-identical.672c205...remains on local branch/worktreeissue-145-sandbox-boundary/.tmp/worktrees/issue-145; supersededaws-infra8cd8b37...remains onissue-145-sandbox-oidc/aws-infra-worktrees/issue-145-sandbox-oidc. Both have zero containing remote refs, neither is an accepted-base ancestor, and neither is reused.aws-infracommit.Routing also remains fail-closed: #136 is OPEN/blocked on accepted #145 integration/source CI with no dispatch and independently on #143, then requires fresh Architecture/Security before HUMAN dispatch. #143 is OPEN/blocked on HUMAN ownership/loss classification and authorizes no AWS call, dispatch, deployment, or mutation. Simple OIDC and sandbox naming establish neither Sponsor ownership nor dispatch authority.
Verdict: TEST PASS for only tree
95c7004538aa64d0e50035c228baf7a47d426a6e/ diffc73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7. Any byte, trust/policy, dependency, or dispatch-plan change requires fresh Tester review.alexeygrigorev commentedon Aug 8, 2026
PM ACCEPT — final DataOps-only usual-OIDC source candidate
I reviewed the user-selected simplified operator outcome, the exact frozen source, the Architecture PASS, Security PASS, and TEST PASS.
Exact accepted fingerprint
b9470340c2837931a7c1c0cb0cb2148b82216cc795c7004538aa64d0e50035c228baf7a47d426a6ec73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7.github/workflows/migrate-sponsor-crm-gsis.yml,scripts/deploy/README.md,scripts/deploy/sponsor-crm-gsi-core.test.mjsI independently reconstructed the same tree and diff again immediately before acceptance. The worktree still contains exactly those three unstaged paths and passes
git diff --check.Product acceptance
environmentbinding rather than renaming it, so the job uses the usual existing exactDataTalksClub/dataopsmain-branch OIDC role/trust path.aws-infrasource/apply, trust/permission change, production target, or alternate deployment path.workflow_dispatch, exact actoralexeygrigorev, exact repository/main OIDC trust, unchanged repository/ref/SHA/account/region/stack/table runtime validation, shared non-cancelling concurrency, and the complete unchanged Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 fail-closed migration state machine.infra/template.full.yaml,samconfig.toml/full-sandbox, runtime resources, identities, flags, provider configuration, migrator, guard, and every non-owned path remain unchanged.Verification and preservation
Tester passed the full required source gate: Sponsor migration suite 65/65, infra suite 40/40, all six active workflow parses, seven isolated invalid-identity/ref/SHA fail-closed cases, exact protected-byte comparisons, fingerprint reconstruction, and clean diff checks. UI/screenshots are correctly N/A.
Read-only evidence records zero configured GitHub environments and zero Sponsor migration dispatch runs. No AWS call, trust/permission mutation, workflow dispatch, application deploy, provider/data action, private-evidence inspection, or runtime mutation occurred.
Superseded DataOps commit
672c205eb58c36c3dbf8c6fe1787ec1d2b0cbc86and supersededaws-infracommit8cd8b37ea77c7ad47bd2fb0d10b4c53e17fb94d0remain preserved in their local branches/worktrees, occur in zero remote refs, are not ancestors of the accepted base, and were not reused. Their earlier PASS comments remain historical only.Tracker and release handoff
Sandbox routing was already reconciled and remains correct:
I checked only the source, role-review, Tester, PM, preservation, and no-external-action criteria supported by the evidence. The Software Engineer commit and orchestrator merge/push plus On-Call source-CI/no-dispatch criteria remain unchecked. Issue #145 remains open.
Verdict: PM ACCEPT for only tree
95c7004538aa64d0e50035c228baf7a47d426a6e/ diffc73484788d04aee7fc17928aeeef83b1582ccc5259936233e1ec9643697c71a7. Exact next role: Software Engineer commits only this accepted DataOps candidate withCloses #145; noaws-infracommit or external action. Orchestrator and On-Call follow afterward, still with no dispatch under #145.Merge issue-145-usual-oidc: Use usual OIDC for sandbox migration (#145)
alexeygrigorev commentedon Aug 8, 2026
ON-CALL BLOCK — #145 source checks pass; normal deployment fails closed at the independent Sponsor ownership guard
I monitored every GitHub Actions run automatically associated with pushed merge SHA
d0c2b5033d3272c7eda9db61868cd106742e2bb0to terminal state. I did not dispatch or rerun any workflow, call AWS, change a GitHub environment or IAM, edit source, or bypass a guard.Exact integration binding
d0c2b5033d3272c7eda9db61868cd106742e2bb070caa018620c0e603641d8559270e704950eb66595c7004538aa64d0e50035c228baf7a47d426a6e(the exact Architecture/Security/Tester/PM-accepted tree).github/workflows/migrate-sponsor-crm-gsis.yml,scripts/deploy/README.md, andscripts/deploy/sponsor-crm-gsi-core.test.mjsHEAD,origin/main, and the Actions run head all resolve to the exact merge SHA.Automatically triggered run
The Actions API reports exactly one run for this SHA:
push, terminal conclusion failure.Guard Sponsor CRM indexes before any deployment buildwithSponsor CRM deployment guard failed closed: guard-cloudformation-table-stack-id-absentand exit 1.The planning-doc and content-validation workflows did not trigger, as expected: none of the exact three integrated paths matches their push path filters. Their absence is not a missing run; the SHA-wide Actions query shows exactly the single normal deploy workflow above. The deploy workflow supplied the applicable source/test/SAM checks, and its entire checks job passed.
No-dispatch evidence
Migrate Sponsor CRM GSIsActions API readback:total_count: 0— zero migration runs of any event type and therefore zero migration dispatches.push; there was no manual application workflow dispatch or rerun.Classification and routing
This is not a #145 source/CI regression: the exact accepted tree is integrated and every source/test/build check passed. It is also not deployment success. The automatic normal deploy correctly reached and honored the pre-existing fail-closed Sponsor ownership boundary.
Issue #145 is currently CLOSED (completed) via
Closes #145. Keep it closed for the accepted usual-OIDC source correction; do not repair or bypass this failure under #145 and do not rerun/deploy manually.Next routing remains:
Verdict: ON-CALL BLOCK — #145 source CI passed and no migration was dispatched, but the automatic application deployment did not occur because the independent #143/#136 Sponsor ownership guard failed closed as designed.
alexeygrigorev commentedon Aug 8, 2026
PM POST-ON-CALL RECONCILIATION — source shipped; deployment correctly blocked
#145 is complete for its accepted source correction at merge SHA
d0c2b5033d3272c7eda9db61868cd106742e2bb0(tree95c7004538aa64d0e50035c228baf7a47d426a6e). The applicable source/test/build checks passed and zero migration runs occurred.The automatic normal deployment is not accepted as deployment success. It failed closed at the pre-existing
guard-cloudformation-table-stack-id-absentownership guard; SAM deploy, seed, and deployed smoke were skipped. Do not rerun, bypass, or repair that boundary under closed #145.#145 remains CLOSED/COMPLETED. All previously unchecked release/On-Call criteria remain unchanged as historical checklist state. Current ownership routing continues in #143 and #136.
Use usual OIDC for sandbox migration
Merge issue-145-usual-oidc: Use usual OIDC for sandbox migration (#145)