Skip to content

Feature/provider dev - #1

Merged
jeffreyaven merged 24 commits into
mainfrom
feature/provider-dev
Oct 5, 2026
Merged

jeffreyaven merged 24 commits into
mainfrom
feature/provider-dev

Conversation

@jeffreyaven

Copy link
Copy Markdown
Contributor

No description provided.

jeffreyaven and others added 24 commits July 12, 2026 15:19
Repository layout per CLAUDE.md: bin/ wrappers (k8s feature/provider-dev
pattern), provider-dev pipeline directories, package.json on
@stackql/provider-utils 0.7.6 (latest), .npmrc for the JSR-scoped
dependency, README with the tier model and auth follow-ups, and the
any-sdk oci_signing_v1 issue contract copied to provider-dev/config.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The auth type has not landed upstream in any-sdk (no branch, tag, or
commit; released binaries lack the type string) and no OCI credentials
exist on this machine. NOTES.md records the evidence, the unblock list,
and the live-tenancy verification runbook to execute unchanged once a
build with oci_signing_v1 and Always Free credentials are available.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
harvest_catalog.mjs builds spec_catalog.csv from the API reference index
(specs/index.json - content-addressed spec URLs whose basename is the
SHA-256 pin): 20 tier-1 specs mapped to StackQL services, 137 tier-2
entries deferred with reasons. Host templates are derived from the
commercial-realm endpoint lists ({region} label), and the version-date
segment is recorded with its location (basePath for most, path for kms,
none for object storage).

fetch-specs.sh downloads tier-1 snapshots and verifies each against its
pin. clean_specs.mjs applies deterministic fixes (x-obmcs-* top-level
extension strips), converts Swagger 2.0 -> OAS 3.0, validates with
swagger-parser, and writes cleaned specs plus spec_clean_report.json.
All 20 specs validate: 1583 operations total, zero converter patches.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
opc-next-page is expressible in pagination config (responseToken
location: header) but any-sdk hardwires the Link rel=next regex for
every header key, so bare-token headers silently end traversal after
page 1. NOTES.md records the evidence with file/line citations, the
drafted any-sdk ticket (raw header value when not Link-framed, plus the
[]string vs http.Header inconsistency), and the interim first-page
posture. Response headers are not projectable into result rows, so
opc-work-request-id follows the body-projection posture; recorded in
the same mechanism family.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
build_inventory.mjs classifies all 1583 tier-1 operations via the shared
lib/classify.mjs rules (operationId-led with path context) and the
tag-driven core split (lib/core_split.mjs: virtualNetwork -> network,
compute/computeManagement -> compute, blockstorage -> block_storage).
endpoint_inventory.csv records routing facts (host template, version
date), scope facts (compartmentId 248, page param 317, work-request
header 404), response shapes (277 bare arrays; ListObjects-style
envelopes recorded as object), and the proposed mapping per operation:
636 select / 362 exec / 190 update / 182 insert / 174 delete / 39
reason-coded skips (per-vault KMS endpoints, data planes, HEAD ops)
over 452 resources.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
23 services decided from the endpoint inventory. Deviation from the
candidate list, with reason: kms/vault/secrets stay three services
because the three vendor specs route to three host templates
(kms.{region} / vaults.{region} / secrets.vaults.{region}) and a
service carries one server template. Core iaas divides by operation
tag per lib/core_split.mjs. CLAUDE.md candidate list updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
split.mjs consumes the cleaned OAS3 specs catalog-driven (core iaas
divides by tag; --only for pilot scope); npm scripts invoke the node
wrappers directly per the toolchain rules. map_operations.mjs fills the
stackql_* columns in all_services.csv via the shared classifier, with
object keys mirroring provider-utils normalize wrapper-key derivation
for bare arrays and array-property resolution for envelopes (ListObjects
-> $.objects, ListObjectVersions -> $.items). Validation: completeness
against the split specs, unique method names per resource, unique
required-param signatures per overloaded verb - all green: 471 mapped
operations over 138 resources (identity 46, network 71, object_storage
21), 3 reason-coded skips. One genuine collision found and resolved
deterministically: GetCompartment shares its required-param signature
(compartmentId) with ListCompartments, so it demotes to exec.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
NOTES.md sections 4-10: {region} routing (dot-free label, jira
precedent transfers; shared iaas host disambiguated by version-date
base paths), version-date placement (basePath / path / none, recorded
per spec), PUT update-details partial semantics (incl the object
storage POST-update deviation), bare-array wrapping mirrored between
map_operations and normalize with envelope exceptions recorded, the
GetCompartment select-overload demotion, the Always Free smoke design,
the tier-2 mechanical-addition process, and the open-items list.
README steps 0-2 now document the working pipeline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tion

