← AWS Retail Store Sample AppExamplesLegal NoticePrivacy

StackToIT Migration Intelligence Workspace

PROPOSAL — generated by StackToIT Assess. Architect review required before any decision.

Migration readiness

Not ready to start as a whole: 48 of the 57 automated steps can run now; 8 wait for a design decision and 1 waits for a manual step, a regenerated draft or another answer. First: Allow the calls of STACKIT APIs that are not generally available — Owner: Platform Architect.

44 units assessed from default; 8 more decided only at plan time; 41 switched off. 1 assumption about unmanaged security configuration.

How these numbers are counted

Partially executable migration package: 48 of the 57 automated steps (OpenTofu or a script) can run now (1 waits for a manual prerequisite, 8 require a design decision) · 9 of those 48 rest on a default you have not confirmed (public endpoint, size derived from the source) · stages of 57 automated steps: 57 can be generated, 48 can run now, 39 rest on no default left to confirm, 0 are approved (every decision and default confirmed in the decisions file)

Scope: 44 migration units read from default (and 8 decided only when OpenTofu plans: 3 off with the defaults of their variables (a variable can switch them on), 5 decided by data OpenTofu reads when it plans, 41 switched off); 36 of 319 critical settings resolved. Visibility: partly decided only at plan time.

Three measures, not one: "can run now" means the preconditions of the step in the plan are met (48 of the 57 automated steps); "automation-eligible" means the critical settings of the unit are closed (0 of 44 units; 17 more become eligible once their open items are answered; 27 cannot be automated in this build: a critical setting STACKIT does not support (13 units) and 4 more reasons, every one on the Automation eligibility line of index.html); "actually runnable" means the values the step reads are supplied as well (0 of the 48 steps that can run now: the plan still lists 43 OpenTofu variables, the STACKIT project id among them, as needing a value).

the default of 8 decisions nobody has answered: public endpoint (5), size derived from the source (3); confirm or change each in decisions.yaml; confirming one accepts what the draft does as it stands: the steps that rest on it then count among those that rest on no default left to confirm, and as approved once every decision they rest on is answered in the decisions file; decisions are counted one by one here, while the register's decisions to make and defaults to confirm count the records that group them

Source assurance: provider aws UNPINNED (confidence at most MEDIUM; remedy: (a) commit .terraform.lock.hcl with aws 5.100.0, the verified version the constraints admit: at least 11 units are then left to a manual review (no draft of their own) because 5.x is an earlier generation than the one the knowledge base is checked against; (b) raise the constraint `~> 5.0` to `~> 6.0` and lock aws 6.67.0, the primary verified version: no generation difference) · OpenTofu validation of the source: not run (lock file) · every required input of the source is in the package

Critical blockers

65 of the 314 steps of the plan cannot be carried out as the plan stands, whatever is decided: all of them manual steps, none of the 57 automated steps above. Every cause below holds all 5 applications (5 PROPOSED). What holds them (a step can wait for more than one):

  • OpenSearch domain this module.dependencies.module.catalog_opensearch.aws_opensearch_domain.this: 2 settings the draft cannot carry — holds 65 steps
  • Security group catalog_opensearch_sg module.dependencies.aws_security_group.catalog_opensearch_sg: 1 setting the draft cannot carry — holds 13 steps

Migration lists every step.

  • Applications: 0 of 5 ready for validation · 3 BLOCKED, 2 NOT_READY — causes: engine downgrade OpenSearch 3.3 → 2; code migration DynamoDB → MongoDB Flex; TLS-only Key Value Store (Valkey) endpoint (client change for ElastiCache); data protocol not assessed Aurora → MariaDB; 2 data stores with no drafted target and no assessed protocol; workload identity undecided on 5 of 5. The states are the customer's own record in the decisions file; StackToIT deployed and validated no application
  • Security: 15 source weaknesses stated (1 carried unchanged, 9 not carried, 5 not compared with the draft) (1 plaintext public listener; world-open ingress on tcp 8080; 1 transit encryption off; 2 final snapshots skipped; 5 single-node data stores; 1 access policy for every principal), 6 wait for security acceptance. The draft changes no security policy; decide before the migration.

Decisions waiting

9 of the 16 decisions to make hold 79 steps back (of the 314 steps of the plan): the 8 of the 57 automated steps above that require a design decision are among them. Decisions

6 more decisions hold steps back.

Drafted, redesign and not supported

Of 44 units: 34 can be drafted with configuration changes · 9 move to another service · 1 needs redesign. Target Fit

Automation-eligible today: 0 of 44 units.

How these numbers are counted

Source unit fate: 34 Terraform-only · 4 hybrid · 0 API-only · 3 manual · 11 no resource (of 52 units the draft considered: 44 known-present, 8 decided only when OpenTofu plans).

Mapping class of the 44 units counted in the totals: 34 reconfigure · 9 replatform · 1 redesign; none direct, containerize, manual review or blocked.

Automation eligibility: 0 of 44 units — a unit is automation-eligible when its critical settings are closed; this is not the steps that can run now; 17 more become eligible once their open items are answered; 27 cannot be automated in this build: a critical setting STACKIT does not support (13 units), a target resource the provider marks experimental (10 units), a decision whose every option is work a person does by hand (5 units), a permission document the source does not show (5 units) and a unit left to an architect (1 unit); the unpinned provider is one open item of every unit it serves: (a) commit .terraform.lock.hcl with aws 5.100.0, the verified version the constraints admit: at least 11 units are then left to a manual review (no draft of their own) because 5.x is an earlier generation than the one the knowledge base is checked against; (b) raise the constraint `~> 5.0` to `~> 6.0` and lock aws 6.67.0, the primary verified version: no generation difference

Cost estimate and unpriced scope

