Skip to content

Make sandbox the only active DataOps deployment and rollout target #145

Description

@alexeygrigorev

Make sandbox the only active DataOps deployment and rollout target

Status: source accepted by Architecture, Security, Tester, and PM; source commits and protected-boundary activation remain incomplete
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: #136 directly; #30, #41, #71, #108, #113#115, #120#129, #131, #134, and #137 at their current deployment, migration, provider-smoke, or rollout gates
Next owner: Software Engineer to commit both accepted source candidates on their review branches without activation; then the authorized GitHub environment administrator, sandbox AWS operator, and orchestrator follow the documented environment → trust → workflow order
Resume condition: commit accepted source without activation; configure/read back exact dataops-v1-sandbox; then integrate/apply/read back exact trust; only then activate the accepted DataOps workflow and verify source CI. #136 still resumes only after its independent #143 ownership prerequisite and fresh gates also pass

Authoritative product decision

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.

The current stack, role, table, bucket, and domain names are legacy neutral identities. Do not rename or replace them under this correction. Sandbox also does not declassify Sponsor, finance, contact, Telegram, Mailchimp, Trello, or other operational data; existing privacy, integrity, backup, retention, rollback, and explicit HUMAN controls remain.

Current state and issue graph

Scope A — exact DataOps workflow correction

Change only the protected migration boundary and its direct public-safe documentation/tests:

  • .github/workflows/migrate-sponsor-crm-gsis.yml
  • scripts/deploy/README.md
  • scripts/deploy/sponsor-crm-gsi-core.test.mjs

Required behavior:

  1. Replace the migration job environment with exact dataops-v1-sandbox.
  2. Preserve workflow_dispatch as the only trigger, actor/repository/main-ref validation, shared non-cancelling deployment concurrency, existing OIDC role, migration command, and every Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 fail-closed ownership/state check.
  3. Preserve the ordinary deploy workflow and its exact accepted SAM command byte-for-byte. Do not add migration behavior to it or application deployment to the migration workflow.
  4. Prove no active workflow in this repository names or selects a production environment/target.
  5. Do not change infra/template.full.yaml, samconfig.toml, application resources, migrator/guard runtime logic, stack/resource names, flags, or provider configuration in this issue.

Because this changes one path in #136's accepted workflow fingerprint, freeze a new exact base/path/tree/diff fingerprint and require fresh Architecture/Security consideration before any later #136 dispatch. Preserve the accepted #136 implementation and test evidence; do not represent the old fingerprint as the new candidate.

Scope B — exact additive sandbox OIDC trust

Use a clean isolated ../aws-infra worktree created from current origin/main. The existing ../aws-infra checkout is dirty and contains user-owned changes and missing worktree files; do not modify, restore, stage, stash, reset, or commit anything in that checkout.

Change only:

  • ../aws-infra/sandbox/dataops/template.github-actions.yaml
  • ../aws-infra/sandbox/dataops/tests/test_template_github_actions.py
  • ../aws-infra/sandbox/dataops/README.md only for the exact public-safe trust explanation

The deploy-role trust must accept exactly two sub values for DataTalksClub/dataops:

  1. the existing exact main branch subject used by ordinary sandbox deployment; and
  2. the exact dataops-v1-sandbox environment subject used by the protected migration.

Keep exact aud=sts.amazonaws.com. The environment name may be a CloudFormation parameter only if its allowed values are restricted to exactly dataops-v1-sandbox; no caller-selected alternate environment is allowed.

Reject every wildcard, pull-request, tag, other branch, other environment including dataops-v1-production, other repository/owner, alternate audience, StringLike, or missing condition. Do not alter any permission-policy action/resource, managed-policy attachment, session duration, role name, stack name, account/region boundary, retention policy, or unrelated resource. Tests must recompute the expected trust/source fingerprints and prove all prior #129/#130/#131/#135/#138/#139 permission and negative cases remain exact.

A source commit or push does not make this trust effective. aws-infra has no self-deploying CI/CD path for this stack.

Scope C — protected sandbox environment HUMAN gate

After accepted source is integrated, an authorized GitHub environment administrator must configure exact dataops-v1-sandbox with:

  • deployment branch policy permitting only main;
  • at least one required reviewer independent from the dispatching actor;
  • self-review prevented;
  • administrator bypass disabled; and
  • no production environment, secret, variable, or deployment target created by this issue.

Public evidence contains only environment name, sanitized rule counts/results, UTC verification time, verifier role, and PASS/FAIL. Do not publish reviewer identity/contact details, screenshots, private links, secrets, or provider/resource identifiers. Environment configuration does not authorize workflow dispatch.

Scope D — effective trust HUMAN gate

After the reviewed aws-infra source is integrated, an authorized sandbox AWS operator must:

  1. create and review a change set for the existing deploy-role stack;
  2. require exactly one non-replacing deploy-role trust-policy modification and no permission, attachment, role-name, session, tag, or unrelated-resource change;
  3. apply only that accepted change set;
  4. wait for a terminal successful stack state; and
  5. record a sanitized read-only comparison proving the two exact allowed subject classes and all permission policies unchanged.

No agent or grooming action authorizes this AWS mutation. Do not dispatch the Sponsor migration to test the trust. The first migration dispatch remains owned by #136 after #143 and every #136 gate pass.

Bounded tracker reconciliation

After the source target and protected-boundary design are accepted, Product Manager updates only current status/dependency/resume text and unchecked environment-specific HUMAN criteria that incorrectly require production in:

