Skip to content

feat(independent): independent_v1 composer and live canary runner - #148

Merged
wallscaler merged 25 commits into
mainfrom
cursor/independent-v1-composer-ddda
Aug 28, 2026
Merged

wallscaler merged 25 commits into
mainfrom
cursor/independent-v1-composer-ddda

Conversation

@wallscaler

@wallscaler wallscaler commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Outcome target

Deliver a bounded, one-write SN39 Compute canary whose weight vector originates from this validator, not the Cathedral relay feed.

The runner must read the exact closed-tempo chain view, collect Intel TDX evidence from registered SN39 axons, derive canonical SAT work units, compose one independently authorized set_mechanism_weights vector, and submit only through the dedicated canary hotkey after an explicit operator confirmation.

This PR targets merge-ready source and canary controls. It does not claim a production deployment, a finalized on-chain write, subnet emissions, or miner rewards.

Acceptance checks

Pre-spend and chain snapshot

  • Pin Finney genesis and freeze the closed-tempo anchor before any Cathedral Workers request, billable rental, miner dial, composition, or submission.
  • Refuse composition when the chain endpoint cannot return the exact historical metagraph. The head fallback remains diagnostic only.
  • Re-read the inclusion metagraph before composition so UID-to-hotkey changes forfeit affected payout to burn.

Policy authorization and economics

  • Verify the current bundle signatures, and the cached bundle signatures when present, before lineage or commitment checks.
  • Require v1 genesis lineage or an exact version-plus-one successor naming the previous digest. Refuse skips, forks, and rollbacks.
  • Require the anchor commitment to name the exact policy document being composed.
  • Keep Compute funded at 10^11 mass. CyberGym and Voice remain at zero.

Evidence and scoring

  • Require the published QVL binary digest 35bb55f89f411d5dcf5f72be90488e999ee68c41dfc0429a0dcb8cc2b448b6bb.
  • Treat QVL PASS as admission only. Payment mass comes only from SAT units independently re-derived by the validator.
  • Abort the whole epoch without composition on any QVL infrastructure result. Verifier uncertainty must not become a failing miner or a windfall for another miner.
  • Bind evidence to the requested hotkey, challenge, observed peer TLS SPKI, and returned certificate-chain leaf. Recheck the same SPKI on the SAT request.
  • Isolate ordinary SAT failures to the affected miner. Preserve KeyboardInterrupt and SystemExit as process stops.

Identity and allocation

  • Claim the quote-bound machine identity immediately after QVL PASS and before any SAT outcome. Two hotkeys claiming one machine forfeit both, including when the duplicate side fails SAT.
  • Allocate each miner floor(allocation * units / total_units). Leave integer remainder unassigned so the composer folds it to burn.
  • Refuse self-payment to the live relay hotkey, the canary hotkey, and all configured refused destinations. The burn destination is the only payable exception.

One-write chain boundary

  • Keep cathedral_thin.independent free of Bittensor, relay-fetch, and writer imports.
  • Require --confirm-canary, the dedicated canary wallet identity, a COMPOSED result, exact u16 arguments, identified paid destinations, and a durable O_EXCL canary lock before transport.
  • Submit only SubtensorModule.set_mechanism_weights(netuid, mecid, dests, weights, version_key) with a mortal era and inclusion wait.
  • Never use the live relay wallet. Never expose a generic --broadcast path.

Verification at head 681cbf39cd374a4d6553f3eff7cf3185e2f42ca6

  • Python 3.12: 608 passed across tests/thin/test_independent_*.py.
  • Python 3.11: 608 passed across the same scope.
  • Ruff: pass across the sealed package, live runtime, and independent tests.
  • Ruff format: 44 files already formatted.
  • Python compile, git diff --check, and changed-diff secret-pattern scan: pass.
  • Focused adversarial tests cover pruned-anchor pre-spend refusal, QVL infrastructure global refusal, duplicate identity before SAT, remainder-to-burn, signature forgery, economics forks, HTTPS authority and deadlines, SPKI mismatch, journal bounds, startup gates, and exact chain-call arguments.

