Commit Graph

2355 Commits

Author SHA1 Message Date
pulse-triage[bot] 48e6356c5c Integrate reviewed alert Off and Patrol FAQ clarification
Preserve the exact PI candidate and its retained renderer and desktop/phone help proof. Existing help only; no alert or Patrol runtime change and no installed relief claim.

Change-source: pulse-maintainer
2026-10-11 19:30:16 +01:00
pulse-triage[bot] 74e1f1ddc7 Integrate reviewed updater sink and smoke fixture repairs
Preserve exact Delivery commits 5ef1729292 and cd1d162e30. Retained installer/vet and final smoke proofs cover unchanged fixture scopes; production verification, deadlines and recovery matrix are unchanged.

Change-source: pulse-maintainer
2026-10-11 19:15:56 +01:00
pulse-triage[bot] 3c8fb29af8 Explain the boundary between alert Off and Patrol findings
The FAQ promised every metric could be disabled globally or per resource with -1. Clarify supported editor controls, overriding thresholds, unchanged collection, queued notifications and the existing Patrol fallback. Keep ordinary notification help reachable without generating new alerts.

Contract-Neutral: Existing help and its source/rendering/browser checks only; no alert, notification, Patrol, settings or API behaviour changes.
Change-source: pulse-maintainer
2026-10-11 19:03:47 +01:00
pulse-triage[bot] 399fbad197 Integrate reviewed private token-file format guidance
Accept existing-help maintenance with retained exact-source documentation controls, frontend type-check/docs tests/build and desktop/phone renderer proof. This does not establish installed Pi authentication or reporting recovery.

Change-source: pulse-maintainer
2026-10-11 18:52:41 +01:00
pulse-triage[bot] cd1d162e30 Exercise updater smoke trap cleanup past its explicit runtime handoff
The RETURN-trap smoke fixture has a simulated manager and script binary, not a real managed Linux process. Provide its exact-service/new-version comparator and require exactly one success-path invocation, with none on prerelease refusal. Keep actual process-identity refusals in the independent source/native controls; do not relax production verification.

Change-source: pulse-maintainer
Contract-Neutral: Legacy shell smoke fixture correction only; production updater and its running-executable, signing, restoration and deadline contracts are unchanged.
2026-10-11 18:43:48 +01:00
pulse-triage[bot] 5ef1729292 Keep real updater sink checks inside native deadlines
Use a counted-NUL shell logger double instead of starting Python for every installer line. Keep production log(), complete pipe draining, all eight first/later/final-error recovery cases and the existing 45-second bound. Require exact argument-frame and failure-sequence controls in the Go acceptance wrapper.

Change-source: pulse-maintainer
Contract-Neutral: Confined installer test fixture optimisation only; production updater, signing, native oracle, recovery matrix and safety deadlines are unchanged.
2026-10-11 18:36:24 +01:00
pulse-triage[bot] 322ecc5964 Integrate reviewed native updater readback drift rejection
Preserve the exact Delivery candidate and its parent-bound source proof. The repaired acceptance oracle requires stable managed process identity and independent authenticated executable hashes; portable validation does not establish native or customer recovery.

Change-source: pulse-maintainer
2026-10-11 18:28:56 +01:00
pulse-triage[bot] 9c51001283 Explain literal agent token-file formats without exposing credentials
Keep bare, quoted, prefixed and unknown file forms distinct from credential selection and successful reporting. Link the existing private-file installation to non-destructive guidance, and verify its source alignment, rendered table and keyboard navigation.

Contract-Neutral: Help and regression controls only; no token parsing, authentication, permission, installer or runtime contract change.
Change-source: pulse-maintainer
2026-10-11 18:11:40 +01:00
pulse-triage[bot] 9c18dcec59 Reject drift during native updater executable readback
The current native acceptance oracle can return success without a manager observation after comparing running executable bytes. Bracket the comparison with stable active process identity and compare both executables independently to the authenticated fixture, so a changing PID or equally wrong destinations cannot pass. Add required portable drift/refusal controls without changing installer authority or hosted admission.

Change-source: pulse-maintainer
2026-10-11 18:07:53 +01:00
pulse-triage[bot] bd38f26a50 Compare evaluation fixture command arguments without IFS joining
The sourced installer deliberately uses newline/tab IFS. Assert the three Docker arguments separately rather than joining them with the installer's separator. Runtime source and refusal bounds remain unchanged.