- split all 22 tier-1 services (core iaas divides by tag), normalize
- map 1,544 operations over 452 resources (37 skipped with reason codes)
- generate provider with auth type only (oci_signing_v1 per any-sdk
  v0.5.4-alpha01 - credentials come from the runtime auth context)
- method-level requestBodyTranslate: naive on POST/PUT/PATCH bodies
- post_process.mjs: catalog-driven per-service regional servers with
  {region} defaulting to us-ashburn-1 and resolving from OCI_CLI_REGION
  via x-stackQL-envVar; service-level opc-next-page header pagination
  with a method override for object storage ListObjects
  (start/nextStartWith)
- bump @stackql/provider-utils to 0.7.7

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- method-level queryParamPushdown.top on every operation declaring a
  `limit` query parameter (313 methods), maxValue from the declared
  schema maximum (1000 when silent) - SQL LIMIT pushes to the wire
- queryParamPushdown.select on operations with an enumerated `fields`
  query parameter (object storage x3) - SQL projection pushes to
  `fields`, allowlist from the spec enum, inert unless fully covered
- filter/orderBy pushdown not emitted: the any-sdk rendering engine is
  OData-syntax-only and OCI does not speak OData; WHERE pushdown stays
  ordinary query-parameter mapping (recorded in NOTES)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- provider.yaml config.snake_case_aliases: true - SELECT/DESCRIBE column
  names present as snake_case aliases of the camelCase wire properties
- request.nativeCasing: camel on every method - snake_case WHERE and
  INSERT keys resolve against the camelCase wire parameters and body
  attributes (any-sdk reverse-casing lookup); wire casing untouched
- SHOW METHODS RequiredParams remain wire-cased (engine presentation,
  same as the aws provider); both casings resolve in queries

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- tests/integration/mock_oci_server.mjs: zero-dependency mock enforcing
  the oci_signing_v1 contract (three-header GET/DELETE, six-header
  POST/PUT with x-content-sha256 digest verification), serving real
  wire shapes: bare arrays, compartmentId scoping, two-page
  opc-next-page traversal, ListObjects nextStartWith envelope
- tests/integration/run_integration_tests.mjs: materialises a registry
  copy with servers rewritten to the mock (fixed-domain templates are
  not redirectable at query time - jira finding), throwaway RSA key,
  STACKQL_OCI_TESTING_* namespaced env; 12-case matrix
- results with the local any-sdk v0.5.4-alpha01 build: 24 pass, 0 fail,
  2 documented warns (bare-header-token pagination stops after page 1 -
  NOTES #2 engine gap; fields projection pushdown blocked by the
  WHERE-column union - new NOTES item)
- select pushdown supportedColumns now carry snake aliases alongside
  wire names; exec vars resolve by wire name only (documented)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- docgen: headerContent1/2 (OCI_CLI_* auth variants, compartment scope
  pattern, estate + IAM audit + provisioning + four-hyperscaler union
  examples); generate-docs wrapper; website/docs generated (22 services,
  474 resource pages) and MDX-sanitized
- website: Docusaurus 3.10.2 microsite on the vendored shared-config
  pattern (openai template): thin config wrappers, registry-branded
  logos, CNAME oci-provider.stackql.io, GH Pages deploy workflows;
  yarn.lock to follow after first install completes
- tests/smoke_test.py: live smoke suite (stdlib only) - reads across
  identity/network/compute/object storage, Always Free write lifecycle
  (VCN, subnet, bucket, VM.Standard.E2.1.Micro with capacity
  degradation), stackql-smoke tagging with pre-run sweep, --live flag
  targets the published provider for post-publish verification
- Makefile: full pipeline (specs -> build -> tests -> docs), make all;
  STACKQL_BIN variable for the local engine build
- examples/stackql-deploy/oci-networking: manifest + VCN/subnet/bucket
  iql resources with exports chaining and env-keyed CIDRs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…and casing notes

- NOTES: oci_signing_v1 verified against the signed mock (v0.5.4-alpha01);
  pagination re-verified (bare header tokens still gated, body tokens
  work); new sections 11-13 (pushdown facts, snake_case surface, naive
  body translate + exec body quirk); open items refreshed with the
  release gate
- CLAUDE/README: env var convention moved to the OCI CLI names
  (OCI_CLI_TENANCY etc), auth type only in the provider doc, region via
  OCI_CLI_REGION x-stackQL-envVar, Makefile-first test layers, smoke
  deviation note (stdlib over pystackql, with reason)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Terraform never read OCI_CLI_* (it reads TF_VAR_*/OCI_*) and CLI-configured
users are served by the ~/.oci/config variant, so the CLI-name coupling
bought nothing. OCI_FINGERPRINT and OCI_REGION coincide with Terraform's
accepted bare names. Docs now state the config-file zero---auth path
(type-only doc auth block becomes the default auth context); doc-level
raw env-var defaults recorded as an engine follow-up (NOTES open item 3).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… exec demotion

Live run: GETs authenticated, every signed POST 401'd. any-sdk builds
path?query even when the query is empty; OCI normalises the request
line before verifying, so the signature over 'post /path?' never
matches. Fixed on any-sdk branch fix/empty-query-request-target;
mock now rejects dangling ? and enforces concrete content-length,
content-type on body verbs. GetNamespace (bare-string response)
demoted to exec - scalar responses cannot project as SELECT rows;
smoke discovers the namespace via the exec method. Instance
lifecycle extended to the full state walk (stop/start/rename with
SELECT verification at each state).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces the exec demotion: namespaces stays a SELECT. post_process
injects transform (golang_template_text_v0.1.0 regex lift of the bare
JSON string into a {namespace} row), schema_override (documented by
provider-utils 0.7.7 docgen - the docs now show a real namespace
column), and overrideMediaType (required to activate the engine's
transform path). Integration scenario 13 exercises it against the
mock; verified live (namespace resolves through the template).
Smoke exec power actions now pass the required actionType body attr;
Makefile smoke targets stream with python3 -u.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
InstanceAction's optional InstancePowerActionDetails body only admits
reset-family actionType discriminators; plain STOP/START must send no
body, but the engine's exec surface forces every required body attr
whenever a requestBody or request block is declared. post_process
OPTIONAL_BODY_DROPS strips the body, requestBodyTranslate config and
request block from compute.instances.instance_action; integration
scenario 10 asserts the empty body on the wire (26 checks green).

provider.yaml now ships doc-level env var defaults (tenancy_ocid_envvar
etc., any-sdk fix/empty-query-request-target branch) - zero --auth for
a populated OCI_* environment once stackql wires the doc-level getters
onto the runtime AuthCtx; inert and harmless before that.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…RLs resolve

The shared docusaurus-config sets trailingSlash: false, which makes Docusaurus emit
<route>.html; GitHub Pages then returns 404 for the same URL with a trailing slash.
Dropping the setting restores <route>/index.html, which is served for both forms.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@jeffreyaven jeffreyaven self-assigned this Oct 5, 2026
@jeffreyaven
jeffreyaven merged commit a70c24f into main Oct 5, 2026
1 check 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