GitHub CI for this exact head must also pass before merge.

Trust boundary

  • The sealed composer enforces signature, lineage, commitment, inclusion, Hamilton, refusal, and one-write gates.
  • The first live canary does not consume an externally governed or on-chain CATHPOL1 policy. It generates ephemeral process-local Ed25519 keys, signs a fixed genesis EconomicsSet, and creates its matching local commitment. This proves independent composition mechanics. It is not production policy authorization.
  • SN39 axons use self-signed in-guest certificates. The validator intentionally does not use public-CA verification for IP axons. Authentication instead depends on Intel TDX REPORT_DATA binding the observed TLS SPKI, the returned certificate leaf matching that peer SPKI, and the measured miner refusing a requested binding that differs from its configured in-guest identity.
  • Quote-bound application-key extraction is not implemented. Until it is, the observed and attested TLS SPKI is the machine identity and SAT channel binding.
  • Attestation proves admission under the pinned verifier. It does not earn mass. Canonical SAT work is the payment input.
  • The chain transport waits for inclusion, not finalization. Operators must confirm the exact row at finalized heads before reporting an on-chain success.
  • No reward or TAO-earning claim follows from registration, uptime, a submitted row, or this PR.

Rollout

  1. Merge only after exact-head CI and review threads are green.
  2. Run without --confirm-canary. Require an exact historical anchor, QVL PASS with no INFRA result, expected miner identities, verified SAT units, and the intended composed destinations and weights.
  3. Inspect the JSON report and immutable source SHA. Confirm the dedicated canary identity is not the relay or burn identity.
  4. Run once with --confirm-canary and the dedicated canary wallet supplied outside the repository.
  5. Preserve the canary lock, journal, extrinsic hash, and full report.
  6. Confirm inclusion and then repeat the exact UID/weight read at two later finalized heads before making a success claim.
  7. Keep continuous operation out of scope until external policy authority, operational monitoring, and a deliberate repeat-write design are reviewed.

Rollback

  • Before submission, stop the runner, omit --confirm-canary, or revert this PR. No chain state changes.
  • After an included extrinsic, do not delete or reset the canary lock. The included write is not reversible by a code rollback.
  • Stop the runner, preserve all evidence, and require a separately authorized later weight update after the applicable chain cooldown to change the row.
  • Reverting 681cbf3 restores the prior source behavior but does not undo any existing chain state.

Remaining risks and launch inputs

  • No external or on-chain policy authority feeds the live runner yet. The local ephemeral policy is bounded-canary only.
  • A registered SN39 miner must serve protocol-compatible /v1/evidence and /v1/sat-work endpoints.
  • The exact pinned QVL executable and dedicated canary wallet JSON must be present on the launch machine. Neither belongs in Git.
  • The validator requires a chain endpoint retaining the exact closed-tempo metagraph. Pruned public endpoints now fail closed.
  • The QVL executable is hashed at load and invoked later by path. A local actor able to replace that file between those operations remains inside the launch-machine trust boundary.
  • Each axon has bounded fetches, but a full sequential subnet scan can accumulate multiple per-axon deadlines.
  • The dry-run journal fsyncs its temporary file before atomic replacement but does not fsync the parent directory. The separate one-write canary lock does fsync both file and directory and remains the safety fence.
  • Composition exceptions can still exit without the final JSON report. This is an operability limitation, not a path to submission.
  • Live E2E, finalized chain state, emissions, and miner rewards remain unproven by repository tests.

Out of scope

  • Merging, deployment, wallet access, signing, or broadcasting as part of this PR review.
  • The live SN39 relay hotkey or config/validator-thin-sn39-relay.toml.
  • CyberGym and Voice scoring. Both stay at allocation zero.
  • General repeat submission or production validator operation.
  • Work metering beyond the canonical SAT audit.
  • Public-CA validation for self-signed TDX guest certificates.

