Refuse a push that breaks an enumeration proof

c9e6fc8e671a · AtlantisPleb · · parent c812b8e016b1

Refuse a push that breaks an enumeration proof

Every enumeration proof asserts an exact set — the routes an operator
surface publishes, the API families the export ledger classifies, the
modules that may speak to a model. Adding one without naming it turns a
proof red, which is the design working. What did not work is where it
turned red: on main, discovered forty minutes into a release gate, four
separate times today, by someone who did not write the change.

The proofs are about a hundred tests and two seconds. The guard runs them
before the push, so the person who added the thing is the person told to
classify it. Proven both ways: undeclaring a provider makes the guard exit
1 naming it, a clean tree exits 0 in under three seconds.
OPENAGENTS_SKIP_PUSH_PROOFS=1 opts out.

Also declares ToolCallingTestProvider, the fourth such breakage, and adds
the persona boundary and export inventory proofs to the enumeration script
so the gate and the guard check the same set.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KnhfrafYx5ZGaMbzZEJQ2d
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

pushed
by user · WAL seq 411 · 2026-08-25T15:50:16.135550Z

Changed files

  • modified ops/ci/enumeration-proofs.sh
  • modified ops/dev/install-push-guard.sh
  • modified test/openagents/providers/persona_boundary_test.exs

Diff

3 files changed, +21 -1

ops/ci/enumeration-proofs.sh modified +3 -1

@@ -18,4 +18,6 @@ env MIX_ENV=test mix test --warnings-as-errors \

18 18
  test/openagents/forge/deployment_lane_test.exs \
19 19
  test/openagents/capacity_test.exs \
20 20
  test/openagents/accounts/token_vault_test.exs \
21
  test/openagents/machines/token_vault_test.exs
21
  test/openagents/machines/token_vault_test.exs \
22
  test/openagents/providers/persona_boundary_test.exs \
23
  test/openagents/data_rights/export_inventory_test.exs
ops/dev/install-push-guard.sh modified +16

@@ -82,6 +82,22 @@ if [ -f "$repo_root/mix.exs" ] && command -v mix >/dev/null 2>&1; then

82 82
    (cd "$repo_root" && mix format --check-formatted 2>&1 | sed -n '1,20p') >&2
83 83
    exit 1
84 84
  fi
85
86
  # The enumeration proofs. Each one asserts an exact set — the routes an
87
  # operator surface publishes, the API families the export ledger classifies,
88
  # the modules that may speak to a model — so adding a route, a family, or a
89
  # provider without naming it turns one red. They are about a hundred tests
90
  # and two seconds, and they have caught four separate breakages on main in a
91
  # day, each of which otherwise surfaced forty minutes into a release gate.
92
  # Set OPENAGENTS_SKIP_PUSH_PROOFS=1 to push without them.
93
  if [ "${OPENAGENTS_SKIP_PUSH_PROOFS:-}" != "1" ] &&
94
    [ -x "$repo_root/ops/ci/enumeration-proofs.sh" ]; then
95
    if ! (cd "$repo_root" && sh ops/ci/enumeration-proofs.sh >/tmp/openagents-push-proofs.log 2>&1); then
96
      echo "Refusing the push: an enumeration proof failed." >&2
97
      sed -n '1,40p' /tmp/openagents-push-proofs.log >&2
98
      exit 1
99
    fi
100
  fi
85 101
fi
86 102
HOOK
87 103
test/openagents/providers/persona_boundary_test.exs modified +2

@@ -70,6 +70,7 @@ defmodule OpenAgents.Providers.PersonaBoundaryTest do

70 70
    OpenAgents.Providers.FallbackTestProvider => :in_process,
71 71
    OpenAgents.Providers.RecordingTestProvider => :in_process,
72 72
    OpenAgents.Providers.Test => :in_process,
73
    OpenAgents.Providers.ToolCallingTestProvider => :in_process,
73 74
    OpenAgents.Providers.UnconfiguredTestProvider => :in_process,
74 75
    OpenAgents.Voice.OpenAI.CallClient => :outbound_http,
75 76
    OpenAgents.Voice.OpenAI.Sideband => :outbound_socket,

@@ -108,6 +109,7 @@ defmodule OpenAgents.Providers.PersonaBoundaryTest do

108 109
    OpenAgents.Providers.FallbackTestProvider => :adapter,
109 110
    OpenAgents.Providers.RecordingTestProvider => :adapter,
110 111
    OpenAgents.Providers.Test => :adapter,
112
    OpenAgents.Providers.ToolCallingTestProvider => :adapter,
111 113
    OpenAgents.Providers.Request => :the_struct_itself
112 114
  }
113 115

This page updates live while a promote is in flight · changelog