CluPilotCloud/tests/Feature
nexxo e8b51f3c70
tests / pest (push) Waiting to run Details
tests / assets (push) Waiting to run Details
tests / release (push) Blocked by required conditions Details
Der Waechter nimmt die Sperre erst beim Eingriff, nicht beim Nachsehen
Der Update-Agent meldete dauerhaft "kommt nicht an die Arbeit", obwohl nichts
kaputt war. Wächter und Agent haben beide einen minütlichen Zeitgeber und nahmen
beide `.agent.lock` in ihren ersten Zeilen — bevor sie wussten, ob sie überhaupt
etwas tun würden. Der Wächter tut an fast jedem Tag nichts: seine vier Prüfungen
sind allesamt lesend. Er hielt die Sperre trotzdem, jede Minute; der Agent kam
leer aus und schrieb einen Übersprung-Vermerk. Weil der Agent der ist, der an die
Konsole berichtet, stand dort eine Dauerstörung, während beide Dienste genau das
taten, was sie sollten.

Der Wächter sieht jetzt ungesperrt nach und nimmt die Sperre erst, wenn wirklich
etwas zu richten ist — im gesunden Fall fasst er sie nie an. Wo er eingreift,
wird die Lage nach dem Nehmen der Sperre noch einmal geprüft: zwischen dem
ungesperrten Blick und der Sperre kann ein Update fertig geworden sein, und
`--force-recreate` auf gesunde Container reißt jede offene Verbindung ab.

Versetzte Zeitgeber wären nur seltener gewesen, nicht weg — zwei Takte derselben
Länge wandern gegeneinander, und systemd zieht sie über AccuracySec aktiv auf
gemeinsame Weckpunkte zusammen. Eine zweite Sperre wäre schlimmer als der Fehler
gewesen: dann liefe der Wächter mitten in ein Update hinein.

Dazu zwei Dinge, die derselbe Vorfall aufgedeckt hat:

- Vierzehn Aufrufe nach draußen standen im Wächter ohne Frist, alle unter der
  Sperre. Der Agent hat `timeout -k` am 4. August gelernt, der Wächter nie — ein
  `docker compose exec`, das auf den Daemon wartet, hätte die Sperre unbegrenzt
  gehalten.
- Ein übersprungener Lauf sah im Journal aus wie ein erfolgreicher: der Agent
  beendet sich sauber, systemd meldet Starting → Deactivated. Das hat die
  Fehlersuche zweimal in die falsche Richtung geschickt. Er sagt es jetzt, mit
  Halter und Zähler in der Zeile.

