Skip to content

feat(gcp)!: withdraw DiskAsyncReplication until the agent can resolve a reference at plan time - #172

Merged
naxty merged 1 commit into
mainfrom
naxty/dropDiskAsyncReplication
Aug 31, 2026
Merged

feat(gcp)!: withdraw DiskAsyncReplication until the agent can resolve a reference at plan time#172
naxty merged 1 commit into
mainfrom
naxty/dropDiskAsyncReplication

Conversation

@naxty

@naxty naxty commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Why

GCP::Compute::DiskAsyncReplication cannot pass conformance in any shape the plugin can take, and the reason is agent-side. It never shipped in a stable release (0.1.13-dev.1 / -dev.2 only), so withdrawing it costs no released surface, while keeping it costs a permanently red nightly on a defect that is not the plugin's to fix.

Its two properties are the disks the pair joins. Both are immutable, and both are declared as references to the disk resources, because that is how a forma names another resource:

primaryDisk = primary.res.selfLink
secondaryDisk = secondary.res.selfLink

An extracted forma writes such a reference unresolved, so the re-apply compares a $ref with no $value against the URL sitting in state, on a createOnly path, and plans a replacement of the pair already in place:

[Extract] Re-applying the extracted forma should be a zero-operation apply, but
the agent plans changes: delete plugin-sdk-test-disk-async-replication;
create plugin-sdk-test-disk-async-replication

The bind

run plugin shape CRUD discovery
33145336853 writeOnly, Read reports the pair ❌ extract
33154860464 createOnly only, Read reports the pair ❌ extract
33153366449 writeOnly, Read reports {} ✅ 8/8 ❌ discover
33155568420 writeOnly, Read reports nothing ✅ 8/8 ❌ discover

All four against formae main. Suppressing the comparison fixes the lifecycle and makes the pair undiscoverable — the agent validates required fields on a resource it persists, and a writeOnly field is never returned by a Read:

Validation of required fields failed error="resource projects/…/asyncReplication/… of type
GCP::Compute::DiskAsyncReplication is missing required fields: [primaryDisk secondaryDisk]"

Reporting the pair keeps discovery and brings the replacement back. CI runs both phases, so neither half is a green build.

What this PR does

  • Removes the provisioner, its unit tests, the schema module, the conformance case, the type constant and the README row.
  • Carries the formae_branch input for debug-conformance over from the work branch — independent of the type, and without it a debug run installs the released formae and cannot reproduce a nightly-only failure at all.

go build ./..., go test ./... (203 tests, 43 packages) and pkl eval formae-plugin.pkl all green.

Where the work went

Draft PR #166 on naxty/fixAsyncDisk keeps the provisioner, the schema, the test case and the full analysis, including the two agent-side asks. It re-adds the type when the agent side lands.

… a reference at plan time

The type cannot pass conformance in any shape the plugin can take. Its two
properties are the disks the pair joins - both immutable, and both declared as
references to the disk resources, because that is how a forma names another
resource. An extracted forma writes such a reference unresolved, so the
re-apply compares a reference against the URL in state, on an immutable path,
and plans a replacement of the pair already in place. Four runs against formae
main:

  33145336853  writeOnly, Read reports the pair      crud: extract FAILED
  33154860464  createOnly only, Read reports it      crud: extract FAILED
  33153366449  writeOnly, Read reports {}            crud 8/8, discovery FAILED
  33155568420  writeOnly, Read reports nothing       crud 8/8, discovery FAILED

Suppressing the comparison fixes the lifecycle and makes the pair
undiscoverable, because the agent validates required fields on a resource it
persists and a write-only field is never returned by a Read. Reporting the pair
keeps discovery and brings the replacement back. CI runs both phases, so
neither half is a green build.

It never shipped stable - 0.1.13-dev.1 and -dev.2 only - so withdrawing it costs
no released surface, and keeping it costs a red nightly on a defect that is not
the plugin's to fix. The provisioner, its schema, the test case and the analysis
stay on naxty/fixAsyncDisk as a draft PR, which re-adds the type when the agent
side lands.

Also carries the debug-conformance formae_branch input from that branch, which
is independent of the type: without it a debug run installs the released formae
and cannot reproduce a nightly-only failure at all.
@naxty
naxty merged commit 488c9fe into main Aug 31, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant