Promote latest main to testnet-canary - #1667
Conversation
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.36.2 to 4.37.0. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](github/codeql-action@8aad20d...99df26d) --- updated-dependencies: - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.37.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
…-receipt-timeout # Conflicts: # packages/cli/src/config.ts
…-receipt-timeout # Conflicts: # packages/cli/src/config.ts
…ithub/codeql-action/upload-sarif-4.37.0 ci(deps): bump github/codeql-action/upload-sarif from 4.36.2 to 4.37.0
…very fix(agent): recover request-owned ACK routing
fix(cli): keep status quad count nonblocking
…lity fix(agent): gate random sampling on sharding admission
refactor(cli): centralize Edge restart verification
fix(publish): fail unfundable publishes before ACK collection (#1573)
…pt-timeout fix(chain): make receipt deadline configurable (#1562)
…-evm fix(build): bound runtime updater UI memory
…scapes fix(storage): escape control characters in RDF bindings
| } | ||
| } | ||
|
|
||
| const membershipProbe = this.chain.isShardingTableMember?.bind(this.chain); |
There was a problem hiding this comment.
🟡 Issue: Random Sampling eligibility is split across lifecycle, bind, and string-matched adapter errors
What's wrong
This adds another state machine to an already broad lifecycle method while the bind layer still owns similar gates. The new lifecycle fields are effectively a shadow status object for the handle. That makes the design harder to reason about and creates drift risk between status reporting, retry scheduling, and actual prover construction.
Example
A future random-sampling eligibility state now has to be threaded through at least two places: lifecycle-owned fields like randomSamplingDisabledReason/randomSamplingIdentityId, and bind-owned noop handle status. Missing one leaves status/logging/retry behavior inconsistent even if the prover behavior still works.
Suggested direction
Move role, identity, readiness, sharding membership, disabled reason, and retryability into a dedicated eligibility helper or bind result. The chain adapter should expose typed unavailable/not-deployed outcomes instead of requiring lifecycle to parse EVM error text.
For Agents
Look at tryStartRandomSamplingProver and random-sampling-bind. Preserve current reasons and retry/disabled outcomes, but introduce one eligibility/result model owned by the random-sampling bind/eligibility module. Lifecycle should call it and only schedule retry/start from the returned result. Prove parity with the existing random-sampling lifecycle tests.
| * quote is required and quote failure propagates: strict fundability must never | ||
| * be decided from a manufactured protocol-minimum amount. | ||
| */ | ||
| export async function resolveQuotedPublisherCandidatePricing( |
There was a problem hiding this comment.
🟡 Issue: Collapse the two publisher-pricing state machines into one policy-driven flow
What's wrong
The strict and legacy planning paths are implemented as parallel state machines rather than one shared model with different policies. This is exactly the kind of duplicated branching that becomes permanent debt because the two functions must evolve together but nothing enforces that they stay aligned.
Example
If another diagnostic or eligibility condition is added, it has to be added to both resolvers and kept behaviorally aligned. The current implementation already repeats the account lookup, lock lookup, coverage check, quote clamp, and direct fallback branches in two near-identical flows.
Suggested direction
Use a single resolver that performs PCA discovery once and delegates only the strict-vs-legacy policy differences to small strategy functions or options. That would delete duplicated branches while keeping behavior explicit.
For Agents
Refactor publisher-plan.ts around one candidate-pricing engine with an explicit policy object for strict vs legacy behavior: quote required/optional, coverage required/legacy-unchecked, quote failure propagation/fallback. Preserve the public result shapes or adapt callers with a thin formatter, then keep the existing publisher-plan unit tests as parity coverage.
| @@ -1,4 +1,14 @@ | |||
| export * from './chain-adapter.js'; | |||
| export { | |||
There was a problem hiding this comment.
🟡 Issue: Do not publish low-level publisher-planning internals from the chain package root
What's wrong
The PR adds implementation-specific planning helpers and diagnostic shapes to the public chain package surface. That leaks feature internals across package boundaries and makes future simplification harder because internal policy choices become importable contracts.
Example
A downstream consumer can now import resolveLegacyPublisherCandidatePricing and depend on pricingMode, quoteSource, or legacy-unchecked diagnostics even though those are implementation details of publisher planning rather than stable chain capabilities.
Suggested direction
Narrow the public export surface. If publisher needs legacy fallback logic, own that compatibility helper in the publisher package or expose a deliberately named internal entrypoint instead of the main package index.
Confidence note
This assumes the package root exports are treated as public API, which is the normal expectation for this workspace package.
For Agents
Keep ChainAdapter.resolvePublisherPublishPlan as the cross-package boundary. Move legacy fallback pricing into the publisher package or a private/internal import path, and keep EVM strict pricing package-private to the chain adapter. Only export types that are intended as stable external contracts.
Summary
Promote the current
mainhead (6613cd4031cc661156e36541381a623f124f9473) intotestnet-canarythrough the normal protected-branch flow.The final release blockers are now merged and included:
This promotion also includes every other change merged to
mainsince the previous canary promotion.Branch state
mainat6613cd4031cc661156e36541381a623f124f9473testnet-canaryatee1bb05d872907fbf5667df816a16bd39559d025Release gate
CI must finish successfully and protected-branch review requirements must be satisfied before a normal merge. After merging, verify that the resulting
testnet-canarytree exactly matchesmain, then confirm all four testnet beacons have adopted the resulting canary revision before running the certification burst.