cursoragent and others added 3 commits August 26, 2026 08:35
The live SN39 path still relays a hub-signed vector. This lineage composes
u16 dests/weights locally from a 2-of-3 PolicyBundle, Hamilton G9, and H1
forfeit-to-burn, then journals them with broadcast locked off so a later
canary can match the wire without using the live relay wallet.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Git 2.55 on the Python 3.11 runner creates then unlinks
objects/maintenance.lock during the rglob walk, so chmod races to
FileNotFoundError. Tracked release files are the only modes the
porcelain check cares about.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
The composer can name the Compute lane and refuse it for a stated
reason. Construction without a quote verifier is AdapterUnavailable,
collateral must be Intel PCS, and probe returns no mass even when a
mock verifier PASSes. Funded Compute stays BROADCAST_BLOCKED until
#120 and an open QVL digest close.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
@wallscaler
wallscaler marked this pull request as ready for review August 26, 2026 08:56

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 54c677bc94

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread cathedral_thin/independent/compose.py
Comment thread cathedral_thin/independent/fetch_policy.py Outdated
Comment thread cathedral_thin/independent/launcher.py Outdated
Comment thread cathedral_thin/independent/launcher.py Outdated
Comment thread cathedral_thin/independent/policy.py
Comment thread cathedral_thin/independent/journal.py Outdated
Comment thread cathedral_thin/independent/fetch_policy.py
@cursor
cursor Bot requested a review from ai-hpc August 26, 2026 09:06
cursoragent and others added 3 commits August 26, 2026 09:12
Compose now requires a key registry and checks 2-of-3 before journaling, and
refuses a successor that does not follow genesis or last-good. Also pin the
weight cap exactly, require observed hotkey and genesis on the CLI, refresh
the fetch deadline per chunk, include the journal newline in the byte bound,
and send Host with a non-default port.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
http.client and cryptography both load ssl, which subclasses socket at
import time. Leave those imports inside the functions that need them so
importing independent_v1 still has no socket side effects.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Validators mint a 32-byte attributable nonce and POST /v1/evidence over an
injected transport. The copied REPORT_DATA v2 preimage is pinned to the
sandbox vector. A PASS quote still contributes no mass: Compute allocation
stays 0 and compose remains BROADCAST_BLOCKED. No dialer, no live axon,
no chain write.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Comment thread cathedral_thin/independent/collect.py
cursoragent and others added 2 commits August 26, 2026 09:39
urlsplit stores IPv6 literals without brackets. Rebuilding an evidence
URL or Host header from the raw host produced https://2001:db8::1/...
which is not a valid authority. Bracket the host whenever it contains a
colon, including non-443 ports.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
submit_canary_once calls an injected transport exactly once after COMPOSED,
a funded Compute row, a dry-run u16 match, and the dedicated canary hotkey.
DEGRADED and BROADCAST_BLOCKED cannot spend the slot. The lock is a separate
independent-canary.json, claimed before the transport. No chain client, no
--broadcast, no --canary, Compute allocation stays 0.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Comment thread cathedral_thin/independent/canary.py
cursoragent and others added 3 commits August 26, 2026 12:52
File fsync alone leaves the new directory entry in the page cache. A crash
after submit_canary_once then looks like the slot was never spent. Fsync the
parent after the O_EXCL claim and after replace so the one-write fence
survives power loss.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
A ComputeAdapter with a pinned QVL digest and independently bound
integer mass is now contributing. mass_map probes that adapter, leftover
folds to burn, and compose can emit COMPOSED so the one-write canary has
a real payable vector. Unpinned mocks still cannot move SN39 mass.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
cathedral-independent-live lives outside the import-graph ban. It lists
or rents a sealed Intel TDX Worker, snapshots SN39 serving axons,
collects v2 evidence over public HTTPS, composes from pinned-QVL
verified mass, and submits set_mechanism_weights through the dedicated
canary transport. Fast CPU keep-warm is refused at create.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
@cursor cursor Bot changed the title feat(independent): dry-run independent_v1 composer feat(independent): independent_v1 composer and live canary runner Aug 26, 2026
Comment thread cathedral_thin/independent_runtime/run.py
Comment thread cathedral_thin/independent_runtime/run.py Outdated
Comment thread cathedral_thin/independent_runtime/https.py
Comment thread cathedral_thin/independent/constants.py Outdated
Comment thread cathedral_thin/independent_runtime/run.py Outdated
Comment thread cathedral_thin/independent_runtime/run.py Outdated
cursoragent and others added 3 commits August 26, 2026 13:40
…lock