Contract-Neutral: Test-only argument-vector assertion repair; no runtime or operator contract changes.
Change-source: pulse-maintainer
2026-10-11 17:37:02 +01:00
pulse-triage[bot] bf40374241 Repair unlicensed provider-MSP production startup
Use the same Compose configuration before and after best-effort evaluation issuance. Preserve two-client unsigned evaluation, signed renewal restarts, explicit invalid-file refusal and the Pulse-hosted licence requirement.

Add real release-daemon restart/readback controls and secret-free hosted Compose acceptance for the actual placeholder and licensed mounts.

Change-source: pulse-maintainer
2026-10-11 17:26:10 +01:00
pulse-triage[bot] 1ead9579a4 Reconcile recorded upstream admin-uninstall and scope documentation repairs
Change-source: pulse-maintainer
2026-10-11 17:05:41 +01:00
pulse-triage[bot] 2570dcc067 Reconcile upstream attention lifecycle scope admission
Incorporate the exact upstream frontier observed during publication while preserving every reviewed local commit. The upstream correction separates attention lifecycle mutation admission from reads and action planning; combined final-source validation remains required.

Change-source: pulse-maintainer
2026-10-11 16:42:42 +01:00
rcourtman a65e18d9b3 docs: state the scopes for token regeneration and resource links
Follows the token scope fixes. POST /api/security/regenerate-token now
needs an instance-wide full-access token from API-token callers and
replaces every stored token; the reference says so and points scoped
tokens at the per-token rotate route. POST /api/resources/{id}/link,
/unlink and /report-merge need monitoring:write.

test_api_reference_routes.py pins each of these to the code that
enforces it, so the reference and the gates cannot drift apart again.
Each pin fails when the code or the reference is reverted.

Contract-Neutral: Customer docs corrected to match shipped behaviour; no runtime, API or contract change.
2026-10-11 16:34:02 +01:00
rcourtman 66d4239307 docs: stop labelling free Patrol routes as Pro
The API reference marked the Patrol stream, manual run, acknowledge,
snooze, suppress, suppressions and dismissed routes "(Pro)" and promised
a 402 when unlicensed. None of them is licence-gated: Patrol and
managing its findings are free (ai_patrol is a free feature, and the
frontend offers these controls on every plan). Only governed fixes need
Pro. The routes now show the scope they actually require and the
reference says what Community gets, including the one-full-run-per-hour
cap on manual runs.

Also corrects the findings routes: reinvestigate is Pro and needs the
ai_autofix entitlement and a Patrol mode above Watch only, and
reapprove is retired and always answers 410.

scripts/tests/test_api_reference_routes.py gains checks that a Patrol
route documented without a paid label has no licence wrapper in its
registration, and that reapprove is documented as retired. Each fails
when its claim is reverted.

Contract-Neutral: Customer docs corrected to match shipped behaviour; no runtime, API or contract change.
2026-10-11 16:02:29 +01:00
pulse-triage[bot] 1438ffa1bd Integrate reviewed monitoring-credential and runner recovery help
Change-source: pulse-maintainer
2026-10-11 15:46:00 +01:00
pulse-triage[bot] 3b04cb5971 Reconcile current API reference and TrueNAS documentation
Incorporate the exact upstream head observed during publication without rewriting accepted integrations or the additive safety-help test correction.

Change-source: pulse-maintainer
2026-10-11 15:41:33 +01:00
rcourtman 9031dd949c docs: correct API reference auth labels and add missing routes
Audited every HTTP route the server registers against docs/API.md.
Where a documented route and the code disagreed, or an integrator-facing
route was missing, the reference now matches the code.

- Auth and scope labels: notifications, SSO providers, license
  activate/clear, security reset-lockout, availability targets, agent
  profiles (every method needs settings:write for tokens), relay settings
  and the resource metadata routes (no admin requirement).
- Behaviour: POST /api/notifications/test targets one channel per request,
  the storage detail route is GET /api/storage/{storageId} (not a list at /api/storage/), token
  rename-only updates are accepted, validate-token moved out of the Audit
  Log (Pro) section because it has no licence gate, and the setup script
  is public.
- Retired routes: /api/ai/remediation/execute and /rollback always answer
  410 Gone, as approve already documented.