Estimate: STACKIT 878.34 EUR per month (730 h) for 5 of 14 lines priced (partial); of it 3 priced lines (713.67 EUR) rest on defaults of the draft that no decision confirmed (DEC-GEN-CONVERT-SIZE-FROM-SOURCE).

Not priced: 9 of 14 STACKIT lines, 30 of 30 source lines and 10 billable source resources outside the model — no saving is stated. Cost

How these numbers are counted

no source subtotal (none of the 30 source lines has an amount); STACKIT: partial 878.34 EUR (5 of 14 lines priced); of it 72.70 EUR target only (1 line the source side has no line to stand against: in the total, in no comparison); of it 3 priced lines (713.67 EUR) rest on defaults of the draft that no decision confirmed (DEC-GEN-CONVERT-SIZE-FROM-SOURCE) · 5 of 44 lines priced (source 0 of 30, STACKIT 5 of 14).

Financial comparison: NOT AVAILABLE — source region unknown (30 AWS lines wait for source.aws.region); 9 of 14 STACKIT lines have no price; 10 billable source resources are outside the model; the subtotal of one side is not a comparison and no saving is stated.

First three actions

  1. Next action: Allow the calls of STACKIT APIs that are not generally available — Owner: Platform Architect Open the record
    The full instruction, the evidence and what closes it

    Allow STACKIT's pre-release API, which may change or be withdrawn: Secrets Manager v1 (release status not stated). 4 steps wait for this answer; allowing the calls lets the plan carry them out and makes the migration depend on that API. If you say no (record a rejection), the calls are not made: the steps of Secrets Manager stay open. Record the answer in the decisions file given with --decisions (decisions-template.yaml).

    Evidence: The record names no verification of its own; the answer and who gave it are recorded in the decisions file.

    Closes when: Every API the record lists is answered in the decisions file: allowed, or refused.

  2. Apply the block of terraform/kubernetes.tf with OpenTofu TF/stackit_ske_cluster.retail_app_ecs_cluster · Platform Architect · 134 steps wait for it
  3. Choose how the data is moved · Data Architect · 114 steps wait for it
The rest of the result: 6 fixed lines · 5 changes the applications and the engines must absorb · 1 root cause named · 6 dimensions · 4 figures at a glance
  • Migration ready: NO — decisions to take: 89 · changes executable now: 73 · waiting: 149; 3 refused (of 314 steps) — plan steps: a decision to take is a step whose work is to decide, not a record of the decision register; changes executable now include the manual steps a person can start without a decision
  • Cost: Financial comparison: NOT AVAILABLE — source region unknown (30 AWS lines wait for source.aws.region); 9 of 14 STACKIT lines have no price; 10 billable source resources are outside the model; the subtotal of one side is not a comparison and no saving is stated. 5 of 44 lines priced (reasons: 30 region needed); of the STACKIT amount, 3 priced lines (713.67 EUR) rest on defaults of the draft that no decision confirmed (DEC-GEN-CONVERT-SIZE-FROM-SOURCE)
  • Mappings: 0 of 44 land on GA STACKIT services with every critical setting accounted · maturity beta 44
  • Mapping confidence: 0 of 44 HIGH — capped at MEDIUM by the source provider band: aws UNPINNED (the Source provider line below has the remedy)
  • Live verification: never applied to STACKIT — no STACKIT plan was run over this draft and no step of the plan has met a live STACKIT project; 0 of 4 STACKIT API steps verified live
  • Source provider: aws UNPINNED — confidence at most MEDIUM, no automation eligibility (no lock file entry pins it) — remedy: (a) commit .terraform.lock.hcl with aws 5.100.0, the verified version the constraints admit: at least 11 units are then left to a manual review (no draft of their own) because 5.x is an earlier generation than the one the knowledge base is checked against; (b) raise the constraint `~> 5.0` to `~> 6.0` and lock aws 6.67.0, the primary verified version: no generation difference — only a lock file and a source validation show that either works

Changes the applications and the engines must absorb, before any dependency item:

  • module.dependencies.module.dynamodb_carts.aws_dynamodb_table.this (aws_dynamodb_table) is a REDESIGN, not a like-for-like move: the STACKIT target is STACKIT MongoDB Flex, and what uses it is adapted
  • Choose the database engine version: module.dependencies.module.catalog_opensearch.aws_opensearch_domain.this (DEC-OPS-MODULE-DEPENDENCIES-MODULE-CATALOG-OPENSEARCH-AWS-OPENS-0034548E)
  • Choose the database engine: module.dependencies.module.catalog_rds.aws_rds_cluster.this (DEC-OPS-MODULE-DEPENDENCIES-MODULE-CATALOG-RDS-AWS-RDS-CLUSTER-THIS)
  • Choose the database engine version: module.dependencies.module.catalog_rds.aws_rds_cluster.this (DEC-OPS-MODULE-DEPENDENCIES-MODULE-CATALOG-RDS-AWS-RDS-CLUSTER-THIS)
  • Choose the database engine version: module.dependencies.aws_mq_broker.mq (DEC-OPS-MODULE-DEPENDENCIES-AWS-MQ-BROKER-MQ)

Applications: 0 of 5 ready for validation · 3 BLOCKED, 2 NOT_READY — causes: engine downgrade OpenSearch 3.3 → 2; code migration DynamoDB → MongoDB Flex; TLS-only Key Value Store (Valkey) endpoint (client change for ElastiCache); data protocol not assessed Aurora → MariaDB; 2 data stores with no drafted target and no assessed protocol; workload identity undecided on 5 of 5. The states are the customer's own record in the decisions file; StackToIT deployed and validated no application

DEPLOYMENT_BLOCKED: module.dependencies.module.catalog_opensearch.aws_opensearch_domain.this and the application catalog (the engine downgrade OpenSearch 3.3 → 2) until a test shows the application works against the version STACKIT offers or an architecture decision (a self-managed engine on SKE, or waiting for the version) is recorded in the decisions file

Code change: 1 unit needs a code change in the application (DynamoDB → MongoDB Flex), counted apart from the automation figures (can run now, automation-eligible, actually runnable): a unit whose application is rewritten is not a unit whose infrastructure alone changes; 3 more drafted data stores have a protocol that is not assessed, so a code change is not ruled out (OpenSearch → OpenSearch, Aurora → MariaDB, ElastiCache → Key Value Store (Valkey))

Root causes
1 root cause: 0 units have open items that exist only because of it. Every dependent is listed on the Decisions page. Root causes
  1. DEC-GEN-CONVERT-ENGINE-VERSION-DOWNGRADE — 0 dependent units. Next: Decide engine version downgrade for module.dependencies.module.catalog_opensearch.aws_opensearch_domain.this: choose one of the 3 options, and record the answer for this record in the decisions file given with --decisions (decisions-template.yaml). Open the record
Six dimensions of this run. There is no overall score, and no row means that the migration is ready.
DimensionStateWhat it countsWhat moves it
Analyzed PARTIAL 44 known-present units of 282 resources scanned; 8 decided only when OpenTofu plans; 41 switched off Moves when every file, module and variable value the source reads is in the package (source: partly decided only at plan time).
Drafted PARTIAL 38 of the 52 units the draft considered have a generated resource (44 known-present, 8 decided only when OpenTofu plans); 11 no resource, 3 left to the architect Moves with the units the draft writes a resource for; a unit with no resource, or left to the architect, is counted in the Source unit fate line.
Validated PARTIAL OpenTofu validation of the source: not run (lock file); OpenTofu validation: passed (tofu init -backend=false and tofu validate accepted the draft; tofu 1.13.1); StackToIT draft checks: passed (100 checks, none found a violation); Global invariants: passed (12 of 12 invariants PASS); STACKIT plan: not run (this build runs no plan against a STACKIT project) Moves when OpenTofu validates the source and the draft and the STACKIT plan is run; a pass of the draft checks is not a validated source, this build runs static checks only, and a pass of them approves nothing.
Deployable PARTIALLY EXECUTABLE package state: Partially executable migration package; the automated steps are counted once, in the readiness block of this page Moves with the decisions and manual prerequisites that hold steps back, as Migration Execution counts them; nothing has been run.
Application Ready OPEN 0 of 5 drafted workloads with every checklist item marked done by the customer (0 with the customer's attestation that the validation passed; StackToIT validated none) Moves when the customer marks the checklist items of a workload done in the decisions file (application_checklists) and answers its data store decisions, and when the customer attests that the validation on the target passed; StackToIT never deploys the application and a generated resource marks no workload ready.
Equivalent OPEN 36 of 319 critical settings resolved or accepted (36 resolved, 0 accepted design changes) Moves when an open critical setting is resolved or accepted as a design change. Accounting is not equivalence: every setting accounted for says the contracts cover it, not that the target behaves like the source, so this dimension never reads equivalent in this build (semantic equivalence: NOT_ASSESSED in the validation matrix).
Verdict
Partially executable migration package · Proposal only · Not approved.
What changes
Architecture change: generated networks that hold no interface — stackit_network.vpc_vpc_private for module.vpc.module.vpc.aws_subnet.private: drafted, consumers not placed: decision DEC-GEN-CONVERT-WORKLOAD-PLACEMENT — nothing in the draft is placed in it, although the source places module.dependencies.aws_mq_broker.mq, module.dependencies.module.catalog_opensearch.aws_opensearch_domain.this, module.dependencies.module.catalog_rds.aws_rds_cluster.this and 7 more in module.vpc.module.vpc.aws_subnet.private; the drafted Kubernetes cluster stackit_ske_cluster.retail_app_ecs_cluster of these consumers sets no network.id. Decide whether the address range of each is still needed (security-group rules, routes or workloads of the source may name it); to drop one, regenerate the draft rather than edit it. Architecture change: private DNS parity not established: the source resolves internal EC2 host names (module.vpc.module.vpc.aws_vpc.this enable_dns_hostnames = true) through the VPC resolver; the drafted stackit_network.vpc_vpc_private and stackit_network.vpc_vpc_public use var.default_ipv4_nameservers (public names only), and STACKIT documents no private DNS zone or internal name resolution (STACKIT DNS serves public zones only; the DNS Resolver product is in beta): names only the VPC resolver answers need a DNS server of your own. Identity and access not carried: user › username of module.dependencies.aws_mq_broker.mq. Identity and access not carried: advanced options of module.dependencies.module.catalog_opensearch.aws_opensearch_domain.this (review the access and encryption settings setting). Identity and access not carried: advanced security options › anonymous auth enabled of module.dependencies.module.catalog_opensearch.aws_opensearch_domain.this (review the access and encryption settings setting). 91 more critical network-exposure or identity-access settings are not carried (engineering/not-carried.csv). 83 of the 93 unit-list entries state a STACKIT target (STACKIT security group, STACKIT service account for the workload, STACKIT network, 27 more); 10 state none. The unit list counts entries, the 44 migration units above are the units counted in the totals: it also holds conditional, switched-off and facet entries. Target Fit
Open actions by type
113 decision records by what you do next:
  • 81 open input
  • 0 input applied, not closed
  • 0 confirm only
  • 0 accepted
  • 6 requires verification
  • 25 manual work
  • 0 regenerate the draft
  • 1 blocked
  • 0 unsupported on STACKIT
Decision centre
Inputs: 4 design inputs wait · 47 open requests (14 block the draft, 4 are preferences this build cannot apply — inputs-template.yaml, NOT APPLICABLE IN THIS BUILD, says where to set each).
Execution readiness
Execution: 48 of the 57 automated steps (OpenTofu or a script) can run now (1 waits for a manual prerequisite, 8 require a design decision) · 9 of those 48 rest on a default you have not confirmed (public endpoint, size derived from the source) · stages of 57 automated steps: 57 can be generated, 48 can run now, 39 rest on no default left to confirm, 0 are approved (every decision and default confirmed in the decisions file) · 49 Terraform (1 after a manual prerequisite) · 4 API (4 wait for the opt-in) · 4 design inputs · 154 manual migration work (272 settings in 69 review steps) (counting the longest method of each open data-movement choice; 16 steps of the other methods not counted) · 84 lifecycle (cutover/verify/retire) · 3 refused (of 314 plan steps).
Blockers
Open work: 323 to review (307 critical settings, 9 plan decisions, 5 manual actions, 2 plan statements) · 2 defaults to confirm · 1 confirm only (open critical settings, and open decision records of the register). 25 of the 307 critical settings of the register belong to units decided only when OpenTofu plans; the 283 open critical settings of the units counted in the totals leave them out. 9 decisions hold plan steps back: 79 steps wait only for them; apart from those, 65 steps cannot be carried out as the plan stands, whatever is decided (of the 314 steps of the plan: steps of every kind, manual ones included). They come first. 1 record is blocked: nothing answered frees it before what holds it is cleared. Decisions
Validation
OpenTofu validation of the source: not run (lock file) · Output schema validation: passed (verified at publish) · OpenTofu validation: passed (tofu init -backend=false and tofu validate accepted the draft; tofu 1.13.1). Migration readiness and semantic equivalence are not established. Validation matrix
What it costs
Financial comparison: NOT AVAILABLE — source region unknown (30 AWS lines wait for source.aws.region); 9 of 14 STACKIT lines have no price; 10 billable source resources are outside the model; the subtotal of one side is not a comparison and no saving is stated. 0 of the 140 source resources of the cost model computed on both sides · 0 quantity unknown · 28 not computed, 112 more carry no charge of their own. Net list prices, not a bill. Source and target are compared only over the 0 resources both sides price in full; the others are in no figure. Not included: traffic, usage, support, licences, operations and migration cost; a scenario of what owning the estate costs, on either side, is not provided by this build.
Technical details: run, versions, digest and evidence freshness

Assessment

Assessment
default (assessment format 0.24.0)
Assessment timestamp
Generated 2026-11-02 12:08 UTC by stacktoit 0.6.0-11562-g1966ddf116 (1966ddf116)
Run
f6267c3f-2848-4aa5-89df-5fee8b15b3b9 · source digest sha256:812c5ae3f6cc8530163abbf5b6fbe305ed3b363c4886ec6b87623db857ea0c70
Source snapshot
partly decided only at plan time · aws not locked; random not locked
STACKIT target profile
Stable network model: the experimental STACKIT VPC resources are not used (STACKIT_STABLE)
STACKIT provider version
0.121.0
Knowledge base version
0.384.0
Evidence freshness
Not assessed — Evidence freshness as one measure is not assessed in this build. Dated evidence is shown where it is used: each STACKIT support option and each assurance row states when it was verified (verified_at, and recheck_after for support), in support_suitability and assurance. The date beside a readiness dimension is the assessment date, not a retrieval date.

Staleness: Not assessed — This build has no change detection, so there has been no re-check since the assessment was made (Generated 2026-11-02 12:08 UTC). The source may have changed since.

Source checks: Built-in source checks passed — OpenTofu validation of the source did not run (LOCK_FILE)

Run status: COMPLETE (report published). Source: partly decided only at plan time. Draft: GENERATED. The report was written whole; this is not a statement that the migration is ready.

Executive lens: the sections are in the order this reader usually wants, and Architecture and Engineering Evidence are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Architect lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Platform lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Security lens: the sections are in the order this reader usually wants, and Costs and Migration Plan are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Application owner lens: the sections are in the order this reader usually wants, and Engineering Evidence is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Programme lens: the sections are in the order this reader usually wants, and Engineering Evidence is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

FinOps lens: the sections are in the order this reader usually wants, and Architecture and Engineering Evidence are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Engineering lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Overview

44 migration units were assessed from default. Beside them: 8 whose existence is decided only when OpenTofu plans (3 off with the defaults of their variables (a variable can switch them on), 5 decided by data OpenTofu reads when it plans), 41 switched off.

The five-minute answer

10 biggest blockers listed

Each line is a number or a list that one of the pages below states in full, and links to it. There is no score here, and nothing on this page means that the estate is safe to migrate.

Biggest blockers

323 to review (307 critical settings, 9 plan decisions, 5 manual actions, 2 plan statements) · 2 defaults to confirm · 1 confirm only (open critical settings, and open decision records of the register)

Critical findings come first; then the findings of warning severity and the critical settings a person decides, the one that concerns the most units first; then the settings the draft already carries, to confirm only, and last the accepted design changes. At most ten are listed.

  1. Confirm that every resource names the one network · warning finding · 12 units: The project can be taken as one VPC's boundary only if every resource that names a VPC provably names the estate's one, and this estate does not show it: the VPC this security group names, or the VPC another resource of the estate names (a network ACL, a flow log, a peering connection, a Cloud Control subnet, ...), is a literal id, a variable, a data source, an attribute of a VPC other than its id (its arn, its owner id, ...) or an expression the scan cannot reduce to one reference to the VPC the estate creates (or the estate creates no VPC of its own). A unit placed in a subnet that the scan cannot show is one of the estate's (a server, load balancer, function or NAT gateway in a subnet given by a variable, a data source or a literal id) is in the same position: it may stand in another VPC. The draft puts every network, security group and routing table in the one var.project_id and cannot say that they all belong to one VPC. Confirm which VPC each of them is in, and whether the networks of another VPC belong in this project or in a project of their own joined through a Network Area. No unit of the VPC topology is generated automatically until then (gate blocker TOPOLOGY:vpc-unproven). · owner: unassigned (a finding records no owner role) · concerns module.dependencies.aws_security_group.catalog_opensearch_sg, module.dependencies.aws_security_group.mq, module.dependencies.module.catalog_rds.aws_security_group.this
  2. Confirm that the project is the boundary of one network · critical setting, open on 12 units (REVIEW) · owner: Network Architect · concerns module.dependencies.aws_security_group.catalog_opensearch_sg, module.dependencies.aws_security_group.mq, module.dependencies.module.catalog_rds.aws_security_group.this · closes when: A person decides it as that finding asks, and the finding's closing evidence or decision is recorded.
  3. Decide which networks the security group may be attached to (a STACKIT group has no network scope) · critical setting, open on 12 units (UNSUPPORTED) · owner: Network Architect · concerns module.dependencies.aws_security_group.catalog_opensearch_sg, module.dependencies.aws_security_group.mq, module.dependencies.module.catalog_rds.aws_security_group.this · closes when: A person confirms which VPC each network resource of the estate is in and whether the networks of another VPC belong in this project or in a project of their own joined through a Network Area; the group is then attached only to the interfaces of the networks that replace its VPC.
  4. Review the stateful setting · critical setting, open on 12 units (REVIEW) · owner: Network Architect · concerns module.dependencies.aws_security_group.catalog_opensearch_sg, module.dependencies.aws_security_group.mq, module.dependencies.module.catalog_rds.aws_security_group.this · closes when: A person designs how the target enforces what the group allowed (attaches the group, or its replacement, to the target resources that take its place), or accepts the difference.
  5. Review the IAM trust service workload setting · critical setting, open on 10 units (REVIEW) · owner: Identity Architect · concerns module.retail_app_ecs.module.carts_service.aws_iam_role.task_execution_role, module.retail_app_ecs.module.carts_service.aws_iam_role.task_role, module.retail_app_ecs.module.catalog_service.aws_iam_role.task_execution_role · closes when: A person decides it as that finding asks, and the finding's closing evidence or decision is recorded.
  6. Translate the IAM permissions into STACKIT roles · critical setting, open on 10 units (REVIEW) · owner: Identity Architect · concerns module.retail_app_ecs.module.carts_service.aws_iam_role.task_execution_role, module.retail_app_ecs.module.carts_service.aws_iam_role.task_role, module.retail_app_ecs.module.catalog_service.aws_iam_role.task_execution_role · closes when: A person translates each permission of the attached policies into STACKIT roles on the target resources.
  7. Decide who may assume each IAM role · critical setting, open on 10 units (REVIEW) · owner: Identity Architect · concerns module.retail_app_ecs.module.carts_service.aws_iam_role.task_execution_role, module.retail_app_ecs.module.carts_service.aws_iam_role.task_role, module.retail_app_ecs.module.catalog_service.aws_iam_role.task_execution_role · closes when: A person decides per principal who may assume the role: a federated identity provider (IRSA), a server attachment or a service account key; a role used only by an AWS service is dropped after a person confirms it.
  8. Confirm the ports of the rules of the security group · critical setting, open on 9 units (LEDGER, REVIEW) · owner: Network Architect · concerns module.dependencies.module.catalog_rds.aws_security_group.this, module.dependencies.module.checkout_elasticache_redis.module.aws_security_group.aws_security_group.cbd, module.dependencies.module.orders_rds.aws_security_group.this · closes when: A person decides it as that finding asks, and the finding's closing evidence or decision is recorded.
  9. Re-state the restricted outbound rules of the security group · warning finding · 8 units: The source restricts egress (the AWS provider removes AWS's default allow-all egress rule; only the listed egress rules apply). Every new STACKIT security group gets two default egress rules, IPv4 and IPv6, with no ip range (any address), no protocol and no port restriction (the test of 2026-10-07, 2026-10-07: API read-back of a new group, docs concepts page), that stackit_security_group (the pinned STACKIT provider) does not manage — as generated, the draft allows all egress. After apply, delete them (stackit security-group rule list / delete --security-group-id <id>), or egress is wider than in the source. · owner: unassigned (a finding records no owner role) · concerns module.dependencies.aws_security_group.catalog_opensearch_sg, module.dependencies.aws_security_group.mq, module.dependencies.module.catalog_opensearch.aws_security_group.this
  10. Sg rule not rendered · warning finding · 6 units: At least one rule of this group is not in the draft as the source has it. The plan withholds it, holds it as a commented-out rule until a value or a decision is filled in, writes it with a fact that decides what it allows not carried exactly, or cannot name it at all because the source has more rules than are visible statically (a dynamic block over a collection, a count or a rule list that is not known until apply, or a list with a hidden member: the plan's INCOMPLETE action says which set and why, the draft's TODO "rules beyond the known set" names it, and only the known rules are drafted). Typical causes: a protocol, port or source whose value is known only at apply time or comes from a root variable; a source group that is a choice between groups or not a group of the draft; a protocol with no STACKIT counterpart; an ICMP type with every code; an ICMP or ICMPv6 rule whose range is of the other IP family (the API answers HTTP 400, the test of 2026-10-08); a tcp or udp rule with a negative port, a port above 65535, a reversed range, or port 0 only (STACKIT stores no port range for 0 to 0, so the rule would match every port). A tcp or udp range that starts at port 0 and ends below 65535 is written from port 1 (the STACKIT API rejects a range that starts at 0; tested on a STACKIT project on 2026-10-07): port 0 itself is not carried. A stackit_security_group_rule without protocol, port_range or source allows everything (the pinned STACKIT provider), so such a rule is never widened; re-create it with the values it needs (the plan names each one). · owner: unassigned (a finding records no owner role) · concerns module.dependencies.aws_security_group.catalog_opensearch_sg, module.dependencies.aws_security_group.mq, module.dependencies.module.catalog_rds.aws_security_group.this

… and 107 more groups to review, 1 confirm-only item (see Decisions).

Source assurance warnings

These warnings are about how well the source was read, not about what blocks the migration, so they are not listed among the blockers above. They are not dismissed: each is still a finding group, and the finding stays on every unit it concerns.

  • Pin the version of the source provider · warning finding · 93 units: No lock file entry pins aws (>= 3.0, >= 3.29, >= 4.18, >= 4.30, >= 4.59, >= 5.64, >= 5.79, ~> 5.0): the version the plan would use is not proven, so the knowledge base (checked against 5.100.0) is not taken as proof of it (stated once for the whole estate, with the units it covers and the rest of the words)

Decisions people must take

Decision register: 16 decisions to make (9 plan decisions, 5 manual actions, 2 plan statements, 2 of them with the draft's DEFAULT to confirm or change) · 2 defaults to confirm (other records, no step waits for them) · 48 units to review (308 critical settings: 307 to decide (25 of them are conditional), 1 confirm only). See Decisions.

How much was understood

44 units are counted in the totals. Beside them 8 are decided only when OpenTofu plans (3 off with the defaults of their variables (a variable can switch them on), 5 decided by data OpenTofu reads when it plans) and 41 are switched off; those are not measured. Evidence traces, by kind of entry of the unit list: active units with a block in the draft: 36 of 36 traced (23 from the lines the draft records for them, not from a typed plan); active units with no block in the draft: 5 of 8 traced (3 with nothing to trace); units decided only when OpenTofu plans: 5 of 8 traced (2 from the lines the draft records for them, not from a typed plan); switched-off units: 11 of 41 traced. An entry without a trace is not an entry with nothing open; the unit list says for each why it has none. 36 of 319 critical settings are resolved; 283 are open: a critical setting counts as resolved only when it has been decided, not when it has merely been looked at.

What the target would look like

83 entries of the unit list state a STACKIT target and 10 do not. The services, with the entries of each (Target Fit):

  • STACKIT security group: 10 entries
  • STACKIT service account for the workload: 10 entries
  • STACKIT network: 7 entries
  • STACKIT security groups (no stateless NACLs): 7 entries
  • STACKIT Kubernetes Engine (SKE): 6 entries
  • STACKIT Logs: 6 entries
  • not written by this draft (stackit_security_group, stackit_security_group_rule): 5 entries
  • STACKIT Secrets Manager: 4 entries
  • STACKIT MongoDB Flex (alternative — data-model redesign; PostgreSQL Flex JSONB is the other option): 3 entries
  • STACKIT Logs access tokens: 2 entries
  • STACKIT Observability alert rules: 2 entries
  • STACKIT project networking / Network Area (SNA): 2 entries
  • implicit (STACKIT network default routing): 2 entries
  • STACKIT Application Load Balancer: 1 entry
  • STACKIT DNS record set: 1 entry
  • STACKIT KMS: 1 entry
  • STACKIT Key Value Store (Valkey): 1 entry
  • STACKIT MariaDB: 1 entry
  • STACKIT OpenSearch: 1 entry
  • STACKIT PostgreSQL Flex: 1 entry
  • STACKIT RabbitMQ: 1 entry
  • STACKIT VPN: 1 entry
  • STACKIT network DNS settings: 1 entry
  • implicit (STACKIT network default gateway): 1 entry
  • implicit (belongs to the NAT gateway): 1 entry
  • implicit outbound (STACKIT network): 1 entry
  • none - no account guardrail to except a VPC or subnet from: 1 entry
  • none - no account guardrail; exposure is set by security groups and by who may attach public IPs: 1 entry
  • none - no packet-flow log: a capture on the servers whose records a log shipper sends to a STACKIT Logs instance is a design of its own: 1 entry
  • none managed — application events over RabbitMQ: 1 entry

Price coverage, counted in drafted STACKIT resources (not the source resources the cost model counts): of the 11 drafted resources a price rule covers, 6 are priced and 5 are not (stackit_opensearch_instance.dependencies_catalog_opensearch_this, stackit_mariadb_instance.dependencies_catalog_rds_this, stackit_mongodbflex_instance.dynamodb_tables, stackit_kms_key.retail_app_ecs_cmk, stackit_secretsmanager_instance.migrated_secrets; each with its reason in financial/priced-resources.csv); the other 42 drafted resources have no price rule. A resource is priced only where a tested rule joins it to one SKU of the public STACKIT price list; the lines with their quantities, amounts and totals are in financial/cost-model.json and financial/priced-resources.csv; a total is full only when every line of its scope is priced.

What happens next

  1. Review the 307 open critical settings: a person decides each (index.html, Decisions page; assurance/critical-semantics.json, critical_semantic_resolution.open). 25 of them belong to units that exist only if a plan-time input holds (critical_semantic_resolution.conditional_open). 1 more is carried by the draft already: confirm only. (see it here)
  2. Review the 9 open plan decisions and 5 manual actions of the draft (index.html, Architecture, Deployment prerequisites). Confirm the 2 defaults the draft carries out (index.html, Decisions page): no step waits for the answer, a person confirms each or changes it. (see it here)
  3. Review the draft in terraform/: it is a proposal, and an architect has to review it before any use. (see it here)
  4. Open index.html in a browser for the unit-by-unit view (offline, nothing is loaded).

Run summary

14 lines

The numbers of this run. The console prints the same lines at the end of the run, and engineering/architect-report.md and workspace.json (run_summary) state the same numbers: they are read from one model.

Run summary
Package statePartially executable migration package
Plan steps49 generated automatically · 4 generated with decisions · 238 manual carry-over · 3 unsupported · 3 units left to the architect for redesignmanual carry-over here includes the cutover, verification and retirement steps; STACKIT API steps, and Terraform steps that no decision can free, are in none of these counts, which the Execution line below states; manual carry-over counts the longest method of each open data-movement choice
Source unit fate34 Terraform-only · 4 hybrid · 0 API-only · 3 manual · 11 no resource (of 52 units the draft considered: 44 known-present, 8 decided only when OpenTofu plans)what becomes of each unit the draft considered; the five add up to the units considered, and Terraform-only and hybrid together are the units generated
Execution48 of the 57 automated steps (OpenTofu or a script) can run now (1 waits for a manual prerequisite, 8 require a design decision) · 9 of those 48 rest on a default you have not confirmed (public endpoint, size derived from the source) · stages of 57 automated steps: 57 can be generated, 48 can run now, 39 rest on no default left to confirm, 0 are approved (every decision and default confirmed in the decisions file) · 49 Terraform (1 after a manual prerequisite) · 4 API (4 wait for the opt-in) · 4 design inputs · 154 manual migration work (272 settings in 69 review steps) (counting the longest method of each open data-movement choice; 16 steps of the other methods not counted) · 84 lifecycle (cutover/verify/retire) · 3 refused (of 314 plan steps)what each step of the plan is; the categories add up to the plan's steps
Defaultsthe default of 8 decisions nobody has answered: public endpoint (5), size derived from the source (3); confirm or change each in decisions.yaml; confirming one accepts what the draft does as it stands: the steps that rest on it then count among those that rest on no default left to confirm, and as approved once every decision they rest on is answered in the decisions file; decisions are counted one by one here, while the register's decisions to make and defaults to confirm count the records that group themthe steps that can run now may stand on them; the decision register lists each decision
Inputs4 design inputs wait · 47 open requests (14 block the draft, 4 are preferences this build cannot apply — inputs-template.yaml, NOT APPLICABLE IN THIS BUILD, says where to set each)design inputs are steps of the plan; requests are what the run asks the customer, listed one by one when the run is given an inputs file or a project
Source units44known-present migration units; 8 more decided only when OpenTofu plans: 3 off with the defaults of their variables (a variable can switch them on), 5 decided by data OpenTofu reads when it plans, 41 switched off
Critical open settings283282 to decide, 1 confirm only; 36 resolved of the 319 the units state; 25 more are open on 5 units decided when OpenTofu plans, not counted here but listed in the decision register (marked: applies only if)
Decisions to review16 decisions to make (9 plan decisions, 5 manual actions, 2 plan statements, 2 of them with the draft's DEFAULT to confirm or change) · 2 defaults to confirm (other records, no step waits for them) · 48 units to review (308 critical settings: 307 to decide (25 of them are conditional), 1 confirm only)a decision to make is a record of an open plan decision, manual action or plan statement; a default to confirm is such a record whose default option the draft carries out (no step waits for it: a person confirms it or changes it); a unit to review is the review record of the critical settings of one unit that the knowledge base cannot decide (one record for each owner role, each setting an item of it); conditional settings are on units decided only when OpenTofu plans (decisions.json)
Draft coverage38 of 52 units with a generated resource11 need no resource · 3 left for the architect · 60 variables · the 52 are the 44 source units and 8 conditional units
Global draft invariants12/12 PASSconsistency checks over the draft; not target behaviour
tofu validatePASSEDstatic validation; not target behaviour
Architect approvalNOT PROVIDED
Safe to applyNOT ASSERTED

Readiness by dimension

12 dimensions

Readiness is shown per dimension. There is no overall score, and no dimension here means that the estate is safe to migrate.

Three states answer three questions. Coverage says how much of what the dimension counts is covered (Covered: all of it); it never says that anything is decided, validated or ready to deploy. Migration decisions is read from the Blockers and Open decisions columns of the same row: a Covered dimension can have blockers. Target validation says what StackToIT’s own checks established about the generated target for that dimension; no STACKIT plan is run, so nothing here means the draft plans or applies.

Semantic Accounting counts the critical settings the assessment accounted for; Critical Resolution counts those that are decided: accounted is not resolved. Terraform Draft Accounting counts the units whose critical settings are accounted for in the draft; it does not say that the draft validates or plans against STACKIT.

The six dimensions of the first screen read the rows of this matrix: Analyzed reads Source Fidelity; Drafted reads Terraform Draft Accounting (the units whose critical settings are accounted for in the draft; Drafted counts the units that have a generated resource); Validated reads the Target validation column; Deployable reads the package state of Migration Execution; Application Ready reads Target Functional Fit and the Operational Readiness row (no application compatibility contract exists in this build); Equivalent reads Semantic Accounting and Critical Resolution (accounted for is not resolved, and resolved is not equivalent). Security, Sovereignty & Exitability and Cost Confidence have pages of their own and no user-first dimension.

Readiness matrix
DimensionCoverage stateMigration decisionsTarget validationCoverageBlockersOpen decisionsAssessment dateWhat this shows
Source Fidelity Partly covered Blockers open Not applicable no coverage figure is defined for this measure 1 not assessed in this build 2026-11-02 For some units, whether and how many times they exist is decided only when OpenTofu plans.
Semantic Accounting Covered Blockers open Not applicable 44 of 44 (100%)
units with a semantic contract and no critical setting unaccounted; 0 units without a contract or with a critical setting unaccounted
43 not assessed in this build 2026-11-02 Accounted for is not decided. Covered means every unit has a semantic contract and no critical setting is unaccounted; it does not mean the settings are decided, so the blockers still count the 43 units that leave one for a person. 0 units have no semantic contract; 0 units leave a critical setting unaccounted; 43 units leave one for a person to review (accounted for, not decided). A blocker here is a unit that does either of the last two.
Critical Resolution Partly covered Blockers open Not applicable 36 of 319 (11%)
critical settings resolved; 283 critical settings open
43 not assessed in this build 2026-11-02 36 of 319 critical settings are resolved; 43 units hold an open one (accounted for, not decided); 0 units have no semantic contract. A blocker here is a unit that does either.
Target Functional Fit Not assessed Not assessed Not assessed not assessed in this build not assessed in this build not assessed in this build not assessed in this build Not assessed in this build.
Target Operability Not assessed Not assessed Not assessed not assessed in this build not assessed in this build not assessed in this build not assessed in this build Not assessed in this build.
Terraform Draft Accounting Not covered Blockers open Static checks passed 0 of 44 (0%)
units whose critical settings are all accounted for in the draft; 44 units with a critical setting left to a person, or without a draft block
44 not assessed in this build 2026-11-02 Not a validation. This counts only whether each unit's critical settings are accounted for in the draft; it does not mean the draft validates, plans or applies against STACKIT, and even the coverage state Covered would not mean it.
Security 15 source weaknesses stated Not assessed Not assessed not assessed in this build not assessed in this build not assessed in this build not assessed in this build 15 source weaknesses stated. What the target's security posture would be is not assessed in this build.
Reliability / Resilience Not covered Blockers open Not validated no coverage figure is defined for this measure 6 0 2026-11-02 6 units state a failure-domain, replication or backup fact or hold state. 6 units have no RTO or RPO the customer wrote to decide against, and 0 units have one and wait for a person to choose its resilience intent. No unit is called resilient and no intent is chosen: the source states none, and the availability-zone and metro facts of the target are not assessed.
Operational Readiness Partly covered No open item counted Not validated no coverage figure is defined for this measure 0 0 2026-11-02 Terraform generated is not workload ready: 1 of 44 units carry open workload items. 0 units need a decision or evidence from a person (0 of them a decision; 0 block a readiness claim, a cutover decision being a migration operation and not a blocker); 6 compute units have no workload evidence in this build. The 20 dimensions of the amendment's operational readiness (identity, logs, backup, DR, support and the rest) are not assessed. A generated Terraform resource does not mark any of them ready.
Sovereignty & Exitability Not assessed Not assessed Not assessed not assessed in this build not assessed in this build not assessed in this build not assessed in this build No state is derived for this dimension: this build rates neither sovereignty nor exitability. What it does state (the thirteen dimensions, the source dependencies and the exitability entries, each with its own state) is in assurance/sovereignty.md and on the Sovereignty page.
Cost Confidence Not assessed Not assessed Not assessed not assessed in this build not assessed in this build not assessed in this build not assessed in this build Not assessed in this build.
Evidence Freshness Not assessed Not assessed Not assessed not assessed in this build not assessed in this build not assessed in this build not assessed in this build Not assessed in this build.

Units by mapping class

44 units in 7 classes
Units by mapping class (units counted in the totals)
ClassUnits
DIRECT0
RECONFIGURE34
REPLATFORM9
CONTAINERIZE0
REDESIGN1
MANUAL_REVIEW0
BLOCKED0
Units by confidence (units counted in the totals)
ConfidenceUnits
HIGH0
MEDIUM35
LOW9

105 source files, 282 resources scanned, 109 dependencies between units. Every unit is listed on the Architecture page.

Blocked units

none

No unit is in the mapping class BLOCKED. That names a class of the mapping, not an absence of blockers: what holds the plan back is counted apart, under Migration readiness and Blockers above.

BLOCKED is also the state of an application (its checklist) and the state of a step of the plan that cannot run; the three are counted apart and none is the sum of the others.

Decisions and cost

113 decision records

Open decisions: 16 decisions to make (9 plan decisions, 5 manual actions, 2 plan statements, 2 of them with the draft's DEFAULT to confirm or change) · 2 defaults to confirm (other records, no step waits for them) · 48 units to review (308 critical settings: 307 to decide (25 of them are conditional), 1 confirm only). Cost coverage: 44 cost lines (30 of the source, 14 of the target), 5 priced. The estate (140 source resources), priced part: modelled infrastructure subtotal (10 of 140 source resources), SOURCE: none (NONE; 0 priced, 30 not priced and never filled in). The estate (140 source resources), priced part: modelled infrastructure subtotal (10 of 140 source resources), TARGET: 878.34 EUR (PARTIAL; 5 priced, 9 not priced and never filled in). This is an initial infrastructure cost estimate under explicit assumptions (the assumptions), not a bill. See Decisions and Cost.

Migration execution

314 steps

Partially executable migration package. Steps defined: 314 in the execution plan (53 OpenTofu, 4 STACKIT API, 254 manual, 3 refused). Progress by kind of step: decisions to take: 89 · changes executable now: 73 · waiting: 149; 3 refused (of 314 steps). 48 of the 57 automated steps (OpenTofu or a script) can run now (1 waits for a manual prerequisite, 8 require a design decision) · 9 of those 48 rest on a default you have not confirmed (public endpoint, size derived from the source); a person can start 114 of the 254 manual steps now (4 wait for a manual prerequisite, 71 require a design decision, 65 are not executable as the plan stands); 3 steps are permanently unsupported (refused); 1 step has its verification incomplete: it carries critical settings of the source that no check validates, which a person confirms in the draft. See Migration Execution. The execution package starts at execution/README.md. The order of the work and what the STACKIT project has to provide first are in migration/roadmap.md and migration/landing-zone-requirements.md.

This is technical migration and architecture evidence. It is not legal advice, certification or an auditor's attestation.