The live runner was hashing a future tempo close, which is not a produced
block for 359 of every 360 blocks. It now freezes the closed tempo.
load_verifier refuses any binary whose digest is not the SN39 launch QVL
pin, so a mock script cannot bind mass. Serving axons skip the canary
identity, and the canary transport re-checks mecid, version_key, and
genesis before signing.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Substrate //Bob is public. The dedicated canary identity is now an
unpublished ss58, and require_canary_hotkey refuses Alice through Ferdie
including stash and ed25519 variants. The refuse-list stays exactly the
live relay plus the burn destination.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
…tate

A QVL PASS is admission, not payment. The live runner records pass count
and leaves verified_units empty until SAT work units exist. State defaults
to /var/lib/cathedral-validator at 0o700, inclusion re-snapshots the
metagraph after collect, --rent is gated on custom.v1 TDX, --confirm-canary
is required to spend the lock, local policy keys are ephemeral, and the
QVL pin is the published binary-blob digest.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown

@codex review

Please re-review HEAD after the fail-closed QA pass (1063be6):

  • Dedicated CANARY_HOTKEY is no longer Substrate //Bob. Well-known development keys are canary-ineligible.
  • A QVL PASS is admission, not payment. verified_units stays empty until independently re-derived SAT work units exist.
  • --state-dir defaults to /var/lib/cathedral-validator (0o700, no symlink). Inclusion re-snapshots the metagraph after collect.
  • --rent is gated on live custom.v1 Intel TDX create. --confirm-canary is required to spend the one-write lock.
  • Local economics keys are ephemeral, not bytes([n])*32.
  • Launch QVL pin is the published binary blob digest 35bb55f8…, not the thin-relay implementation pin 8292b085….

Do not treat attestation as payment. Do not use the live SN39 relay hotkey. The sealed package must still have no chain client.

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

cursoragent and others added 3 commits August 26, 2026 14:48
The canary signs the vector, so paying it is a self-payment. Compose now
folds refuse-listed and canary destinations to burn the same way as an
inclusion remap, and submit_canary_once refuses a hand-assembled vector
that still names one. The burn dest remains the single payable exception
on the refuse-list.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
SubstrateCanaryTransport now rebuilds kwargs through
build_mechanism_weights_kwargs and refuses unless the one-write lock is
already pending for this identity and vector. It never claims the lock
itself. A direct call with no compose result cannot reach submit_extrinsic.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
cmd_run now chooses the closed-tempo anchor first, then reads the
metagraph, collects, and re-reads inclusion. --confirm-canary and a
missing wallet refuse before prepare_mechanism_weights, so an unconfirmed
epoch journals compose and not a submission.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Comment thread cathedral_thin/independent/canary.py
Inclusion names every contributing dest before Hamilton drops sub-u16
dust. Requiring those bindings to equal the paid dests rejected a real
COMPOSED mix that had one dust miner. Require paid dests to be a subset
of the inclusion bindings instead.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
cursoragent and others added 2 commits August 26, 2026 15:13
A funded Compute row on the bundle in hand did not prove the vector was
composed from that document. Require the composition's bundle_digest to
equal bundle.digest().hex() before claiming the one-write lock.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Run 32984573867 concluded failure with Python 3.11/3.12, Publisher, and
Integration still queued and no steps executed. Local independent tests
were 469 passed. This empty commit retriggers the pull_request workflow.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Comment thread cathedral_thin/independent_runtime/run.py
A pinned-QVL quote still only admits a machine. The live runner now
commits to a canonical audit instance, POSTs it to the axon's
/v1/sat-work, and binds Compute mass from the integer clause count
this validator re-derives. Miner-claimed units and non-canonical
jobs never move mass. A local fake-miner loop reaches COMPOSED and
fires the one-write canary through an injected transport.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit b80cc1a. Configure here.