- Newly documented: GET /api/ai/patrol/runs/{id}, POST
  /api/availability-history, POST /api/agents/agent/{id}/allow-reenroll,
  PUT /api/truenas/connections/{id} and its /test route.

scripts/tests/test_api_reference_routes.py pins the corrections to the
router so later drift fails a test: every scope named on a route line must
exist in pkg/auth/scopes.go, the newly documented routes must exist in the
router, and the retired routes must say 410. It fails on the previous
reference and passes on this one.

Each doc is mirrored under frontend-modern/public/docs and updated in
both places. Labels where the docs and the code disagree about licence
gating are left alone; that needs a product decision, not a doc edit.

Contract-Neutral: Customer docs corrected to match shipped behaviour; no runtime, API or contract change.
2026-10-11 15:13:29 +01:00
pulse-triage[bot] d1c93855ff Clarify legacy monitoring credentials and separate runner recovery help
Use the supplied Doctor wording to separate collector privilege, credential scope and runner posture. Preserve both supported command paths and working monitoring; make profile choice deliberate rather than a connection diagnostic.

Contract-Neutral: Documentation and rendered-guide checks only; no command authority, credential issuance, admission, dispatch or recovery contract changes.
Change-source: pulse-maintainer
2026-10-11 14:23:38 +01:00
pulse-triage[bot] 6274777a4e Integrate reviewed running-executable update acceptance
Accept exact Delivery commits with retained source-z6bm51cn installer, race, vet and real-embed proof. Active forward and restored service acceptance now require stable MainPID and matching process bytes; uncertainty retains the backup without a new restart or rollback grant. Native containing-source follow-through remains separate.

Change-source: pulse-maintainer
2026-10-11 14:23:30 +01:00
pulse-triage[bot] 94ada96ae3 Reconcile upstream customer documentation corrections
Incorporate the upstream frontier recorded at the start of this coordination batch; retain reviewed local history and independent proof bindings.

Change-source: pulse-maintainer
2026-10-11 14:23:21 +01:00
rcourtman 8a99b16d6c docs: correct customer docs that drifted from the source
Audited the customer-facing docs against the code: about 5,200 concrete
claims (env vars, endpoints, flags, defaults, ports, UI labels), plus every
environment variable the code reads. Each discrepancy was re-verified
against the source before editing, and every edit was reviewed again.

What users would have hit following the old text:
- UI paths and labels that no longer exist (Settings > Relay, Platform
  connections, Access Control, SSO Providers, Create Organization) and
  Patrol mode names (now Ask first, Safe auto-fix, Autopilot).
- Wrong values and behaviour: LOG_MAX_AGE=0 does not disable cleanup,
  Patrol evidence budget is 10 calls and 12 turns, ALLOW_UNPROTECTED_EXPORT
  covers private networks too, PULSE_AUDIT_ASYNC defaults on.
- Agent install: install.sh ignores PULSE_ENABLE_KUBERNETES and
  PULSE_ENABLE_PROXMOX, rejects --disable-auto-update, and the token
  fallback lives in the state directory.
- API: audit endpoints answer 402 on Community, onboarding QR is GET,
  type=container is rejected, several routes need admin plus a scope.
- HTTP_REDIRECT_PORT was not documented anywhere.

Docs are mirrored under frontend-modern/public/docs, so each change is
applied to both copies. The tests that pinned the old wording (including
three that asserted claims the code contradicts) are updated alongside.

Contract-Neutral: Customer docs corrected to match shipped behaviour; no runtime, API or contract change.
2026-10-11 13:59:56 +01:00
pulse-triage[bot] 3448dc2770 Align updater discovery and URL fixture handoffs
Keep simulated process acceptance explicit in portable discovery and URL controls. Require the running-executable callback to receive the same selected service; refused and prior-inactive URL cases must not invoke it. Actual owned process identity remains covered independently.

Change-source: pulse-maintainer
Contract-Neutral: Portable fixture adapters and assertions only; no change to production acceptance or deployment contract.
2026-10-11 13:43:36 +01:00
pulse-triage[bot] b5b92e1151 Separate refused Docker plans from uncertain workload updates in help
Use the existing planning error and Agent Doctor authority wording before workload inspection. Keep an earlier sent action and missing receipt unresolved, and route command-capable hosts to connection/admission help without retries or wider grants. Check rendered links, stage ordering and the implementation evidence.

