CluPilotCloud/app/Support
nexxo 823eeaf413 Refuse a key that does not belong to the slot it sits in
put('stripe.secret', 'sk_live_REALMONEY') in test mode was accepted,
get() handed it out, billing.stripe_secret reported satisfied, and the
badge above it said "Testbetrieb". The strict rule closed the automatic
route into that state (no fallback); the typed one stayed open.

The prefix decides it without touching the network, and that rule now
lives in ONE place — OperatingMode::ofStripeKey() — called by the three
that were answering it separately: the slot migration (unchanged verdict,
`?? Live` for a value it cannot place), StripeCheck's `live` flag
(unchanged verdict, null stays false), and the readiness check, which
never asked at all. A key it cannot place is not reported as a
contradiction: this check only says what it can prove.

The two directions get their own `breaks` sentence, because the
consequences are opposite — real money moving while the console says
test, versus no money moving while the order looks paid.

The "Prüfen" button no longer contradicts the check either: the page
rendered only ok/reason, so a live key in the test slot answered
"Geprüft: in Ordnung". It now names the account the key belongs to.

Red first:

  ⨯ it refuses a live key sitting in the test slot
  ⨯ it refuses a test key sitting in the live slot
  ⨯ it says what the wrong key does, not that a field is empty

Guard tests (ConfirmInModal, ModalHeight, IconLayout, DisplayTimezone)
run with the blade change: green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:05:58 +02:00
..
Readiness Refuse a key that does not belong to the slot it sits in 2026-07-30 17:05:58 +02:00
AdminArea.php Let the console keep its recovery hostnames without breaking route caching 2026-07-27 06:20:44 +02:00
Bytes.php feat(traffic): meter the monthly allowance, show it, throttle instead of blocking 2026-07-25 23:33:47 +02:00
CompanyProfile.php Quote what a person pays, and tab the settings page 2026-07-29 19:18:10 +02:00
LocalTime.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
Money.php Make the console's access list reach the proxy, price in euros, and answer errors 2026-07-27 06:51:05 +02:00
Navigation.php Put every missing field on one page before a customer pays 2026-07-30 15:59:34 +02:00
NextcloudOcc.php Fix nine defects in the provisioning pipelines 2026-07-30 01:34:55 +02:00
OfficialDomains.php Always name the host we are being served from, and stop promising a duration 2026-07-29 17:10:06 +02:00
OperatingMode.php Refuse a key that does not belong to the slot it sits in 2026-07-30 17:05:58 +02:00
ProvisioningSettings.php Read the support mailbox into the console 2026-07-29 21:41:29 +02:00
Readiness.php Notice when nobody is picking up the queue 2026-07-30 14:32:09 +02:00
Settings.php Close the data-loss paths the review found in the mailbox takeover 2026-07-28 01:15:50 +02:00
StripeWebhookSecret.php Verify webhooks against the secret of the mode we are in 2026-07-30 12:13:55 +02:00