Comment thread cathedral_thin/independent_runtime/run.py

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Agentic security review of the independent_v1 composer and live canary runner. One new high-severity payment-integrity issue on the live scoring path; the previously reported pruned-metagraph (at_anchor) concern is unchanged.

Open in Web View Automation 

Sent by Cursor Security Agent: Security Reviewer

Comment thread cathedral_thin/independent_runtime/run.py
A flaky axon's HTTPException is not an OSError, so catching only the
named SAT errors aborted cmd_run for every miner. Catch Exception the
same way evidence collect does, and keep KeyboardInterrupt aborting.

After a successful SAT round, assert_machine_identity now records the
observed TLS SPKI. A second hotkey claiming that machine forfeits both
claimants so one TDX guest cannot collect two Compute shares.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Agentic security review found one high-severity issue on the live miner HTTPS path: IP axons disable TLS certificate verification, and quote REPORT_DATA is bound to the client-observed SPKI rather than an enclave-held TLS key. Prior findings: missing assert_machine_identity is addressed; at_anchor still does not gate compose/submit.

Open in Web View Automation 

Sent by Cursor Security Agent: Security Reviewer

Comment thread cathedral_thin/independent_runtime/https.py
cursoragent and others added 2 commits August 26, 2026 17:12
IP axons terminate TLS inside the guest with a self-signed cert, so
CERT_NONE stays the IP trust model. Authentication is the v2 REPORT_DATA
binding of the observed SPKI; an honest guest will not quote a foreign
key. The collected cert_chain is no longer unread: a non-empty leaf must
be the X.509 certificate this connection hashed.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
probe-sn39 and the live run report a skip census so an empty serving
set is diagnosable. The live relay is still never listed as dialable.

Co-authored-by: Ancient Runner  <wallscaler@users.noreply.github.com>
Require the exact closed-tempo metagraph before any billable Worker or miner I/O, and treat QVL infrastructure failures as validator-wide uncertainty. Claim quote-bound machine identities before SAT and leave proportional integer remainder to burn so duplicate and economics failures cannot become payout.
@cursor

cursor Bot commented Aug 28, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_fef30d58-b9a8-49b5-9950-aca7748eb6b2)

@wallscaler

Copy link
Copy Markdown
Contributor Author

Exact-head merge-readiness record

Reviewed SHA: 681cbf39cd374a4d6553f3eff7cf3185e2f42ca6

Outcome: READY for dependency-order merge as a bounded, one-write SN39 Compute canary. This is not approval for continuous production operation and is not live-chain proof.

Validated repairs in this head

  • Exact historical anchor is now a pre-spend gate. A pruned fallback stops before catalog access, Worker construction or rental, miner dial, state creation, compose, or submit.
  • Any QVL INFRA result blocks composition for the whole epoch. Verifier uncertainty cannot reallocate a miner share to another miner.
  • The quote-bound machine identity is claimed before SAT. A duplicate hotkey cannot preserve the first payout by failing its own SAT request.
  • Proportional mass uses floor division for every miner. Integer remainder stays unassigned and folds to burn in the composer.

Exact-head verification

  • Python 3.12 independent suite: 608 passed.
  • Python 3.11 independent suite: 608 passed.
  • Ruff, format, compile, diff whitespace, and changed-diff secret-pattern checks: pass.
  • GitHub Python 3.11, Python 3.12, Integration lane, Publisher suite, Cursor approval, and Cursor security checks: pass.
  • All six previously outstanding inline/security threads have exact-head evidence replies and are resolved.

