oci-extract: resolve operations and models from the HTTP surface, not Go names - #14
Merged
Merged
Conversation
…e, not Go names
P2.2-P2.4 were proven on vcn and subnet. Both live in core/network, so they
established that the pipeline is not resource-specific; they could not establish
that it is not service-specific. Measured against all 171 services of the pinned
SDK, it was. Four assumptions held for core/network and not for OCI:
1. An operation has a request object. IdentityClient.ListRegions(ctx) has none,
and therefore builds its wire call with common.MakeDefaultHTTPRequest rather
than request.HTTPRequest. It was dropped silently — 8047 of 8048 operations
resolved and nothing named the missing one.
2. The create verb is "Create" and the delete verb is "Delete". core.Instance
uses LaunchInstance/TerminateInstance; 570 of 1217 resources have no
Create<R>Details. The name lookup found nothing and emitted a config schema
with no required list and a create surface built from Update ∩ Read — a
schema that validates and is wrong.
3. A resource is addressed by one path parameter and it is its id.
objectstorage.Bucket is /n/{namespaceName}/b/{bucketName}: two, neither an
id. 323 of 1481 Get operations (21.8%), across 65 of 158 services, have a
count other than one, and nothing recorded them.
4. Models are structs. OCI declares 1014 models as interfaces (470 *Details or
*Base); those parsed as absent, giving the same silent empty create surface.
Resolution now derives the lifecycle structurally: read = GET readPath, create =
POST on readPath minus its trailing /{param}, update = PUT readPath else POST
readPath, delete = DELETE readPath, actions = POST under readPath/. Body models
come from the request struct's own contributesTo:"body" tag. One convention
survives as a fallback (Get<Resource>, only when no response models are given)
and the resolution records which route it took.
Silence became signal: -audit counts candidates separately from resolved and
exits 4; -schema/-policy report unresolved surfaces and exit 5, so oci.generate
cannot commit a schema whose create surface was never derived.
Verified on the real pinned SDK v65.121.0: 8048/8048 operations resolved, 0
missing method/path across 319 client files. Per service — core/network 271/271,
core/compute 129/129, identity 145/145, objectstorage 56/56, database 456/456,
dns 54/54.
vcn and subnet are unchanged: oci-extract -diff reports neither a breaking nor a
compatible change to their config schemas, and regression_test.go freezes their
field set, policies, state size and operations against a written-out expectation.
The bundles differ only by the additive path_params, hence the re-pinned
extracted_schema_hash and the rebuilt guest.
CI also now triggers on feature/** branches, which it did not before.
---
[signing-metadata]
key = cic-my-sign-key
signature = vault:v1:MEQCIGLo+rBakUqxWsKcaqtYS9eeXqgewbOPnhNu4xdh91MLAiBcKkd4R8M6ixoX1WgIrcxw7CFiD6khsarF3KwmcAV83w==
hash-algorithm = sha256
digest = M2tsElmF0suuGzMLzT8tx+dVYyCN60pUEReVVqcnwpM=
[certificate]
-----BEGIN CERTIFICATE-----
MIICBjCCAaygAwIBAgIUSnRMR6RPnEbg296XWPOqq/u5PCwwCgYIKoZIzj0EAwIw
QzELMAkGA1UEBhMCSFUxGTAXBgNVBAoMEENlbnRyYWxJbmZyYUNvcmUxGTAXBgNV
BAMMEENJQyBEZXZlbG9wZXIgQ0EwHhcNMjYwMzIwMTMyMjU5WhcNMjYxMjMxMTMy
MjU5WjBFMQswCQYDVQQGEwJIVTEZMBcGA1UECgwQQ2VudHJhbEluZnJhQ29yZTEb
MBkGA1UEAwwSR2Fib3IgWm9sdGFuIFNpbmtvMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEIG2CVmTfmLB9pLLclj7YmP2eedAjklpy4LGrU2ijoiy6Xqpuybv7OgJe
i+ez31s65NEV8+X/ByeX1cstR988z6N8MHowCQYDVR0TBAIwADAdBgNVHQ4EFgQU
yZN6AIX/TNnIJ9GwAa/NRN3ujHAwHwYDVR0jBBgwFoAUXn6CHYzPUqU4JVP8g+OS
WeDYjhcwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF
BQcDBDAKBggqhkjOPQQDAgNIADBFAiEA+bFzXRoJ4PCQbhAAtpkcMjt0vNj5rEW0
lOMBGDNyaWkCIB1vmM7PcZzv/c9bIrxF5kqv6QXomouhByUfeNUTbpKW
-----END CERTIFICATE-----
This was referenced Aug 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
P2.2-P2.4 were proven on
vcnandsubnet. Both live in core/network, so theyestablished that the pipeline is not resource-specific; they could not establish
that it is not service-specific. Measured against all 171 services of the pinned
SDK, it was.
The four assumptions that held for core/network and not for OCI
IdentityClient.ListRegions(ctx)has none and builds its wire call withcommon.MakeDefaultHTTPRequest. It was dropped silently: 8047 of 8048 resolved, and nothing named the missing oneCreate, the delete verb isDeletecore.InstanceusesLaunchInstance/TerminateInstance; 570 of 1217 resources have noCreate<R>Detailsobjectstorage.Bucketis/n/{namespaceName}/b/{bucketName}— two, neither an id. 323 of 1481Getoperations (21.8%), across 65 of 158 services*Details/*Base); those parsed as absentAssumption 2 is the dangerous one. The old code exited 0 with a valid draft-07
schema that had no
requiredlist, a create surface built from Update ∩ Read,and neither a create nor a delete operation in its map — a schema that validates
and is wrong.
What replaces them
Lifecycle is now derived structurally from the HTTP surface rather than from Go
identifiers:
Body models come from the request struct's own
contributesTo:"body"tag. Oneconvention survives as a fallback (
Get<Resource>, only when no response modelsare given), and the resolution records which route it took.
Silence became signal.
-auditcounts candidates separately from resolvedand exits 4;
-schema/-policyreport unresolved surfaces and exit 5, sooci.generatecannot commit a schema whose create surface was never derived.Verification
files of the pinned SDK v65.121.0
objectstorage 56/56, database 456/456, dns 54/54
vcnandsubnetare unchanged —oci-extract -diffreports neither abreaking nor a compatible change to their config schemas, and
regression_test.gofreezes their field set, policies, state size andoperations against a written-out expectation. The bundles differ only by the
additive
path_params5c1e035Scope limits — deliberate, not oversights
module/schemas/is stillvcn+subnet.The full sweep is a separate job
Create<R>Detailsis an interface now report and exit 5 rather than emittingan empty create surface. Expanding them is discriminator semantics — a
modelling decision, not extraction
laying it over an incomplete mechanical surface would make it impossible to
separate what came from the API from what we assumed
Review
Orchestrator review with independent re-verification, and an explicit list of
what was not re-verified, is in the cic-factory repo at
jobs/oci-extract-generalize/review.md.