Skip to content

IAM/Profile Backfill Populated Smoke

Scope

This smoke proves the IAM/Profile backfill loader against an isolated Postgres fixture. It applies IAM/Profile target migrations, seeds representative legacy auth/profile rows, runs the confirmed migrator run --service iam-profile-backfill --confirm, checks postload reconciliation, and validates UUID shadow views.

The organization reconciliation is limited to records mapped by this backfill in migration_id_map. IAM bootstrap organizations created by target schema migrations are intentionally not treated as missing legacy records.

This is fixture evidence only. It does not approve default /api/auth*, profile, or KYC route promotion.

Run

Parser/self-test:

bash
cd go-platform
IAM_PROFILE_BACKFILL_POPULATED_SELF_TEST=1 make test-iam-profile-backfill-populated

Hermetic populated fixture smoke with artifacts:

bash
cd go-platform
IAM_PROFILE_BACKFILL_POPULATED_CONFIRM=populated-fixture \
IAM_PROFILE_BACKFILL_POPULATED_ARTIFACT_DIR=output/qa/iam-profile-backfill-populated-$(date +%Y%m%d-%H%M%S) \
make test-iam-profile-backfill-populated

The script removes its isolated Postgres container by default. Set IAM_PROFILE_BACKFILL_POPULATED_KEEP=1 only when debugging a failed run.

Latest Local Proof

On 2026-07-13, the populated fixture smoke passed with artifacts under:

txt
output/qa/iam-profile-backfill-populated-20260713-1038/

Artifact files:

  • backfill-run.json
  • iam-schema-up.json
  • profile-schema-up.json

The run report recorded:

  • command=run, service=iam-profile-backfill, status=partial.
  • 4 legacy User source rows.
  • IAM owner run rowsWritten=63 into hoctapaz_iam_db, including one legacy organization while ignoring the target-only bootstrap organization.
  • Profile owner run rowsWritten=17 into hoctapaz_profile_db.
  • iam_reconcile_identities: sourceRows=4, targetRows=4, matched=true, issueCount=0, rejectedRows=0.
  • profile_reconcile_users: sourceRows=4, targetRows=4, matched=true, issueCount=0, rejectedRows=0.
  • iam_reconcile_staff_permission_scopes: sourceRows=0, targetRows=0, matched=true, proving the legacy fixture has no explicit staff per-account permission-scope rows to infer.
  • profile_reconcile_teacher_profiles and profile_reconcile_parent_students both matched with zero issues.

The script also checked iam_uuid_shadow_validation and profile_uuid_shadow_validation after loader writes.

Same-Target Validation

The 2026-07-13 fixture run retained its isolated target only long enough to run the read-only live-populated validation with the required migrator report, UUID primary-key readiness, UUID primary-key promotion status, and UUID foreign-key validation. The artifacts are under:

txt
output/qa/iam-profile-target-validation-20260713-1783939084132/

The run recorded 22 matched reconciliation items, completed IAM and Profile migration checkpoints with hashes, zero UUID and orphan-reference issues, and validated 26 IAM plus 10 Profile UUID foreign keys. The temporary Postgres container was removed after the checks.

Cutover Boundary

Use this smoke as loader and schema compatibility evidence only. Default route promotion still requires production-like populated target validation with the captured run report, UUID readiness/FK/promotion checks on the same target DSNs, gateway/browser proof through api-gateway, and rollback evidence.

Go-platform documentation is generated from repository Markdown.