Contract-Neutral: Existing workload-update help and documentation checks only; no action, authentication, command-admission or recovery contract changes.
Change-source: pulse-maintainer
2026-10-11 13:35:18 +01:00
pulse-triage[bot] e053355179 Keep updater proof controls within their declared scopes
Supply the connected manager double's fixed comparator and keep its simulated process readback explicit. Separate mandatory real-sink controls from service-state deadlines without removing cases or extending either 45-second bound.

Change-source: pulse-maintainer
Contract-Neutral: Test fixture correction only; the running-executable acceptance contract added by the parent is unchanged.
2026-10-11 13:09:02 +01:00
pulse-triage[bot] 7eb12d0bf5 Require running executable proof for unattended update success
An installed target version and active service can conceal an old managed executable. Compare the actual process bytes between complete bounded MainPID observations before accepting an update or restored active service. Retain the backup and current service on uncertainty without an automatic restart or rollback grant. Register real owned-process and conditional transaction controls; keep synthetic/native and customer acceptance distinct.

Change-source: pulse-maintainer
2026-10-11 12:53:23 +01:00
pulse-triage[bot] 1761f602f0 Keep retest timeout conditional until the issue is closed
A reporter reply of any kind interrupts the silence condition, and another human's continuing failure after day fourteen must still prevent timeout closure. Make those standing conditions explicit in the public explanation and its renderer/doc checks; do not limit the evidence window to the first fourteen days.

Contract-Neutral: Refines documentation of the existing retest-timeout conditions only; no runtime or wire contract changes.
Change-source: pulse-maintainer
2026-10-11 12:35:04 +01:00
pulse-triage[bot] de4751f25a Explain safe retesting and contesting an issue closure
The standing triage-link destination explains source and release availability but omits what a retest-timeout close means. Document every-symptom resolution, the stable-release contact clock and exclusions, and returning to the original issue with safe existing evidence. Keep timeout separate from confirmed recovery, with shipped-mirror and production-renderer coverage.

Contract-Neutral: Documents existing issue resolution and stable retest-timeout policy only; no runtime or wire contract changes.
Change-source: pulse-maintainer
2026-10-11 12:26:19 +01:00
pulse-triage[bot] ad5d1c1db5 Integrate reviewed unattended updater log-sink repair
Preserve the exact Delivery candidate and its retained normal, race, parent-control and embedded-build evidence. This repairs hidden logger failures, not the reported LXC stop cause.

Change-source: pulse-maintainer
2026-10-11 12:14:50 +01:00
pulse-triage[bot] 6626f51131 Integrate reviewed memory baseline support guidance
Accept the exact Product intelligence candidate as existing-flow guidance maintenance. Preserve passive collection and uncertainty; guidance does not establish runtime memory recovery.

Change-source: pulse-maintainer
2026-10-11 11:28:58 +01:00
pulse-triage[bot] a8fadc30e4 Retain real unattended updater log-sink failures
Conditional Bash callers hid a failed logger write behind successful stdout. Attempt both sinks, return the first failed sink, and exercise the unchanged draining collector and recovery path with the real log primitive and confined external logger. Preserve the distinction between observed pipeline completion and native or customer recovery.

Change-source: pulse-maintainer
2026-10-11 11:22:21 +01:00
pulse-triage[bot] 2ca102cc21 Distinguish memory baseline regressions from growth in support guidance
The latest memory report is about a higher steady baseline, not a leak. Keep steady regressions actionable, separate unlike process ages and CPU savings from RSS recovery, and preserve existing evidence without another restart, downgrade or profile. Keep the shipped guides, optional intake and regression controls aligned.

Contract-Neutral: Clarifies interpretation of existing memory reports and documentation only; no runtime, API, route, collection recipe, label synchronizer or subsystem contract changes.
Change-source: pulse-maintainer
2026-10-11 10:56:42 +01:00
pulse-triage[bot] 236ee7b96a Read native fixture verdicts across their phase output
The exact-source installer suite exposed a result-reader defect: successful unittest methods emit phase markers before their final ok verdict. Retain complete unique method results across that output, reject missing/duplicate/mismatched identities, and keep the required Linux and portable-control verdicts unchanged.

Contract-Neutral: Test-result parsing only; no native fixture, platform admission, signing, installer, updater, recovery or customer contract delta.
Change-source: pulse-maintainer
2026-10-11 10:34:57 +01:00
pulse-triage[bot] cb1f5630f7 Repair native updater signer setup and platform-specific controls
The source-bound hosted receipt stops before any native phase because its new ephemeral signer is mode 0644. Establish owned regular-file and verified 0600 mode before signing, without adopting existing keys or relaxing OpenSSH. Keep Linux ELF execution in both native Linux jobs; macOS still runs the portable signer/admission/recovery controls, and the bridge requires the exact platform verdict instead of staging Mach-O as Linux.

Change-source: pulse-maintainer
2026-10-11 10:09:34 +01:00
pulse-triage[bot] 0e7951b01a Keep native updater controls on supplied fixture tools
The current macOS CI drops its already provisioned GNU tools inside the connected updater fixture and reaches incompatible BSD tar. Capture only the needed supplied executables and require end-to-end tool use; keep the production harness environment scrubbed. Retain non-secret stage, file metadata and closed diagnostic markers for the actual hosted signer failure, without publishing signer output or inferring its cause.

Contract-Neutral: Confined native CI tool selection and additive non-secret failure observations only; no public installer, updater, signing, service, permission or customer contract changes.
Change-source: pulse-maintainer
2026-10-11 06:38:03 +01:00
pulse-triage[bot] 768ac3b77b Integrate reviewed native updater scratch ownership
Retain exact Delivery candidate 8cb66ef0f7. Allocate disposable native-CI scratch before child observation, preserving exclusive refusal and cleanup ownership. Related canonical fixture HOME correction is retained; no product, frontend or infrastructure change.

Change-source: pulse-maintainer
2026-10-11 06:14:10 +01:00
pulse-triage[bot] 1b12d56808 Align batch fixtures with shared clocks and owned scratch admission
PR2817 completed CI at aebb17c9 with three frontend assertions that still required the superseded static age and TERM-grace log recipe. Assert the accepted shared clock and hard eight-second, 256-KiB bounds instead. Both macOS native-contract jobs also found the lab directory already present at admission; give tool startup an existing owned temporary HOME and require it in the confined manager, keeping NativeLab scratch ownership and cleanup refusal unchanged.

Contract-Neutral: Test-only integration reconciliation; preserve product source, public contracts, production deadlines, scratch admission and safety gates.
Change-source: pulse-maintainer
2026-10-11 06:05:19 +01:00
pulse-triage[bot] 8cb66ef0f7 Own native updater scratch before child observation
Current publisher CI fails both macOS installer controls with FileExistsError during scratch allocation. Allocate and record ownership before the first manager child can initialise HOME, retaining exclusive refusal of pre-existing directories and symlinks. Add discriminating allocation, early-refusal and cleanup controls; no systemd or platform result is manufactured.

Contract-Neutral: Correct disposable CI harness allocation ordering and regression controls; product updater, installer, signing, service and recovery contracts are unchanged.
Change-source: pulse-maintainer
2026-10-11 05:48:17 +01:00
pulse-triage[bot] f027c9fc07 Integrate reviewed ordinary notification runtime CI guard
Preserve exact Delivery commits and retained real-embed proof; check ordinary saved-policy delivery and restart without product or permission changes.

Change-source: pulse-maintainer
2026-10-11 05:34:44 +01:00
pulse-triage[bot] 89a3381ffc Respect deployment telemetry lock in notification CI journey
Keep outbound telemetry disabled through the process environment, test the expected locked-field refusal, and save only the unrelated notification fields. Assert the lock on restart rather than attempting to persist it.

Contract-Neutral: Correct the CI-only synthetic journey and its controls; product settings, deployment restrictions, permissions and runtime contracts are unchanged.
Change-source: pulse-maintainer
2026-10-11 05:18:21 +01:00
pulse-triage[bot] cbc387ab91 Check ordinary saved-policy notifications and restart in CI
Reuse the real-embed application to verify authenticated live startup, narrow destination admission, monitoring-only token scope, ordinary alert delivery, persisted sessions and saved policy across a real process restart. Keep source/binary identity, single-submission mutation rules and owned child/listener cleanup in a bounded receipt. This prevents component passes from hiding application-path regressions without another build or host capability.

