Skip to content

fix(ladder): on-demand baseline dollars are bought 1:1 as commitment dollars (over-buys by 1/(1-discount)) once the executor ships #349

Open

Description

@cristim

Found by the go#282 planner (plan: ~/.claude/projects/cloud-commitments-go/plans/go-282-ladder-residual-baseline.md).

The ladder sizes commitments from an on-demand-priced baseline series (uncovered on-demand EC2 dollars per hour). Allocate buys that many commitment dollars 1:1. A Savings Plan or RI hourly commitment is stated in discounted dollars, so covering X on-demand dollars per hour needs about X * (1 - discount) commitment dollars per hour. Buying X commitment dollars over-buys by roughly 1 / (1 - discount) (for a 30% discount, about 43% too much commitment).

Today the executor is disabled so no money has moved (platform#118 / #70 track the executor). This must be fixed before any executor ships: convert on-demand baseline to commitment dollars using the offering/commitment rate (per layer: Compute SP, EC2 Instance SP, Convertible RI), fail loud when the rate is unknown, never default to 1:1.

Related: go#282 (residual baseline subtracts existing commitment again; under-buy side), platform#118, platform#70.

Activity

  1. cristim commented on Oct 15, 2026

    @cristim
    MemberAuthor

    PR #404 adds the provider boundary for measured regional EC2 Instance SP rates, reusing the calculation from #352 and the allocation contract from #353. The purchase precision change is already merged in #403.

    This leaves #349 open. Compute sizing still needs a supported workload-matching policy; neither an account blend nor an EC2 proxy is selected implicitly. The remaining integration also needs the residual-baseline and existing-exposure normalization work in #282, followed by a coherent platform pin update with immutable NUMERIC tranche rates, stored-rate in-flight netting and consistent OD/commitment displays.

    The automatic execution continuation is tracked in LeanerCloud/cloud-commitments-platform#118 and LeanerCloud/cloud-commitments-platform#70. It still needs the due-tranche callback and task wiring, reusing the claim locks, grants, retry protection, execution rechecks and visibility components that have already landed. Enablement stays a separate owner decision after the full chain is verified.

  2. cristim commented on Oct 15, 2026

    @cristim
    MemberAuthor

    The scoped EC2 rate-capability leaf is merged through #404 and its separate packaging correction #405. Main commit: 9511dcfbdcb1aa9eac8081b54b6a648434580496.

    Verification on the merged revision:

    • Both postmerge workflows passed: build/test 38703740925 and pre-commit 38703740924.
    • Fresh published-main consumer proof passed. Starting with only AWS v0.0.0-20261015081001-9511dcfbdcb1, normal dependency resolution selects the shared optional interface. Build and fresh race tests passed without replacements or workspace overrides, exercising SDK request/response fixtures, filtering, pagination, missing and malformed data, Compute Holds, commitment sizing and stored-rate replay.
    • Independent exact-revision reviews and the dependency finding's fail-before/pass-after evidence are recorded on both PRs. Final CodeRabbit review was rate limited; its existing finding was fixed and verified. Both merges used the repository's documented independent-review waiver and normal server protections.

    These are constructed local SDK transport responses, not live AWS billing acceptance. No purchase, deployment or execution enablement occurred.

    #349 remains open. The next prerequisite is #282's total OD baseline and existing-exposure normalization using actual scoped observations. The remaining program also includes the matching-workload/Compute policy decision, compatible platform module adoption, immutable tranche-rate persistence and c/r netting, and due-tranche executor/task continuation. Missing rates still Hold; that does not complete automatic ladder execution. Flags and schedulers stay off. Retrospective CodeRabbit review for #404/#405 remains tracked here when review quota becomes available.

  3. cristim commented on Oct 15, 2026

    @cristim
    MemberAuthor

    Merged #413 normally as 8b27158582fe0034c1b0800522579d9f7fde785e.

    Fresh published-main verification passed on macOS Go1.26.9: a new external module initially required only AWS v0.0.0-20261015103505-8b27158582fe; normal module resolution selected shared v0.0.0-20261015071854-5b254484d5e4, without a replacement, workspace or explicit initial shared pin. The unchanged independently reviewed public-factory and direct collector consumers passed a fresh race run. All 47 published AWS production/module files match exact merged main; the AWS/shared source equals reviewed 1bf6d0e. SDK responses remain constructed loopback fixtures, not live billing observations.

    Post-merge status is not all green: pre-commit passed, but main CI failed its unit job with the recurring HTTP 200 body-read socket error, this time in TestScopedBaselineParentCompatible/lag2. #414 is active main-CI repair. Retries stopped; connection-lifetime instrumentation is being reviewed. The closing actor remains unknown, and cleanup is held.

    This merged leaf supplies scoped DAILY residual observations, not reconstructed total demand. Historical E/k units and cohort rates, total-demand observations, persisted tranche rates, compatible platform pin/in-flight accounting and executor adoption remain open under #282 and #349. No real purchases, deployments or runtime enablement were performed.

    Follow-up issues filed: #414 for the observed recurring Linux fixture failure. The remaining ladder work stays explicitly tracked by #282 and #349; neither parent issue is complete.

  4. cristim commented on Oct 17, 2026

    @cristim
    MemberAuthor

    Decision needed (one line): which workload-matching policy sizes Compute SP commitment rates: a per-family proxy, an account blend, or fail loud until a rate is supplied? Merged so far: #403, #404, #405, #413; #282 is in flight as #441. Safe default: fail loud when no rate is known, never 1:1. Marking status/needs-info.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions