How Tallywyrm opens a scoped `.tf` PR against the repo your platform team already owns.
Tallywyrm reads the customer’s GitHub or GitLab repo as a read-only GitHub App or project access token brokered through your OIDC trust, opens a small rightsizing PR against the .tf / .tfvars files the audit pass identified, and never reaches terraform apply. The same row lands on /dashboard/savings with the deploy timestamp, the bundle_sha256 and the cloud-bill delta finance already reconciles against.
One credential, your repo, scoped diffs.
The agent reads only the Terraform / Pulumi / Crossplane repo and only the .tf / .tfvars paths the audit pass identified. No static long-lived keys are stored — the credential model on /security-and-compliance names the same posture from the controls side.
For GitHub, Tallywyrm is installed as a GitHub App on the repo your platform team owns — short-lived installation tokens, no per-user PAT. For GitLab, a project access token scoped to the same repo. The same credential opens the Terraform, Pulumi and Crossplane flows.
The token rotates through your IdP. Long-lived static keys are not accepted, and the scope cannot be expanded from inside the agent. Same wording on /methodology and the access-control grid on /security.
The agent reads the resource blocks the audit pass identified and writes the diff to the same .tf file. .tfvars and modules are read for context; everything else in the repo is outside the agent’s read scope.
The agent emits an HCL diff and opens a PR — nothing more. `terraform apply` is your CI’s job. The agent has no execution surface against your cloud; the policy gates on /methodology#policy-gates name the same posture.
Per-resource-type dictionaries for AWS, GCP and Azure.
Each rightsizing recommendation targets one resource family — instance_class, machine_type, node_count, SKU, DTU or NAT consolidation. The agent knows the safe attribute keys for each family from a per-cloud dictionary, so the diff is always against a recognised field.
Snippet registry on /security-and-compliance.
aws_db_instanceinstance_classRDS class rightsizingaws_instanceinstance_typeEC2 family graviton + x86aws_nat_gateway—Delete or consolidateaws_eks_node_groupinstance_type + autoscaling min/maxEKS node group rightsizing
google_container_cluster / google_container_node_poolmachine_type + node_countGKE node-pool shapesgoogle_sql_database_instancetierCloud SQL tiergoogle_compute_instancemachine_typeGCE familygoogle_compute_router_nat—NAT consolidation
azurerm_sql_databasesku + dtuAzure SQL DBazurerm_mssql_databaseskuAzure SQL managed instanceazurerm_virtual_machine / azurerm_linux_virtual_machinevm_sizeAzure VM familyazurerm_kubernetes_cluster_node_poolvm_size + node_countAKS node poolazurerm_nat_gateway—NAT consolidation across PIPs
The shape of the diff the agent opens against your repo.
These look like real PRs because they are — the same shape the agent opens against your repo, with placeholder IDs replaced for illustration. Thetallywyrm:-prefixed comments are part of the PR description, not a separate trail; reviewers see them in the same .tf file the diff edits.
aws_db_instance · db.r6g.4xlarge → db.r6g.2xlarge@@
resource "aws_db_instance" "orders_warehouse" {
engine = "postgres"
engine_version = "15.7"
allocated_storage = 500
- instance_class = "db.r6g.4xlarge"
+ instance_class = "db.r6g.2xlarge"
storage_type = "gp3"
iops = 12000
apply_immediately = true
+ # tallywyrm: baseline-week avg CPU 17.4 % (p95 22.1 %) across 2026-02-03 → 2026-02-09.
+ # tallywyrm: r6g.2xlarge carries the same workload — expected sustained 44.6 % p95,
+ # tallywyrm: well under the 80 % throttle threshold for the r6g family.
+ # tallywyrm: rollback by setting instance_class = "db.r6g.4xlarge" and re-applying.
}
google_container_node_pool · n2-standard-4 → n2-standard-2max_capacity retained at 4 for the Friday load-test burst window.@@
resource "google_container_node_pool" "primary_nodes" {
cluster = google_container_cluster.primary.name
location = "us-central1"
node_count = 3
- node_config {
- machine_type = "n2-standard-4"
- }
+ node_count = 2
+ node_config {
+ machine_type = "n2-standard-2"
+ }
+ # tallywyrm: baseline-week avg CPU 18.7 % (p95 26.3 %) across 2026-02-17 → 2026-02-23.
+ # tallywyrm: max_capacity retained at 4 for the Friday load-test burst window.
+ # tallywyrm: rollback by setting node_count = 3 and machine_type = "n2-standard-4".
}
The same row that opened the PR lands on /dashboard/savings.
The row that opens the PR in your repo carries the deploy timestamp, thebundle_sha256 and the measured cloud-bill delta. It appears on /dashboard/savings the same week, with the same PR diff and the same verified cents the page above prints. Finance reconciles against the same row; methodology backs the verification definition.
- Deploy timestamp + PR diff + bundle_sha256, on one row.The deploy timestamp attaches to the audit row the moment your CI applies the diff. The PR diff and the bundle_sha256 of the row bundle travel on the same row — the export that /dashboard/audit-trail and the weekly CSV produce is the byte-for-byte projection of this row order.
- Post-deploy measurement reads the same workload, same window.The same workload, in the same account, in the same cloud region, over the same time-of-week window. Verified_cents = re_read_bill_baseline − re_read_bill_post_change. Forecast and realized are surfaced separately so drift is visible at the same time.
Cross-checked on /methodology and /security/compliance.
Nothing on this page is a new attestation — it is a public mapping from the credential contract and the weekly export that /methodology and /security/compliance already publish. The audit row is the same artifact every reconciliation framework already asks for.
- Verified-savings definition: one PR, one deploy timestamp, one measurement window.
- Audit-row schema: who, what, when, IP, PR diff, deploy timestamp,
bundle_sha256, post-deploy measurement. - Drift detection: forecast and realized surfaced as separate lines on the same row, the credit reversed on the next invoice if the merged recommendation regresses.
- Five-framework matrix: SOC 2 Type II CC7.2, ISO 27001 Annex A.12.1.2, FedRAMP Moderate CM-3/CM-5, EU CSRD ESRS E1 §62–§66, SEC climate disclosure Scope 3 cat. 1.
- Sub-processor list: AWS, Cloudflare R2, Stripe, email proxy, session library — lifted verbatim from the per-framework page.
- Retention windows: 13 months minimum per workspace, configurable per workspace; bounds the same export on /privacy.
One signup. Broker the OIDC trust. The first scoped PR lands the same day.
Create a workspace, install the GitHub App or grant the GitLab project token, and the first diff lands as a PR the same day. Pay a percentage of verified savings against the same audit row finance already reconciles against.
Deep dive for /integrations → · playbook library on /blog → · PR loop on /how-it-works →.