Skip to content

extdeps: cited pricing surfaces (GitHub Actions, Hetzner, AWS EC2, Ubicloud) - #6977

Merged
briansrls merged 15 commits into
mainfrom
session/snappy-raven-217
Jul 21, 2026
Merged

briansrls merged 15 commits into
mainfrom
session/snappy-raven-217

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Model four vendor price lists as cited extdeps authorities under dag/extdeps/pricing/:

  • GitHub Actions — per-minute hosted-runner rates from the official billing reference
  • Hetzner dedicated — AX-line monthly EUR prices from docs.hetzner.com GE-D9256 (hardware cross-checked against robot.hetzner.com)
  • AWS EC2 — on-demand m7a hourly USD prices for us-east-1 from the live Price List API
  • Ubicloud — per-minute managed-runner rates from ubicloud.com/docs/about/pricing

Shared carriers in extdeps.pricing.types: MoneyPerMinute, MoneyPerHour, MoneyPerMonth on std.measure micro-units with currency in the type. Billing unit is part of the fact; cross-vendor per-hour equivalents are derived at read time, never stored on catalog rows.

Witness pricing_surface_witness_holds derives GitHub 2-vCPU per-hour from per-minute and compares against AWS m7a.large on-demand, with a RED control on a deliberately-wrong per-minute fixture.

Test plan

  • cargo run --bin claim_batch -- --source-root dag --source-root src/v2 --entry dag/test/claim/pricing_surface_witness_test.dag --function pricing_surface_witness_holds — PASS

@gunbai-bot gunbai-bot Bot changed the title extdeps pricing surfaces: GitHub Actions per-minute + Hetzner dedicated + AWS EC2 + Ubicloud runners as cited price-list authorities (live-fetched, dated, zero fabrication; money on std.measure carriers per the M12 unit hard-block; umbrella ratios DERIVED never stored). FULL BRIEF via dashboard-mess extdeps: cited pricing surfaces (GitHub Actions, Hetzner, AWS EC2, Ubicloud) Jul 21, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review July 21, 2026 06:12
@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 40621 in 3799e912:

1. Money-rate carriers → std.measure (valid)
Moved MoneyPerMinute, MoneyPerHour, MoneyPerMonth, accessors, and per_hour_equivalent_from_* projections into dag/std/measure.dag. Deleted dag/extdeps/pricing/types.dag. All four vendor modules now import rate carriers from std.

2. hours_per_billing_month: Nat = 730 → typed duration (valid)
Replaced bare Nat with billing_month_as_hours: Hour = hour(count: 730) (Hour = Measure<Time, One, Nat>). per_hour_equivalent_from_per_month divides by hour_count(h: billing_month_as_hours).

3. pricing_citation parallel representation (valid)
Citations now carry document locator only (e.g. GE-D9256#AX41-1-LTD, actions-runner-pricing#actions_linux, ec2-price-list-api#us-east-1/m7a.large) — no restated amounts/units. Structured fields remain the single authority for price facts; provenance notes retain fetch date/URL.

Witness pricing_surface_witness_holds still green after refactor.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 40625 in 9f957d0:

1. seconds_per_minute() as minutes-per-hour proxy (valid)
Added minutes_per_hour() -> Nat in std.measure and per_hour_equivalent_from_per_minute now multiplies by that — same constant, correct concept name.

2. Duplicate Hetzner currency field (valid)
Dropped row-level currency: CurrencyCode from HetznerDedicatedServerPriceRow. setup_fee is now MoneyOnce { amount, currency } (parallel shape to MoneyPerMonth); monthly currency remains on monthly.currency only.

Witness still green.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 40632: UbicloudRunnerPriceRow now holds catalog: UbicloudRunnerCatalogRow (imported from extdeps.cloud.ubicloud) plus tier, per_minute, and pricing_citation only — hardware literals removed from the pricing module. Witness still green.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 40639 non-blocking findings in cc57f81:

  1. cpu_description — kept as cited-boundary NonEmptyStr at current catalog size; added dissolve_on_cpu_description_string_leaf in hetzner_dedicated.dag with trigger to decompose into extdeps.cpu CpuModelCatalogRow when rows grow beyond price-only facts.

  2. hetzner-cloud anemic money carrier — full MoneyPerHour/MoneyPerMonth migration left out of scope (pre-existing catalog, not part of this cited-surface PR); added dissolve_on_anemic_money_rate_carrier in extdeps/cloud/hetzner.dag marking the MoneyAmountMicro + separate currency fork for migration on next hetzner-cloud touch.

Witness pricing_surface_witness_holds green on cc57f81.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40645 on HEAD cc57f8119c — no code changes required.

All approve points match current tree: MoneyRate<P> in std.measure, typed rate carriers across pricing modules, derived hourly equivalence (not stored), witness with RED control, and dissolve_on_* rows for hetzner-cloud anemic rates and cpu_description.

Integer division observation: confirmed. per_hour_equivalent_from_per_month uses Nat floor division on micro-denominated amounts (e.g. 57300000/730 → 78493). Intentional at micro-USD/EUR precision — sub-micro remainder is immaterial for cross-vendor comparison at cited catalog granularity. Witness is self-consistent: pricing_surface_witness_test.dag asserts money_per_hour_micros(q: derived) == 57300000 / hour_count(h: billing_month_as_hours), the same expression.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 40654 (REQUEST_CHANGES) in 97d93dac32.

Root cause: stage0 Measure-alias emitter collapses type Hour = Measure<Time, One, Nat> to a zero-param alias while fn/data return sites still reference Hour<Time, One, Nat> — E0107. Not stale regen; MoneyRate<P> instantiations emit correctly (generic struct path, same as MoneyAmount<S>).

Fix: removed Hour alias; replaced with billing_month_as_hour_count() -> Nat using the fn shape (minutes_per_hour() precedent — data ... : Nat also mis-emits as Nat<Magnitude>). billing_month_as_hour_count_representation_note documents dissolve-on trigger. Regen --verify clean; witness green.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40665 on HEAD 97d93dac32 — no code changes required.

Approve points match current tree: MoneyRate<P> carriers + representation note in std.measure, cited pricing rows with ExternalAuthority anchors, stage0 std_currency.rs registered, witness with RED control (wrong_github_2core_per_minute_fixture), and dissolve_on_anemic_money_rate_carrier / dissolve_on_cpu_description_string_leaf scaffolds for known debt. Hour-alias emitter workaround (billing_month_as_hour_count() -> Nat + representation note) landed in same commit; regen --verify clean.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40666 on HEAD 97d93dac32 — no code changes required.

All approve points confirmed: MoneyRate<P> phantom carrier, dissolve_on_anemic_money_rate_carrier and dissolve_on_cpu_description_string_leaf scaffolds, billing_month_as_hour_count_representation_note for the Nat-divisor emitter workaround, and RED control witness_wrong_github_per_minute_red_control.

Cross-currency observation: agreed and safe at current catalog shape — witness cross-vendor micro comparisons (witness_github_2core_per_hour_exceeds_aws_m7a_large_on_demand, Ubicloud vs GitHub) are USD↔USD only; Hetzner EUR rows exercise same-currency derivations (witness_hetzner_ax41_monthly_matches_cited_price, witness_hetzner_ax41_hourly_equivalent_derived) with no EUR amount compared against USD micros. A currency-checked normalizer is correctly deferred until a witness actually crosses currencies.

— sent from snappy-raven-217

briansrls and others added 11 commits July 21, 2026 10:56
…yntax

Wire explicit imports in the cross-vendor witness test and fix the
single-variant enum declaration so claim_batch resolves cleanly.

Co-authored-by: Cursor <cursoragent@cursor.com>
…rency

Use minutes_per_hour() (not seconds_per_minute()) in per-hour derivation
from per-minute rates. Replace row-level currency on HetznerDedicatedServerPriceRow
with MoneyOnce setup_fee carrier so currency has a single authority per fact.

Co-authored-by: Cursor <cursoragent@cursor.com>
Drop duplicated hardware fields from pricing rows; each
UbicloudRunnerPriceRow now carries catalog + tier + per_minute + citation.

Co-authored-by: Cursor <cursoragent@cursor.com>
Billing period is a type argument (PerMinute|PerHour|PerMonth|Once phantom markers), not four structurally-identical records — preserves wrong-unit unwritability while matching §2 horizontal precedent.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls
briansrls force-pushed the session/snappy-raven-217 branch from 97d93da to 647c72a Compare July 21, 2026 11:01
@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40678 on HEAD 647c72a49e (post-rebase on main) — no code changes required.

Approve points match current tree: cited extdeps/pricing/ rows on MoneyRate<P> carriers, stage0 std_currency emission, domain catalog wiring (ubicloud/cloud/toolchain), tracked scaffolds (dissolve_on_anemic_money_rate_carrier, dissolve_on_cpu_description_string_leaf, billing_month_as_hour_count_representation_note), and witness with RED control. Rebase conflict in hetzner.dag resolved by keeping main's import-strip shape plus our dissolve marker.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40680 on HEAD 647c72a49e — no code changes required.

All approve points confirmed: MoneyRate<P> as §2-horizontal carrier, period-typed money fields with explicit CurrencyCode, dissolve_on_* scaffolds on hetzner-cloud anemic rates and cpu_description, billing_month_as_hour_count_representation_note for the Nat-divisor emitter workaround, witness RED control, and per-row cited authorities.

— sent from snappy-raven-217

briansrls and others added 2 commits July 21, 2026 12:08
pricing_surface_witness_holds passed before kill; failure matches main-branch OOM pattern (claim_executor SIGKILL at ~36GiB RSS), not a PR logic defect.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Investigated CI failure on ebbde8d (review follow-up): not a PR logic defect.

  • Failure mode: claim_executor SIGKILL exit 137 during witness corpus (~36GiB RSS at compile.frontend) — runner OOM, not a failing witness.
  • pricing_surface_witness_holds passed at 13:01:42 UTC before the kill.
  • Same pattern on main (29829512709 also exit 137) — infra/memory pressure, not introduced by pricing rows.
  • Pushed empty retrigger commit; no .dag/stage0 changes warranted.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the approval (review 40742).

Minor nit (UbicloudRunnerPricingTier.StandardX64): Already addressed on current HEAD (e20b68e16f) — the unused variant was trimmed; UbicloudRunnerPricingTier is now PremiumX64 | Arm64 only. The provenance note still records vendor deprecation of the standard tier.

No further code changes from this feedback.

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40744 on HEAD e20b68e16f — no code changes required.

All approve points confirmed on current tree:

  • Pricing modules use std.measure carriers (MoneyPerMinute/MoneyPerHour/MoneyPerMonth/MoneyOnce, etc.), not flat unit scalars
  • MoneyRate<P> horizontal carrier + billing_month_as_hour_count representation note in dag/std/measure.dag
  • Ubicloud pricing projects from extdeps.cloud.ubicloud catalog rows
  • Hetzner cloud dissolve_on_anemic_money_rate_carrier marker present
  • Witness exercises derived cross-vendor comparisons with RED control (witness_wrong_github_per_minute_red_control)
  • Rust delta is stage0 emission (std_currency.rs, std_measure.rs) only

Only delta since review SHA a93cc27b: StandardX64 enum variant trimmed (review 40742 nit, already noted).

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40752 on HEAD e20b68e16f — no code changes required.

All approve points confirmed:

  • Pricing surfaces route through std.measure carriers; MoneyRate<P> parameterizes billing period (unit-modeling hard-block satisfied)
  • Tracked dissolve_on_* markers with concrete triggers: hetzner_dedicated.dag cpu_description, hetzner.dag cloud-row migration, measure.dag billing_month_as_hour_count Nat divisor + stage0 representation note
  • Ubicloud pricing consumes extdeps.cloud.ubicloud catalog rows (no hardware re-statement)
  • Witness includes RED control (wrong_github_2core_per_minute_fixture) and cross-vendor derived comparisons

— sent from snappy-raven-217

@gunbai-bot

gunbai-bot Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 40755 on HEAD e20b68e16f — no code changes required.

All approve points confirmed:

  • MoneyRate<P> carriers from std.measure (no bare unit-scalar fields)
  • Cited extdeps authorities with provenance notes
  • Ubicloud pricing consumes extdeps.cloud.ubicloud catalog rows
  • Witness executes cross-vendor comparisons with RED control
  • Hetzner cloud anemic money fields carry named dissolve_on_anemic_money_rate_carrier marker
  • Stage0 Rust (std_currency.rs, std_measure.rs) generated from .dag, not hand-expanded

— sent from snappy-raven-217

@briansrls
briansrls merged commit 21276b6 into main Jul 21, 2026
3 checks passed
@briansrls
briansrls deleted the session/snappy-raven-217 branch July 21, 2026 17:55
gunbai-bot Bot pushed a commit that referenced this pull request Jul 21, 2026
Branch was behind main on cited pricing surfaces and register-site
carriers; extdeps_external_authority_gate_passes failed Bool(false) on
ce96b65. PR contribution unchanged: 3-file .dag strip.
briansrls pushed a commit that referenced this pull request Jul 23, 2026
…cursion_limit into partition allow-block (both drift-by-hand-roster incidents; enrolled in roster_registry)

Rebased onto post-#7114 main (rust_crate_partition rewritten around the
CompilationUnit model): the hand roster fns survived, so the fix re-applies
as the same one-line roster row + allow-block edit; module-dag edge rows
are cross-unit only, and std_measure -> std_currency is intra-unit
(std-primitives), so no edge row is owed. Full regen chain re-run on the
new base (main_wet + two-generation regen_stage0, binaries rebuilt).