Use sandbox deployment, sandbox migration, sandbox provider smoke, or sandbox operational-data wording as applicable. Do not mechanically rewrite generic deployed-code terms such as production transaction/client/runtime paths, checked implementation criteria, historical comments, review verdicts, workflow runs, fingerprints, or evidence links. #140's route-A rejection and #141's evidence boundary remain unchanged. #143 still requires an independently accepted ownership path unless fresh Architecture/Security review explicitly changes it.

Acceptance criteria

  • The migration workflow uses exact protected environment dataops-v1-sandbox; no active workflow names or selects a production target.
  • Migration remains manual-only, main-only, actor/repository-bound, non-cancelling, migration-only, and fail-closed under the complete accepted Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 contract.
  • The ordinary deploy workflow, exact SAM command, application template, full-sandbox config, runtime resources, stack/resource names, flags, and provider configuration are unchanged.
  • The sandbox deploy-role trust accepts exactly the existing main-branch subject and the new dataops-v1-sandbox environment subject with exact audience; every broader or alternate subject/audience is rejected.
  • No deploy-role permission, resource scope, attachment, role/session property, retention control, or unrelated aws-infra resource changes.
  • Work occurs in clean isolated worktrees; both dirty main checkouts and all unrelated user-owned changes remain untouched.
  • DataOps and aws-infra candidates record exact bases, NUL-safe path inventories, tree/diff/file hashes, and clean focused diffs for independent review.
  • DataOps Sponsor migration tests and infrastructure tests cover the sandbox environment, workflow split, unchanged application deploy command, and rejection of production/alternate targets.
  • aws-infra parsed and adversarial tests cover exact two-subject trust, exact audience, production/other subject rejection, unchanged permission-policy fingerprints, quotas/counts, and no replacement/broadening.
  • Architecture accepts the workflow/trust shape and confirms Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 assumptions requiring fresh review are explicitly carried forward.
  • Security accepts exact OIDC subjects, independent-review protection, no bypass/wildcard, unchanged least privilege, and sanitized evidence boundaries.
  • Tester runs the full commands below, verifies every criterion, and records exact exit codes/test counts; no UI changed, so browser screenshots are not required.
  • PM accepts the sandbox-only operator flow and performs the bounded current-tracker reconciliation without rewriting historical evidence.
  • Software Engineer commits accepted DataOps changes with Refs #145; accepted aws-infra changes use Refs DataTalksClub/dataops#145 through that repository's approved integration path. Neither commit closes Make sandbox the only active DataOps deployment and rollout target #145 before HUMAN gates.
  • On-Call verifies post-push source CI. A known Migrate Sponsor CRM GSIs in a protected stage-only workflow #136/Reconcile Sponsor CRM table ownership with CloudFormation #143 guard failure is recorded as fail-closed and never bypassed or reclassified as deployment success.
  • [HUMAN] An authorized operator applies and verifies the exact sandbox OIDC trust change from the accepted source revision.
  • [HUMAN] An authorized administrator configures and verifies dataops-v1-sandbox with main-only deployment, an independent required reviewer, no self-review, and no administrator bypass.
  • No 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 DataOps repository:

npm run test:sponsor-gsi-migrator
uv run --with pytest python -m pytest -q tests/infra
git diff --check <accepted-dataops-base>...HEAD

Also parse all active .github/workflows/*.yml and assert that the migration uses only dataops-v1-sandbox, no active workflow contains dataops-v1-production, and the ordinary deploy workflow/SAM command digest equals the accepted pre-#145 value.

From the clean isolated aws-infra worktree:

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 <accepted-aws-infra-base>...HEAD

Tester must inspect the parsed CloudFormation trust object and mutation cases, not rely only on substring checks. No AWS-backed validation, workflow dispatch, browser test, or screenshot is required for the agent-verifiable stage.

Test scenarios

Ordinary sandbox deployment retains its identity

Given the exact existing main branch OIDC subject
When the trust policy is rendered and parsed
Then it remains accepted with exact audience and every permission policy remains byte-equivalent.

Protected sandbox migration receives an environment subject

Given a manually dispatched migration from main after environment approval
When GitHub issues the dataops-v1-sandbox environment subject
Then the exact subject is admitted and no other environment subject is admitted.

Production or alternate target is attempted

Given a production, pull-request, tag, other-branch, other-environment, other-owner/repository, wildcard, or alternate-audience subject
When trust and workflow tests evaluate it
Then it fails closed before credentials or migration work.

Environment is absent or under-protected

Given dataops-v1-sandbox is missing, permits a non-main branch, lacks an independent reviewer, permits self-review, or permits administrator bypass
When the HUMAN gate is reviewed
Then #145 and #136 remain blocked and no dispatch occurs.

Existing ownership blocker remains

Given #145 source and HUMAN boundary gates pass while #143 remains incomplete
When #136 readiness is assessed
Then migration/deployment remain blocked; sandbox naming does not establish Sponsor table ownership.

Tracker text is reconciled

Given current issue bodies still describe active production gates
When PM performs bounded reconciliation
Then current routing says sandbox-only, future production requires new authority, and historical evidence remains unchanged.

Deferred child boundary

Runtime/export labeling is deliberately excluded before #136. Do not change DataOpsEnvironment, DATAOPS_ENV, the application template, or the ordinary deploy parameter list under #145: those bytes participate in #136's accepted template/deploy contract.

After #136 reaches accepted sandbox migration completion and the ordinary sandbox deploy succeeds, a separate child may change runtime/export labeling from prod to sandbox with a no-replacement change-set proof. #145 must not create or implement that child.

Out of scope

  • 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, or DATAOPS_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 source repositories other than the exact ../aws-infra paths explicitly authorized above.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Must havebugSomething is brokeninfraDeployment and infrastructuremigrationImport or migration worktestingTests and QA

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions