Skip to content

Cited ARM Linux CI-seller census (extdeps per seller) - #11232

Merged
gunbai-bot[bot] merged 25 commits into
mainfrom
session/sharp-pike-359
Sep 14, 2026
Merged

gunbai-bot[bot] merged 25 commits into
mainfrom
session/sharp-pike-359

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • One extdeps.ci_runner.* module per independently versioned CI seller, inhabiting SellerArmLinuxOffer (shapes, silicon standing, capacity channel, list price, snapshot). Existing sellers (Blacksmith, Depot, WarpBuild, CircleCI, GitHub Actions, Ubicloud) gained the same offer row from a 2026-09-13 catalog re-read.
  • New modules: Namespace, BuildJet (shutdown), RunsOn, Actuated, Cirrus Runners, Buildkite, GitLab, AWS CodeBuild, Sprinters, Semaphore, Google Cloud Build. Mac/Apple-silicon sellers are one excluded-by-scope sentence; Hetzner is named as ARM supply, not a CI seller.
  • Wholesale join lives in gunbc.arm_ci_seller_census (cloud_arm_reseller_offers / customer_account_cloud_arm_offers), not in the generic hub. Witnesses assert declared scope, that every Aarch64 shape row has a cited label, and a discriminating RED fixture for an uncited Aarch64 label.
  • DESIGN §3c later-consumer is a FrontierRow enrolled on gunbc.census_closure_frontier (arm_ci_seller_census_later_consumer_frontier_rows), not a prose claim. Named consumer: strategy.ci_compute_offer_catalog (gunbc-private TL-14, TL-15: Multi-target transport config emit + substrate cleanup #113; Refactor provider implementations into separate modules #88 is closed and superseded) and strategy.node_rental SupplierHypothesis. Trigger: that catalog or hypothesis imports surveyed_arm_linux_offers / cloud_arm_reseller_offers from public origin/main. Dissolution is unbound because those private modules are not DeclarationRefs in this tree.
  • AccountCredit.issuer is DeclarationRef (CircleCI passes circleci_provider_identity); credit identity is namespace-tree equality, not a module-path string.
  • The regenerated std_measure.rs mirror is admitted under gunbc.v1_maintenance_standing v1_seed_standing as a mechanical consequence of the std.measure change; that seed shrinks when the first finding lands.

GitHub mergeability

Live GitHub briefly reported mergeable: false during a prior disposition (a recompute). Treat a transient UNKNOWN / DIRTY the same way: re-read after the required run completes rather than treating that snapshot as a merge-block.

Test plan

  • CI floor / witnesses lane on this PR
  • test.claim.arm_ci_seller_census_witness green, including census-closure enrollment of the later-consumer row and CircleCI issuer declaration_ref_eq
  • After this lands on public main, eager-bee-525 private #113 strategy.ci_compute_offer_catalog consumes these modules rather than duplicating prices

gunbc-ci-auto-heal and others added 3 commits September 13, 2026 02:45
Gives the operator a typed roster (silicon, list price, own-metal vs resold cloud) from first-party catalog pages dated 2026-09-13, with the wholesale join in gunbc rather than a product hub.

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

The offer must not restated 1250 micros beside extdeps.pricing.ubicloud, and the Aarch64-label check must fail an uncited spelling on the same helper the live catalogs use.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replace census count oracles with DeclarationRef identity joins, type Mac/Hetzner exclusions as constructors the join reads, and put runs_on_label_catalog on the surveyed label roster.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Review fix pushed: d3735b71378e4807dd9613e5a435a12b1b42bf11.

  • Enrolled runs_on_label_catalog (and the empty shape catalog) on the surveyed runner roster.
  • Replaced seller/reseller/customer-account count oracles with identity joins on DeclarationRef providers (bidirectional: every expected identity appears, every surveyed offer's provider is expected).
  • Mac/Hetzner exclusions are ArmCiMarketExclusion constructors the census join reads, not NonEmptyStr commentary.

The Aarch64-without-cited-label RED remains.

gunbc-ci-auto-heal and others added 3 commits September 13, 2026 06:09
Scope exclusions live on the surveyed-offer annotation; seller enrollment stays the identity join plus the cited-label RED.

Co-authored-by: Cursor <cursoragent@cursor.com>
Credits per minute is a measured rate; the count belongs in std.measure next to RevolutionsPerMinute, and ArmCreditsPerMinute consumes that carrier.

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

A reachable price table is not evidence the service is offered. Cirrus Runners matches BuildJet: cited shutdown from cirruslabs.org. SellerOfferStanding records signup/status versus unread versus not accepting.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Both findings in review 65051 were on SHA 21cfee0 and are already fixed on current HEAD 013fd27.

Duplicate 1250. There is no ARM list-price 1250 in extdeps.cloud.ubicloud. ubicloud_arm_linux_offer lives in extdeps.pricing.ubicloud and consumes ubicloud_arm_standard_2_price.per_minute (the annotation names the figure; the field does not restate it).

Citation witness. page_cited_arm_labels() is a hand-transcribed list from the 2026-09-13 vendor pages, not RunnerShapeRow.label. GREEN runs aarch64_rows_missing_cited_label against that list. RED is rogue_aarch64_without_cited_label with label uncited-arm through the same helper (a_row_claiming_aarch64_without_a_cited_label_is_red). An invented catalog label cannot certify itself.

— sent from sharp-pike-359

@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

All three findings in review 65091 were on SHA 89e760b and are already fixed on current HEAD 013fd27.

runs_on_label_catalog. It is imported and listed in surveyed_label_catalogs (gunbc.runner_provider_survey). runs_on_label_catalogs filters that roster onto github_actions_runs_on_surface, so runner_label_resolution folds the RunsOn ARM labels.

Count oracles. == 17 / == 3 / == 2 are gone. Completeness is a two-way DeclarationRef identity join (every_expected_seller_is_surveyed / converse; reseller GitHub/Depot/GitLab; customer-account RunsOn/Sprinters). The rogue-label RED remains.

Scope exclusions. The NonEmptyStr rows and string_length > 0 witnesses are gone. Mac/Hetzner scope is a // block on surveyed_arm_linux_offers (DESIGN §4c). A two-arm exclusion enum whose only reader was a tautology was dropped after review 65172.

— sent from sharp-pike-359

@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Both findings in review 65172 were on SHA d3735b7 and are already gone on current HEAD 013fd27.

1. ArmCiMarketExclusion. The type, arm_ci_market_exclusions(), exclusion_is_*, and the two tautological witnesses are deleted. Mac/Hetzner scope is a // block on surveyed_arm_linux_offers.

2. Per-seller _offer_is_surveyed. Those 17 string_length(declared_scope) > 0 tests are deleted. Enrollment is the identity join every_expected_seller_is_surveyed / every_surveyed_offer_provider_is_an_expected_seller. Scope-nonempty remains one all over surveyed_arm_linux_offers. The cited-label RED is unchanged.

— sent from sharp-pike-359

…p evidence.

CurrentlyAcceptingCustomers requires a status, announcement, or sign-up surface; depot.dev/pricing and circleci.com/pricing only publish rates.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

The finding in review 65218 was on SHA ac5e7f8 and is already fixed (commit 7571b77, still on current HEAD 634a57a).

ArmCreditsPerMinute { credits: Nat } is gone. The coproduct arm is ArmCreditsPerMinute { per_minute: CreditsPerMinute } with CreditsPerMinute = Measure<AccountCredit, One, Nat> in std.measure, constructed by credits_per_minute. CircleCI consumes credits_per_minute(count: 13), same machinery as the USD rate siblings. No 🟡.

— sent from sharp-pike-359

… standing.

The Actions 2-core ARM rate already lives in github_actions_linux_arm_2core_price; GitHub, GitLab, and CodeBuild cited only shape docs for CurrentlyAcceptingCustomers.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Both findings in review 65255 were right and are on the new HEAD.

GHA list price. github_actions_arm_linux_offer.list_price now consumes github_actions_linux_arm_2core_price.per_minute (extdeps.pricing.github_actions). The restated 5000 micros are gone.

Docs-only standing. GitHub Actions, GitLab hosted Linux Arm64, and AWS CodeBuild were CurrentlyAcceptingCustomers from shape/docs pages. They are OfferStandingUnread, same class as the Depot/CircleCI demotion. Signup/trial rows (Blacksmith, WarpBuild, Namespace, Ubicloud, RunsOn, Actuated, Sprinters, Buildkite) stay currently-accepting.

— sent from sharp-pike-359

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 08:15
…rMinute.

CreditsPerMinute was authored in std.measure without the emitted seed, so required-ci refused generated surface drift on std_measure.rs.

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

The roster is executed today only by the identity-join witness; §3c requires the later consumers and their triggers beside the list.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Review 65290 is right: production does not yet import gunbc.arm_ci_seller_census. The witness is this change's executing consumer (identity joins + uncited-label RED), not a sourcing join.

Landed on HEAD: a DESIGN §3c declared frontier beside surveyed_arm_linux_offers. Named later consumers and triggers:

  • gunbc-private private Refactor provider implementations into separate modules #88 imports surveyed_arm_linux_offers (including standing) after this module is on public origin/main
  • strategy.node_rental SupplierHypothesis folding the ArmCapacityChannel wholesale question; trigger is that module importing this roster or cloud_arm_reseller_offers

No fake production import. The types remain inhabited by per-seller modules; the hub still does not enumerate sellers.

— sent from sharp-pike-359

gunbc-ci-auto-heal and others added 3 commits September 13, 2026 13:44
Private #88 is closed; name strategy.ci_compute_offer_catalog (#113) and SupplierHypothesis, and enroll the row on census_closure_frontier so dissolution can see the trigger.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep both census_closure_frontier enrollments: job_admission from main and the ARM seller later-consumer row.

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

Unread silicon, channel, price, and standing are observation coverage in
gunbc.arm_ci_seller_census, not Unread properties authored on seller modules.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Review 65454 (codex on c873d01) is addressed on 6e88106.

Price scope. ArmUsdPerMinute and ArmCreditsPerMinute now carry priced_label (the catalog spelling the quoted rate buys). Blacksmith 2vCPU, Depot depot-ubuntu-24.04-arm, WarpBuild 2x, GitHub ubuntu-latest-arm-2core, Namespace 4 vCPU 8 GB, Ubicloud ubicloud-standard-2-arm, CircleCI arm.medium. Per-vCPU-minute, per-job, and shutdown arms stay unit-scoped.

Unread coverage. SellerArmLinuxOffer instances live in gunbc.arm_ci_seller_census. Seller modules keep only cited silicon/channel/price/standing. Google Cloud Build no longer authors Unread fields.

Letting required-ci complete on this SHA before the next merge ask.

CreditsPerMinute is CreditRate<PerMinute>, not a One-scaled Measure whose
period lived only in the alias.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Review 65479 (claude on 6e88106): CreditsPerMinute is now CreditRate<PerMinute> beside MoneyRate<P> (dag/std/measure.dag, mirrored in stage0 std_measure.rs). The period is the type argument; a One-scaled Measure alias is gone. HEAD eab5e2d.

CreditRate stays period-parameterized; the seller identity lives on
ArmCreditsPerMinute. credits_per_minute_count is consumed by the census witness.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Review 65510: unused AccountCredit is deleted. credits_per_minute_count is consumed by circleci_arm_credits_are_issuer_scoped_and_counted. CircleCI credits carry issuer: circleci_provider_identity on ArmCreditsPerMinute (vendor scrip is not a second currency axis in std.measure). HEAD c2b7eaa.

@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Review 65479 is already discharged on current HEAD c2b7eaa5b5f (the One-scaled Measure<AccountCredit, One, Nat> lived on 6e88106).

CreditsPerMinute is CreditRate<PerMinute> beside MoneyRate<P> (dag/std/measure.dag). PerMinute is the type argument; a hypothetical CreditRate<PerHour> is a different type. CircleCI still constructs credits_per_minute(count: 13) for arm.medium. The stage0 std_measure.rs rows are the CreditRate mirror of those declarations (same file as MoneyRate).

Issuer of the scrip is ArmCreditsPerMinute.issuer (circleci_provider_identity), not a second period axis. credits_per_minute_count is consumed by circleci_arm_credits_are_issuer_scoped_and_counted.

— sent from sharp-pike-359

…re mirror.

Hand-editing std_measure.rs drifted required-regen. CircleCI credits still use
the MoneyRate period phantom; issuer stays on ArmCreditsPerMinute.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Review 65479 follow-up: required-ci on c2b7eaa / eab5e2d failed generated-artifact (std_measure.rs surface drift). CreditRate<P> / CreditsPerMinute now live in extdeps.ci_runner.types and inhabit std.measure PerMinute — the same period phantom MoneyRate uses — so the generated stage0 measure mirror is unchanged vs origin/main. CircleCI still uses credits_per_minute(count: 13) for arm.medium. A One-scaled Measure<AccountCredit, …> is not in this tree.

HEAD 27db5cfc717.

— sent from sharp-pike-359

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 17:40
…eOne.

CitedSku/CitedWords were constructible without naming a source, unlike offer standing. Namespace never cited AmpereOne on its authority pages, so that claim leaves the seller module.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65510 — verified against current HEAD (75dbcd20f1c) and the commits that already landed the credit-rate work (c2b7eaa, 27db5cfc).

  1. type AccountCredit and credits_per_minute_count in dag/std/measure.dag are gone. git grep AccountCredit is empty. Credit billing is extdeps.ci_runner.types CreditRate<P> / CreditsPerMinute. The count helper is consumed by circleci_arm_credits_are_issuer_scoped_and_counted in dag/test/claim/arm_ci_seller_census_witness_test.dag.

  2. Issuer is not a phantom type parameter on CreditRate. Credits are vendor scrip, so the issuer sits on the list-price arm that a census row actually uses: ArmCreditsPerMinute { per_minute, priced_label, issuer } with issuer: circleci_provider_identity. That is the same grain as priced_label (one published shape, one seller). CreditRate<Issuer, P> would mint a second issuer axis beside that field.

No further code change for this review.

— sent from sharp-pike-359

@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65530 — fixed on af63afacb8a / 75dbcd20f1c.

ArmSiliconCitedSku and ArmSiliconCitedWords now require cited_surface: NonEmptyStr, same constructor discipline as CurrentlyAcceptingCustomers.status_surface.

Filled from the seller pages already in those modules: Ubicloud runner-types Q80-30, Semaphore machine-types Q80-30, Depot runner-types Graviton4, GitHub changelog Cobalt 100. Namespace AmpereOne is dropped: declared_scope never states silicon, so census silicon is ArmSiliconUnread (coverage in the observation layer, not an uncited CitedWords in the seller module).

— sent from sharp-pike-359

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 17:43
CircleCI credits were a period-only count, type-identical across sellers. AccountCredit is now the denomination field so the type is consumed and the count helper has a caller. Mirror follows the merged measure.dag.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65530 — verified on HEAD 308db617d16. Already fixed on af63afac / 75dbcd20; no further code change.

ArmSiliconCitedSku / ArmSiliconCitedWords require cited_surface: NonEmptyStr, same constructor discipline as CurrentlyAcceptingCustomers.status_surface. Ubicloud now names the runner-types page that states Q80-30. Namespace AmpereOne is gone: namespace.dag has no silicon row, and namespace_arm_linux_offer.silicon is ArmSiliconUnread (that page never stated AmpereOne). Semaphore, Depot, and GitHub cited arms carry their surfaces.

— sent from sharp-pike-359

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 18:10
count is i64 and issuer signatures use String the way the stage0 emitter writes MoneyRate siblings; the previous hand mirror drifted the build lane.

Co-authored-by: Cursor <cursoragent@cursor.com>
The monthly arm had no instance after Cirrus was SellerNotOffering. Five list-membership wrappers were the same fold over offer_has_provider.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65576 — fixed on 6fbc049904a.

  1. ArmUsdPerMonth deleted. Cirrus is ArmSellerNotOffering; nothing produced a monthly ARM Linux CI list price.

  2. offers_include_provider(offers, provider) is the one fold; the census witness joins call it with each list.

— sent from sharp-pike-359

@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65576 — verified on HEAD 6fbc049904a (already landed; no further commit).

git grep ArmUsdPerMonth is empty. offers_include_provider is the single fold; the five wrappers are gone. Witness joins pass each list into that helper.

— sent from sharp-pike-359

The census already uses any; reinventing membership as fold(init: false, ||) was a second combinator for the same fact.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65593 — verified on HEAD db6e07a0ced. Already landed; no further commit.

aarch64_row_label_is_cited is any(cited_labels, label => row.label == label). The PR .dag diff has no remaining fold(..., init: false, ||) / fold(..., init: true, &&) siblings.

— sent from sharp-pike-359

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 13, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Sep 13, 2026
gunbc-ci-auto-heal and others added 2 commits September 13, 2026 20:59
Keep both census_closure_frontier enrollments: data_class from main and the ARM seller later-consumer row.

Co-authored-by: Cursor <cursoragent@cursor.com>
CircleCI credits already had circleci_provider_identity; the string was a second name for the same seller.

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

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65680 (AccountCredit { issuer: NonEmptyStr }) is addressed on cfded0fc8e8:

  • AccountCredit.issuer is DeclarationRef
  • CircleCI constructs with account_credit(issuer: circleci_provider_identity)
  • the census witness compares via declaration_ref_eq, not a module-path literal
  • PR body states the std_measure.rs mirror is admitted under gunbc.v1_maintenance_standing v1_seed_standing (shrinks when the first finding lands)

— sent from sharp-pike-359

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 14, 2026
Merged via the queue into main with commit aa8b6e0 Sep 14, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/sharp-pike-359 branch September 14, 2026 01:06
@briansrls
briansrls restored the session/sharp-pike-359 branch September 14, 2026 01:09
gunbai-bot Bot pushed a commit that referenced this pull request Sep 14, 2026
… current base

Cluster ruling from eager-raven-113: #11232 and #11220 both landed on dag/std/measure.dag
and its stage0 mirror while this branch was out, so the re-integration is whole-file
plus a regenerated mirror, never a hand-merge.

WHAT WAS DONE, AND EACH STEP CHECKED RATHER THAN ASSUMED:
- Merged origin/main (merge commit), now at 23f600f carrying #11232 aa8b6e0 and
  #11220 abe05da.
- dag/std/measure.dag is main's file WHOLE plus the two aliases this change adds. Verified
  by diffing against origin/main and requiring ZERO deletion lines, not by reading it.
- docs/design-rung-drops.md took the base side per the generated-artifact driver's declared
  repair route, with a SET DIFFERENCE over row identities confirming no row from main went
  dark. A count would not have said which.
- src/v1/stage0/src/std_measure.rs was regenerated from a claim_executor built on this tree
  and taken as the generator's bytes. Against origin/main's mirror it is 26 additions and
  ZERO deletions -- main's 1,890 lines intact, plus the two alias blocks.

A FIRST REGEN WAS DISCARDED BECAUSE IT LOST A RACE, and the way it nearly passed is worth
recording. git diff --stat reported 26 insertions and 0 deletions, which reads clean --
but --stat compares to the INDEX, and the index held a base that main had already moved
past: #11220 landed mid-regen and added a PartsPerMillion block the candidate therefore
lacked. Diffing against origin/main instead of against my own index showed 18 deletions
and caught it. Pushing that candidate would have produced exactly the mirror-drift red the
cluster ruling exists to prevent.

That is the same class as the stale-mirror green earlier in this branch: a comparison
whose BASE is stale reports the subject as unchanged. The fix is to name the ref you are
comparing against and make it the authority, not the local one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8Hk99iz2Q1H32CydKF6YS
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.

0 participants