WatchdogLockContentionTest lässt beide echten Skripte gegeneinander laufen statt
die Sperrenlogik nachzurechnen — und prüft beide Richtungen: der Agent kommt an
die Arbeit, während der Wächter nur nachsieht, und der Wächter hält still,
während ein Update die Sperre hält.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 14:08:44 +02:00
..
Admin Version 1.7.1 — der Zweig mit der Sperren-Freigabe kommt nach main 2026-08-04 10:37:27 +02:00
Auth Ein Rückweg aus der abgelaufenen Betreiber-Einladung 2026-08-04 02:24:13 +02:00
Billing Kuendigung B1, Fix-Welle: der Platz wird frei, und das Loeschen ist vollzogen 2026-08-04 12:39:06 +02:00
Cancellation Kuendigung B1, Fix-Welle: der Platz wird frei, und das Loeschen ist vollzogen 2026-08-04 12:39:06 +02:00
Console Kuendigung B1, Fix-Welle: der Platz wird frei, und das Loeschen ist vollzogen 2026-08-04 12:39:06 +02:00
Host Hostnamen vergibt CluPilot: ein Name statt zweier, und der Zaehler ueberlebt das Loeschen 2026-08-01 13:45:43 +02:00
Mail Das Postfach, auf dem alles steht, gibt es jetzt — leer und abgeschaltet 2026-08-03 23:57:54 +02:00
Nextcloud Jemanden aus einer Gruppe zu nehmen, in der er nicht ist, ist kein Fehler 2026-08-03 23:57:15 +02:00
Portal Portal: Karte tauschen, offene Rechnungen begleichen, Hinweis bei Faelligkeit 2026-07-31 21:12:31 +02:00
Provisioning Kuendigung B1, Task 1: einzelner vzdump und Nachschau auf der Ablage 2026-08-04 10:48:58 +02:00
Readiness Die Bereitschaftsseite meldet eine Spur, die steht 2026-08-03 18:37:20 +02:00
Seats Die zweite Tuer zur selben Attrappe, und die Adresse, die dem Kundenkonto gehoert 2026-08-04 00:33:48 +02:00
Security Jede Mail faehrt wieder ueber ihren eigenen Mailer 2026-08-03 20:36:20 +02:00
BillingTest.php Die neue Leiter: Start 39, Team 79, Business 139 2026-08-01 17:05:58 +02:00
BladeCommentsTest.php Sell the year as well as the month, and say what it saves 2026-07-30 15:44:35 +02:00
CartTest.php Die neue Leiter: Start 39, Team 79, Business 139 2026-08-01 17:05:58 +02:00
ChartLiveUpdateTest.php Release v1.3.91 — die Host-Seite zeigt Last statt Ausstattung 2026-08-01 10:24:21 +02:00
CheckoutPageTest.php Die neue Leiter: Start 39, Team 79, Business 139 2026-08-01 17:05:58 +02:00
CheckoutWithoutStripeKeyTest.php Pin the one question that must never throw 2026-07-30 16:58:22 +02:00
ComponentTest.php feat(portal): Fortify auth + Login/2FA/Dashboard + component kit 2026-07-25 01:20:25 +02:00
ConfirmInModalTest.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
ConnectionStateTest.php Recover silently from an expired session, and show a connection banner when offline 2026-07-28 21:36:21 +02:00
ContactRequestTest.php Anfrage zuerst in den Posteingang, dann erst die Mail: ein gescheiterter Versand darf sie nicht verschlucken 2026-08-01 23:50:35 +02:00
CustomDomainServingTest.php Fix nine defects in the provisioning pipelines 2026-07-30 01:34:55 +02:00
CustomDomainTest.php Close the domain page to packages that may not have one 2026-07-29 16:20:21 +02:00
CustomerTwoFactorTest.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
DashboardTest.php Stop mailing the initial admin password, hold it in the panel until noted 2026-07-28 23:19:20 +02:00
DeliveryPromiseTest.php Die neue Leiter: Start 39, Team 79, Business 139 2026-08-01 17:05:58 +02:00
DeploymentRunsAsTheAppUserTest.php Der Waechter nimmt die Sperre erst beim Eingriff, nicht beim Nachsehen 2026-08-04 14:08:44 +02:00
DisplayTimezoneTest.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
DoubleOptInTest.php Require a confirmed address before an account can use anything 2026-07-28 23:43:20 +02:00
DowngradeTest.php Refuse the sale instead of reaching Stripe without a key 2026-07-30 11:58:01 +02:00
EditInModalTest.php R20: Begruendung im Modal, und der Waechter sieht jetzt auch Listenzeilen 2026-07-31 22:09:05 +02:00
EnsureCustomerActiveTest.php Satisfy Pint on the two new guard-boundary tests 2026-07-28 15:10:58 +02:00
ErrorPagesTest.php Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
ExampleTest.php chore: bootstrap CluPilot control-plane (Laravel 13, Docker stack) 2026-07-25 00:21:30 +02:00
GrossPricingTest.php Die neue Leiter: Start 39, Team 79, Business 139 2026-08-01 17:05:58 +02:00
HostStepTest.php Let an update install host packages, without handing out root 2026-07-29 10:27:56 +02:00
IconLayoutTest.php Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
IdentitySeparationTest.php Write down that the console and the portal share no identity 2026-07-28 12:15:13 +02:00
ImpersonationTest.php Refuse a portal login for an address that already belongs to an operator 2026-07-28 14:42:16 +02:00
InstanceMetricsTest.php Measure what the template draws 2026-07-27 16:29:28 +02:00
LandingPriceSheetTest.php Schalter je Paket, ehrliche Statusanzeige, Reste der alten Leiter 2026-08-01 17:53:06 +02:00
MailDispatchTest.php Jede Mail faehrt wieder ueber ihren eigenen Mailer 2026-08-03 20:36:20 +02:00
MailSenderOwnershipTest.php Zwei Empfaengerkreise, und eine Wegwahl, die auch das Konto verschiebt 2026-08-03 17:00:20 +02:00
MailTemplatesTest.php Actually issue the invoice when the money arrives 2026-07-29 03:25:56 +02:00
ModalHeightTest.php R24: a modal is never taller than the screen 2026-07-29 23:33:57 +02:00
MonitoringStatusSyncTest.php Move the console off /admin, give the status page its own address, and measure monitoring 2026-07-27 06:05:40 +02:00
NewDeviceWarningTest.php Recognise the devices an account signs in from, and warn about a new one 2026-07-28 23:28:34 +02:00
OfficialDomainsTest.php Re-apply what the last release commit silently reverted 2026-07-29 17:36:43 +02:00
OperatingModeTest.php Give the installation a test mode and a live mode 2026-07-30 10:41:23 +02:00
PasswordPolicyTest.php Passwortrichtlinie einstellbar, doppelte Anmelde-Mail behoben 2026-07-31 20:53:19 +02:00
PortalHostTest.php Answer on every name for the website, and send them all to one 2026-07-29 01:29:33 +02:00
PortalTabsTest.php Re-apply what the last release commit silently reverted 2026-07-29 17:36:43 +02:00
ProcessingAgreementTest.php Stop asking for a signature the law does not want, and lay out the tab 2026-07-30 17:30:55 +02:00
ProgressStepperTest.php Release v1.3.83 — Fortschritt zeigte Übersetzungsschlüssel 2026-08-01 02:08:28 +02:00
PublicSiteGateTest.php Version 1.7.3 — ein Tor, eine Liste 2026-08-04 11:17:05 +02:00
ReadinessPageTest.php Ein Terminal auf den CluPilot-Server selbst 2026-08-04 10:06:50 +02:00
ReleaseComparisonTest.php Stop the update agent dying on its own tag arithmetic 2026-07-29 00:00:17 +02:00
ReleaseVersionTest.php Move the console's identity out of the customer table 2026-07-28 10:31:43 +02:00
SeatsTest.php Fuenf geparkte Kleinigkeiten nach der Mitarbeiterverwaltung 2026-08-04 01:09:45 +02:00
SecretSlotMigrationTest.php Remember which Stripe account the catalogue was built in 2026-07-30 17:12:56 +02:00
SecretVaultModeTest.php Say which slot the value in force is really coming from 2026-07-30 17:01:33 +02:00
SelfServiceOrderTest.php Die neue Leiter: Start 39, Team 79, Business 139 2026-08-01 17:05:58 +02:00
ServerMarketTest.php Take the order, park it, and say when it will be delivered 2026-07-29 18:50:46 +02:00
ServerTerminalInstallTest.php Ein Terminal auf den CluPilot-Server selbst 2026-08-04 10:06:50 +02:00
SessionListTest.php Show where an account is signed in, and let it sign the other places out 2026-07-28 23:38:17 +02:00
SettingsTest.php Beim Kuendigen wird gefragt, ob der Kunde seine Daten will 2026-08-04 08:29:34 +02:00
SignInMailOnceTest.php Passwortrichtlinie einstellbar, doppelte Anmelde-Mail behoben 2026-07-31 20:53:19 +02:00
SiteDesignSystemTest.php Write the processing agreement and its annex, and let it be downloaded 2026-07-30 17:12:30 +02:00
SparkGapTest.php Release v1.3.94 — die Kurven zeigen wieder, wie ausgelastet der Host ist 2026-08-01 11:56:10 +02:00
StatusHistoryTest.php Let an incident be deleted, and start measuring whether the hosts answer 2026-07-29 15:16:48 +02:00
StripeStrictModeTest.php Make source() respect strict entries like get() does 2026-07-30 11:21:07 +02:00
StripeWebhookSecretByModeTest.php Verify webhooks against the secret of the mode we are in 2026-07-30 12:13:55 +02:00
SupportRequestTest.php Editing in modals, an update button that is not gated on a stale reading, and a support page that is real 2026-07-27 17:55:49 +02:00
SwitchOperatingModeTest.php Fix round: name the slot on the card, and cover the modal that already worked 2026-07-30 15:32:16 +02:00
TrafficTest.php Die neue Leiter: Start 39, Team 79, Business 139 2026-08-01 17:05:58 +02:00
TranslationParityTest.php Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
UpdateAgentSkipCountTest.php Ein einzelner übersprungener Lauf ist kein Ausfall 2026-08-04 09:42:07 +02:00
UpdateLockReleaseOnTheHostTest.php Eine hängende Sperre ist jetzt ein Knopf, kein SSH-Zugang 2026-08-04 10:07:24 +02:00
WatchdogLockContentionTest.php Der Waechter nimmt die Sperre erst beim Eingriff, nicht beim Nachsehen 2026-08-04 14:08:44 +02:00
WelcomeTest.php Give customers two-factor, and stop every button on the settings page reacting at once 2026-07-27 08:48:34 +02:00