Original finding unchanged: v1-stage0-std-core broken standalone since
#6977 added the measure->currency closure edge (hand module roster never
learned); v1-stage0-extdeps-languages failed serde json_internal recursion
(allow-block lacked the monolith's recursion_limit). Nothing in CI builds
the partition crate libs, so both drifted silently. Class enrolled:
stage0_partition_crate_rows in gunbc.roster_registry as DeclaredFrontier
(dissolve_on: the emitted-crate-partition thread derives membership
ByDerivation; interim backstop = per-crate cargo-check consumer in CI).
Sheet rows: ts-group-partition-drift + ts-group-dissolve-typed.

By execution on the rebased base: all 8 partition crates build green;
roster_registry suite 5/5 (RED controls discriminate);
stage0_crate_layout_witnesses PASS; roadmap_authority_witnesses true;
ROADMAP.md regenerated (main_wet, ExitSuccess).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg
briansrls added a commit that referenced this pull request Jul 23, 2026
…cursion_limit into partition allow-block (both drift-by-hand-roster incidents; enrolled in roster_registry) (#7109)

Rebased onto post-#7114 main (rust_crate_partition rewritten around the
CompilationUnit model): the hand roster fns survived, so the fix re-applies
as the same one-line roster row + allow-block edit; module-dag edge rows
are cross-unit only, and std_measure -> std_currency is intra-unit
(std-primitives), so no edge row is owed. Full regen chain re-run on the
new base (main_wet + two-generation regen_stage0, binaries rebuilt).

Original finding unchanged: v1-stage0-std-core broken standalone since
#6977 added the measure->currency closure edge (hand module roster never
learned); v1-stage0-extdeps-languages failed serde json_internal recursion
(allow-block lacked the monolith's recursion_limit). Nothing in CI builds
the partition crate libs, so both drifted silently. Class enrolled:
stage0_partition_crate_rows in gunbc.roster_registry as DeclaredFrontier
(dissolve_on: the emitted-crate-partition thread derives membership
ByDerivation; interim backstop = per-crate cargo-check consumer in CI).
Sheet rows: ts-group-partition-drift + ts-group-dissolve-typed.

By execution on the rebased base: all 8 partition crates build green;
roster_registry suite 5/5 (RED controls discriminate);
stage0_crate_layout_witnesses PASS; roadmap_authority_witnesses true;
ROADMAP.md regenerated (main_wet, ExitSuccess).


Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

Co-authored-by: Claude <noreply@anthropic.com>
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