Independent Fable review

Claude Fable performed a read-only exact-tree review and returned: merge-ready as a bounded one-write canary, no blockers.

Fable independently falsified the signature, economics-lineage, anchor-fallback, identity-order, SPKI/channel-binding, Hamilton/remainder, self-payment, confirmation-bypass, one-write, QVL-INFRA, bundle-splice, and chain-call concerns against the current source and tests.

Nonblocking follow-ups

  • A confirmed rerun against an already-spent lock can update the dry-run journal before the lock refuses submission. The durable lock still prevents a second write.
  • A signal-killed QVL subprocess currently maps to FAIL instead of INFRA. It remains fail-closed for the affected quote, but the operational classification should be separated later.
  • An unexpected compose exception can lose the final JSON report.
  • The dry-run journal does not fsync its parent directory. The one-write lock does fsync both file and directory and remains the submission fence.
  • The state-directory gate occurs after optional rental and miner collection. Spend remains bounded, but this should move earlier before repeat operation.

Trust and rollout boundary

The live runner still uses a process-local ephemeral 2-of-3 policy and matching local commitment. It proves canary pipeline mechanics, not external policy authorization. Self-signed miner TLS relies on pinned-QVL REPORT_DATA binding to the observed SPKI. The chain transport waits for inclusion only. Finalized chain reads are required before any on-chain success statement. No emissions or reward claim follows from this PR.

The PR body now records the complete outcome target, acceptance checks, rollout, rollback, trust boundary, launch inputs, and remaining risks.

No merge, deployment, wallet access, signing, or broadcast occurred during this review.

@wallscaler
wallscaler merged commit 0350dcd into main Aug 28, 2026
7 checks passed
@wallscaler

Copy link
Copy Markdown
Contributor Author

PM after #148 merge (0350dcd on main).

Live cathedral.computer catalog unchanged (validator source, not a site/PolarIS deploy). PolarIS prod still source_sha=8e1dc3d / migration_head 080. Homepage still Sealed receipt caption. Fast Persistent Hetzner $0.15 available, no receipt; one-shot Fast off; GPU unavailable. No SN70. Do not roll PolarIS alembic 081 onto Cathedral prod for this.

This merge is reviewed source only. No --confirm-canary, no live relay wallet, no UID30 submit, no emissions/reward claim.

GHCR audit image from sandbox #171 is public (anonymous index pull just verified):
ghcr.io/cathedralai/cathedral-sn39-audit-miner@sha256:afdc51a931dec1433981166033cffcebecb8fc3d432b65a6500063bd6a06b032
linux/amd64 manifest: sha256:e60f800ebea5359f3c6d21f5b1d3276ff1dcca3d671328c8846764a3dab9d681

Next:

  1. feat(independent): gate one verified miner axon announcement #150 already rebased onto this main — keep draft until exact-head CI + review. No serve_axon.
  2. feat(validator): gate UID30 launch on a reviewed one-miner 100/0 preview #149 retargeted to main; rebase onto 0350dcd like feat(independent): gate one verified miner axon announcement #150, keep draft, merge only after feat(independent): gate one verified miner axon announcement #150. No --confirm-uid30-launch.
  3. PolarIS #1163: pin CATHEDRAL_SN39_MINER_IMAGE to that same index digest, stay draft, no Cathedral PolarIS prod deploy.
  4. CyberGym v3 feat(cybergym): v3 lane bottom-fill payout curve (leader takes remainder) #146/feat(cybergym): v3 redirects the CyberGym lane to compute when idle (N=0) #147 stay unmerged. Distillery rewards off.
  5. fix: let reviewed UID30 launch sign from bounded finalized descendants #155 bearer + enroll Cloudflare 522 remain the separate operator-mint gate on cathedral-enroll-sn39 — not this Cathedral-owned miner path (5CJTD6…).

Did not ping Astro.

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.

2 participants