Contract-Neutral: CI-only validation of existing authenticated notification and persistence behaviour; no product, permission, installer or release contract delta.
Change-source: pulse-maintainer
2026-10-11 05:12:08 +01:00
pulse-triage[bot] 16edccf6d2 Clarify Docker-only tokens in host authentication triage
Separate a registered Docker reporting token from the scopes needed by the host module. Keep scope rejection distinct from HTTP 401 and identify the token-generation screen before changing credentials or reinstalling.

Contract-Neutral: Documentation and source-alignment controls only; no authentication, token authority, runtime or install contract changes.
Change-source: pulse-maintainer
2026-10-11 05:03:08 +01:00
pulse-triage[bot] 8dcf561e4e Check absent agent-token registration before another install
A normal-host enrolment report supplies lookup and host-report 401s, repeated installs and an absent inventory record. Document one named server-side registration check before touching the affected agent, with separate limits for persistence, credential hand-off and accepted reports.

Contract-Neutral: Existing authentication help and its source-alignment controls only; no runtime, API, scope, route or credential-policy change.
Change-source: pulse-maintainer
2026-10-11 04:09:06 +01:00
pulse-triage[bot] fcc633337e Bound copied log diagnostics by bytes as well as records
Cap server and agent excerpts at 256 KiB before display or request-ID search. Buffer only a bounded owner-only temporary file, preserve reader failures, and apply the hard deadline to the complete read-only pipeline. Exercise exact-size, overflow, stream, privacy, cleanup and closed-pipe deadline controls without accessing a real journal, daemon or service.

Contract-Neutral: Documentation-only passive log recipe bounds and executable copied-recipe tests; no runtime, API, authentication, installer or monitoring contract change.
Change-source: pulse-maintainer
2026-10-11 02:24:14 +01:00
pulse-triage[bot] dbf65f305c Audit main without directing dependency repairs to retired lines
The latest daily advisory watch passes main and fails only retained release branches, then recommends backports that no longer have a delivery route. Keep the complete strict main audit, read-only/cache-free execution and security proof, remove obsolete line discovery and give accurate main repair and containing-release guidance. Add fixed-main recipe, retired-branch refusal and preserved strict-audit controls.

Change-source: pulse-maintainer
2026-10-10 23:43:37 +01:00
pulse-triage[bot] bc1fed0594 Integrate reviewed bounded memory diagnostic recipe
Preserve the exact reviewed b0a567cb candidate and dcd68512 repair. Retained source-od0gj8fl proves ordinary owned-child sampling, deadline cleanup and privacy controls; no runtime memory relief is claimed.

Change-source: pulse-maintainer
2026-10-10 22:49:14 +01:00
pulse-triage[bot] b0a567cb54 Merge commit 'dcd6851220a56f3ada34abb71a41dd13b95b5e7d' into maintainer-async/20261010T211905Z-product-intelligence/pulse
Change-source: pulse-maintainer
2026-10-10 22:22:46 +01:00
pulse-triage[bot] 0eca75915b Register native updater ownership and ordered proof routes
Repair candidate preflight's two registry failures without weakening the audit: declare the native harness as deployment-installability runtime and order its exact dedicated proof paths. Add live-route and adverse drift regression controls, and record canonical ownership in the contract.

Change-source: pulse-maintainer
2026-10-10 22:11:01 +01:00
pulse-triage[bot] 491e872adb Refuse tracked source drift before native updater compilation
The checkout label alone cannot establish source bytes after frontend preparation. Require an unchanged tracked tree before compiling the private pair; the exact recipe control now rejects dirty source before either compiler or root command and preserves all existing failure propagation.

Contract-Neutral: Implements existing exact-source admission on tracked bytes; native runtime, input and completion contracts are unchanged.
Change-source: pulse-maintainer
2026-10-10 21:44:17 +01:00
pulse-triage[bot] 2ce307154f Keep native updater fixture traffic on loopback
Use the existing BIND_ADDRESS setting in the fixed fixture environment, alongside telemetry opt-out. The connected production-function control verifies this exact private profile and persistence across all seven phases; no product default or native manager safeguard changes.

Contract-Neutral: Fixed local fixture environment only; source/native admission and transaction-completion contracts are unchanged.
Change-source: pulse-maintainer
2026-10-10 21:25:19 +01:00