Skip to content

Deployment risk conformance: one environment model for the repo - #13639

Closed
briansrls wants to merge 1 commit into
mainfrom
session/silent-koi-18
Closed

briansrls wants to merge 1 commit into
mainfrom
session/silent-koi-18

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session silent-koi-18.
Pushing to session/silent-koi-18 advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

@briansrls
briansrls marked this pull request as ready for review October 9, 2026 17:35
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-09T18:26:46.484039Z 76d7fb5 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@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: 76d7fb54fb

ℹ️ 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 on lines +425 to +427
match prod_role_holder_dashboard_instance(selection: selection) {
Absent => none
Present { value: holder } => Present { value: holder.instance_id }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Reconcile the previous broker owner

When prod_role_selection moves away from srv1 or becomes NoProdRole, this only makes the old spec a non-owner; both non-owner branches in live_deploy/emit.dag:1771-1792 return an empty step list, and the host-singleton broker unit is deliberately excluded from owned-artifact reconciliation. Consequently, the previously enabled srv1 broker keeps running from its immutable old release while a moved role can start another broker, leaving two processes with separate local approval stores (or leaving a broker running when production was turned off). The ownership transition needs an explicit stop/disable/removal action for the former host.

Useful? React with 👍 / 👎.

data approval_identity_trust: IdentityTrustStanding = approval_identity_trust_for(listen_host: srv1_dashboard_listen_host)
fn approval_identity_trust_listen_host() -> NonEmptyStr {
match prod_role_holder_dashboard_instance_from_row() {
Present { value: holder } => holder.listen_host

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Derive trust from the broker's actual bind

When the role is moved to the newly tested srv2_deploy_deployment, this selects its dashboard bind of 0.0.0.0 (roadmap_dashboard_instance.dag:1210), so approval_identity_trust_for returns IdentityHeaderTrustNotEstablished and every redemption is rejected at approval_decision_store.dag:593-596. The broker itself still binds approval_broker_listen_host, independently of the dashboard instance (live_deploy/spec.dag:547-560), so tying trust to the holder's dashboard bind makes the moved broker unable to approve or deny anything even when its actual loopback/front-door topology is safe.

Useful? React with 👍 / 👎.

Comment on lines +123 to +124
host: instance.host_identity as HostIdentity,
store_root: dashboard_instance_fabric_storage_root(instance: instance) as String as NonEmptyStr,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Provision fabric directories on the selected host

With prod_role_selection moved to srv2, this placement makes the srv2 spec emit the fabric service and route, but deployment_srv2_target still has ensured_directories: [] (live_deploy/desired.dag:101-112); the socket and store directories are only added by deployment_ensured_srv1_host_directories (live_deploy/spec.dag:1189-1200). On a clean srv2 deployment, the selected store's fabric-storage-door parent and store areas therefore do not exist, so the service cannot bind its Unix socket or open its object/head roots. The fabric directory dependencies need to follow the selected placement rather than remaining srv1-only.

Useful? React with 👍 / 👎.

@gunbai-bot
gunbai-bot Bot marked this pull request as draft October 9, 2026 17:42
@gunbai-bot

gunbai-bot Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Parked as draft under the 2026-10-09 v1 wind-down (closeout owner neat-wolf-604). This PR was opened from a respawned session's worktree flush after the lane was stopped; it is not being integrated. Review 78345's finding (three unstated Absent → srv1 fallbacks in approval_decision_store, approval_request_client and dispatch_preflight) is valid and is recorded here for whoever resumes D2 — it should refuse on Absent or state the divergence beside each. — sent from silent-lark-156

@briansrls
briansrls marked this pull request as ready for review October 9, 2026 18:22

@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: 76d7fb54fb

ℹ️ 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 on lines +122 to +125
Present { value: e } => FabricStoragePlaced {
host: instance.host_identity as HostIdentity,
store_root: dashboard_instance_fabric_storage_root(instance: instance) as String as NonEmptyStr,
endpoint: e,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Preserve fabric state when moving the placement

When prod_role_selection moves from srv1 to srv2, this changes the durable store root from srv1's instance-root child to srv2's distinct instance-root child. Even after the srv2 directory-provisioning issue is fixed, the existing objects and heads remain in the ensured, non-retracted directory on srv1, and a repository-wide search finds no transfer or attachment step before the endpoint flips. The new service therefore exposes an empty fabric history, making existing heads unavailable; moving the role must migrate or reattach the durable store before selecting the new root.

Useful? React with 👍 / 👎.

Comment on lines +424 to +427
fn gunbc_approval_broker_owning_instance_under(selection: ProdRoleSelection) -> NonEmptyStr? {
match prod_role_holder_dashboard_instance(selection: selection) {
Absent => none
Present { value: holder } => Present { value: holder.instance_id }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Provision approval keys on the selected broker host

When the role is moved to srv2, this makes the srv2 instance own and start the broker, but auth/approval_keyring_converge.dag:92-100 still explicitly refuses every host except srv1 and its fleet endpoint is also fixed to srv1. Independently of cleaning up the old owner, a clean srv2 therefore lacks /etc/gunbc-roadmap/approval-mac-key and the submission/receipt keys, so the newly selected broker refuses filing and redemption. Key and store provisioning must follow the same selected host before ownership moves.

Useful? React with 👍 / 👎.

Comment on lines +800 to +802
Present { value: holder } =>
if (holder.host_identity as String) == (host as String) {
ProductionPeer { instance: holder }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Exclude the target instance from production peer selection

If prod_role_selection is moved to srv1_lab_codex_feedback_deployment, the srv1 lab apply passes its own host here and receives itself as ProductionPeer. dashboard_instance_apply_preflight then checks dashboard_instances_have_disjoint_owned_paths(instance, production), which is false for the same instance, so every preflight and apply refuses at isolation-preflight. Since the role type permits this built-in deployment, peer selection needs the target instance identity and must not classify the target itself as a peer.

Useful? React with 👍 / 👎.

Comment on lines 1989 to +1992
fn srv1_lab_dashboard_apply() -> DashboardInstanceApplyResult {
dashboard_instance_apply(
instance: srv1_lab_dashboard_instance(),
production: ProductionPeer { instance: srv1_live_dashboard_instance() },
production: dashboard_production_peer_on_host(host: srv1_lab_dashboard_instance().host_identity),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Apply role-based peer selection to the srv2 lab

This update wires the new role-derived peer lookup only into the srv1 lab entries. With the newly tested role assignment to srv2_deploy_deployment, srv2_lab_dashboard_apply and its preflight at lines 2065-2075 still pass a hard-coded NoProductionPeer, so they skip the production liveness readback even though the selected production dashboard is now on the same host. Those srv2 entry points must use the same lookup or an apply can report success without detecting that it disrupted the srv2 production process.

Useful? React with 👍 / 👎.

@gunbai-bot

gunbai-bot Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Closed without folding in the v1 closeout bankruptcy (#13641). The D2 respawn; REQUEST_CHANGES (review 78345): unstated Absent->srv1 fallbacks. Under the bankruptcy rule, only work that serves the frozen seed emission, v2-native development or live operations, and that is complete, survives. The branch is kept for archaeology; no follow-up obligation is created. — sent from neat-wolf-604

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