Commit Graph

12094 Commits

Author SHA1 Message Date
pulse-triage[bot] aefbb2b6c4 Verify private-auth help through production rendering
Match the Docs sanitizer's class-free code blocks and the frontend build's Tailwind working directory. The first browser attempt stopped at the obsolete language-class selector; retain it rather than treating it as a page pass.

Contract-Neutral: Browser fixture correction only; shipped guide bytes and runtime contracts are unchanged.
Change-source: pulse-maintainer
2026-10-03 07:46:22 +01:00
pulse-triage[bot] f273e86189 Keep Docker setup credentials private across help languages
Remove the shared-password override from German and Spanish Compose setup and the password-on-argv example from configuration help. Default to bootstrap setup; exercise private-file permissions, argument boundaries and failed preparation with synthetic credentials.

Contract-Neutral: Help and regression fixtures only; authentication, container and API contracts are unchanged.
Change-source: pulse-maintainer
2026-10-03 07:41:56 +01:00
pulse-triage[bot] 6f297a5dc8 Merge reviewed scope-qualified rollback help
Change-source: pulse-maintainer
2026-10-03 07:28:08 +01:00
pulse-triage[bot] 45835634ea Qualify rollback help by updater and backup scope
Separate installation rollback from stopped full-state recovery, correct the install guide's automatic-backup promise and name the verified limited published snapshots. Keep shipped help matched, reject the original unsafe claims and exercise desktop and phone Docs links without claiming the unready backend has shipped.

Contract-Neutral: Documentation and help verification only; no updater runtime or API contract changes.
Change-source: pulse-maintainer
2026-10-03 07:02:30 +01:00
pulse-triage[bot] 697ad83e19 Compose retained organisation-safe History with current main
Preserve exact 2dda2e6653 and the newer recovery, help and drawer fallback work. Fetched disk History must not retain observations across organisation switches with identical resource IDs. Keep the existing receipt unchanged; both original non-merge receipts remain bound to their own parents. The frontend dependency audit remains a separate unresolved delivery gate.

Change-source: pulse-maintainer
2026-10-03 06:13:20 +01:00
pulse-triage[bot] 0b185f9392 Merge reviewed resource evidence fallback access correction
Change-source: pulse-maintainer
2026-10-03 05:44:56 +01:00
pulse-triage[bot] 6e5acd9c02 Keep denied resource evidence out of drawer fallbacks
Final facet access failures must not re-display embedded or unfiltered history. Retain transient snapshots, and show failed action reads with an available retry rather than false empty/loaded states. Preserve the existing unavailable-plan client boundary. Add rejecting parent controls and desktop/touch browser proof.

Change-source: pulse-maintainer
2026-10-03 05:13:32 +01:00
pulse-triage[bot] d16e665e6c Route deployment updates through evidence-preserving procedures
Remove unconfigured Docker and Helm shorthand from the deployment overview. Preserve target edition, existing service and storage scope, and the limits of snapshots and rollback; exercise the maintained help links and regression guards.

Change-source: pulse-maintainer
2026-10-03 04:56:56 +01:00
pulse-triage[bot] 3d9105349f Merge reviewed evidence-preserving update and recovery help
Change-source: pulse-maintainer
2026-10-03 04:45:59 +01:00
pulse-triage[bot] 2dda2e6653 Scope fetched History to the active organisation
Replace HistoryChart request and polling ownership on org changes, even when resource IDs match. Withdraw old readings and inspection without changing same-org outage retention or caller-supplied sample ownership. Preserve touch compatibility-focus suppression. Add original-source controls, production browser verification and the primitive contract.

Change-source: pulse-maintainer
2026-10-03 04:18:12 +01:00
pulse-triage[bot] 227657b1b0 Retain the attempted terminal phase on writer failure
The direct writer-interface control also checks the fixed failed phase. Report the attempted terminal, not the preceding in-memory recovery phase.

Contract-Neutral: Correct the fixed diagnostic label and its existing contract control; restoration, evidence-failure exit and authority remain unchanged.
Change-source: pulse-maintainer
2026-10-03 04:17:11 +01:00
pulse-triage[bot] 5cf724b4e7 Keep recovery independent of its phase writer interface
Exercise direct recovering and terminal OSError injection as well as atomic receipt faults. Preserve the real restored estate and complete watches while evidence loss remains failed and unverified.

Change-source: pulse-maintainer
2026-10-03 04:15:43 +01:00
pulse-triage[bot] f827f7150f Restore owned demo runtime despite receipt I/O failure
Keep evidence loss failed and unverified, preserve snapshots and complete recovery watches, and bind terminal collection and subsequent mutations to the original writer exit. Retain the exact returned candidate and its failing control without expanding production privileges.

Change-source: pulse-maintainer
2026-10-03 04:08:57 +01:00
pulse-triage[bot] ae427e6afe Respect the Docs heading inset in recovery visual checks
The capture wait incorrectly required a zero-pixel heading offset despite the production scroll-margin. Keep the section visible near the viewport start without changing product styles, then rerun the same visual acceptance.

Change-source: pulse-maintainer
2026-10-03 04:07:05 +01:00
pulse-triage[bot] c71bdbbda7 Capture the recovery procedure after theme and scroll settle
Visual inspection caught the desktop manual capture still showing the preceding snapshot section and phone theme transition. Put each checked section at the viewport start and wait for the actual theme transition before retaining the screenshot; product source and guidance are unchanged.

Change-source: pulse-maintainer
2026-10-03 04:04:52 +01:00
pulse-triage[bot] 1b14696d3f Restore reviewed demo candidate for receipt-failure recovery repair
Compose the exact returned candidate on the current assigned main base; retain independent review defect evidence and all newer source.

Change-source: pulse-maintainer
2026-10-03 03:58:18 +01:00
pulse-triage[bot] 4fbb69a7dd Make server update and rollback help evidence-preserving
Replace the destructive hardcoded restore recipe with path and backup-scope checks, the existing history control and reversible recovery guidance. Keep Compose image selection persistent and recreate only Pulse after a successful pull. Verify shipped mirrors, source/UI scope, synthetic command failures and desktop/phone Docs rendering.

Change-source: pulse-maintainer
2026-10-03 03:50:08 +01:00
pulse-triage[bot] e862d622dd Merge reviewed occurrence-qualified pending alert groups
Retain exact Core candidate and its grouping, persistent-delivery and shutdown proof; no notification source changed on the intervening canonical frontier.

Change-source: pulse-maintainer
2026-10-03 03:29:27 +01:00
pulse-triage[bot] a23029a80c Keep demo installation proof aligned with signed runtime operation
The complete installation suite detected the obsolete installer-identity assertion. Require the actual binary/VERSION payload identity check instead and retain the connected Python verdict in verbose and JSON source proof output.

Contract-Neutral: Test-only alignment and proof visibility for the already implemented signed runtime footprint; no runtime, authority or contract delta.
Change-source: pulse-maintainer
2026-10-03 03:15:20 +01:00
pulse-triage[bot] 2c4fdc0372 Merge reviewed History access-denial withdrawal
Change-source: pulse-maintainer
2026-10-03 03:11:54 +01:00
pulse-triage[bot] ff4d3fcb5d Merge reviewed platform navigation help corrections
Change-source: pulse-maintainer
2026-10-03 03:11:33 +01:00
pulse-triage[bot] ac995ef565 Keep pending notification groups occurrence-qualified
Coalesce repeated firing callbacks before delivery into the newest complete occurrence snapshot, retaining distinct and unknown identities and the original grouping deadline. Discard the transient index on cancellation, flush, disable and stop; cancel abandoned firing timers before queue shutdown. Verify ordering, concurrency, routing, persistent restart and actual loopback firing/recovery delivery without changing escalation or retry policy.

Change-source: pulse-maintainer
2026-10-03 03:10:14 +01:00
pulse-triage[bot] a2fc29b70b Limit guarded demo updates to owned signed runtime files
Retain the rejected VERSION rollback result. Replace general installer execution with pinned-signature archive selection and atomic binary/VERSION swaps, preserve unrelated distribution assets, and fail closed on missing matching native acceptance before production mutation.

Change-source: pulse-maintainer
2026-10-03 03:01:05 +01:00
pulse-triage[bot] 90710c5b57 Restore returned demo recovery candidate for complete footprint repair
Retain the independently rejected distribution-state rollback evidence and repair the operation in this assigned worktree; canonical publication remains separate.

Change-source: pulse-maintainer
2026-10-03 02:46:21 +01:00
pulse-triage[bot] 6f5bf96370 Withdraw History readings when access is denied
Treat final HTTP 401/403 as access failures rather than transient refresh outages. Clear displayed samples and inspection, invalidate retained query ranges and remounts, and keep bounded access guidance through scoped recovery. Preserve ordinary outage retention, current-value labelling, abort ownership and license gates with runtime and real-client desktop/touch browser controls.

Change-source: pulse-maintainer
2026-10-03 02:45:14 +01:00
pulse-triage[bot] 63b24757d6 Accept readable wrapped help tables as well as local scrolling
Phone tables can fit through wrapping. Check their container bound, or actual local scroll movement for wide tables, rather than requiring overflow.

Change-source: pulse-maintainer
2026-10-03 02:37:27 +01:00
pulse-triage[bot] 0027f7c9d9 Verify help table cells with the production style configuration
Compare individual route cells rather than Markdown whitespace, and resolve Tailwind from the frontend module so desktop and phone proof inspect the actual styled Docs page.

Change-source: pulse-maintainer
2026-10-03 02:35:45 +01:00
pulse-triage[bot] 661d7c7b2e Activate paired firing work in the receipt-ordering fixture
The queue discovers one concurrent batch at a time; the first HTTP control incorrectly expected another batch to start while the held response was unfinished. Admit both snapshots through the deferred bootstrap owner and then use normal queue activation. Preserve the runtime policy and timeout, and verify each received message explicitly.

Change-source: pulse-maintainer
2026-10-03 02:35:18 +01:00
pulse-triage[bot] 1a1b59072b Point monitoring help at the current platform navigation
Replace retired task-page advice with registered platform routes, TrueNAS tabs and Proxmox backups. Preserve saved connections when troubleshooting missing navigation and distinguish proxy reload failures from missing inventory.

Change-source: pulse-maintainer
2026-10-03 02:32:05 +01:00
pulse-triage[bot] 0dcd592ef2 Keep notification cooldowns ordered by alert occurrence
A late provider completion must retain its own firing receipt without replacing a newer occurrence’s repeat-delivery cooldown. Preserve the latest completion and highest delivered severity within one occurrence, keeping genuine new occurrences and severity increases eligible. Exercise reverse HTTP completion, duplicate admission and durable recovery receipts alongside legacy ordering controls.

Change-source: pulse-maintainer
2026-10-03 02:28:48 +01:00
pulse-triage[bot] ee451f8c8c Restore canonical ordering for demo registry entries
Candidate preflight rejected three path lists that used ASCII or insertion order instead of the registry's case-insensitive order. Sort only those lists and exercise the committed registry in the audit suite so fixture-only passes cannot miss the same mistake.

Contract-Neutral: Canonical registry path-list ordering and regression coverage only; ownership, verification requirements and runtime behaviour are unchanged.
Change-source: pulse-maintainer
2026-10-03 02:23:58 +01:00
pulse-triage[bot] a9533eb82a Merge reviewed disk History collection-independence repair
Preserve exact reviewed c9a0f0bf6a and its parent-bound browser receipt. Retain adequate source-epbmtbp7 frontend proof; delivery and native appliance acceptance remain with their existing owners.

Change-source: pulse-maintainer
2026-10-03 02:19:40 +01:00
pulse-triage[bot] c8cf1047bc Merge reviewed occurrence-qualified alert recovery
Retain exact Core candidate d0d621a7c2 and source proof; preserve current main frontend content.

Change-source: pulse-maintainer
2026-10-03 02:13:17 +01:00
pulse-triage[bot] 489ec9f441 Compose published Pulse main with reviewed snapshot and troubleshooting repairs
Preserve reviewed b6a42d8a and upstream 74fd189f ancestry. Runtime files merge unchanged; resolve the browser manifest conflict using the retained drawer receipt for the newly proposed UI range. Upstream table evidence remains in its original committed history; no new browser run is claimed.

Contract-Neutral: Additive reviewed-source composition and evidence conflict resolution only; no API, persistence, access or retention contract changes.
Change-source: pulse-maintainer
2026-10-03 02:04:04 +01:00
pulse-triage[bot] 7ec246381f Check retained demo profile inside its owning transaction
The broader release-policy check still expected the removed shell configuration step. Assert its real transaction entry and runtime profile/entitlement preservation while keeping activation, exact stable tag, network and public browser checks unchanged.

Contract-Neutral: Align verification with the already implemented demo transaction; no runtime or authority change.
Change-source: pulse-maintainer
2026-10-03 01:45:34 +01:00
pulse-triage[bot] 360721cc91 Bind demo cohost observation to the real Relay health route
Current operational source exposes healthz and takes the shared deployment lock. Pin that route and make the disposable service return 404 for unknown paths so native acceptance cannot manufacture a healthy cohost observation.

Change-source: pulse-maintainer
2026-10-03 01:44:42 +01:00
pulse-triage[bot] c9a0f0bf6a Keep stored disk History independent of current collection
Use stable disk-family chart entries so missing current SMART or temperature fields cannot hide stored observations, and matching snapshots do not remount charts or restart reads. Preserve existing identity, live collection status and entitlement boundaries; cover cancellation, measured zero, empty series and desktop/phone presentation.

Change-source: pulse-maintainer
2026-10-03 01:39:20 +01:00
pulse-triage[bot] d0d621a7c2 Exercise detector admission in partial-delivery recovery proof
Drive firings through the existing monitor callback instead of sending them directly through the notifier. This records the detector notification state required by the unchanged recovery policy; keep that policy and all failed attempts intact.

Change-source: pulse-maintainer
2026-10-03 01:38:16 +01:00
pulse-triage[bot] 4df3e8974e Add disposable native acceptance for owned demo recovery
Exercise actual systemd and Caddy with a changed executable, distinct persistent data, delayed synthetic failure, observer loss and TERM during full rollback. Keep 300-second clocks, exact-source and cleanup receipts; no production credential or worker system privilege is added. Update the connected recovery contract and policy assertions, and retain bounded service identity observations.

Change-source: pulse-maintainer
2026-10-03 01:36:36 +01:00
pulse-triage[bot] 1c9440546a Use destination receipts for delayed partial-delivery recovery
A cancelled retry and a lost RAM cooldown marker do not mean that no destination received the old firing. Keep quiet-hours and recovery controls, then let persistent occurrence/destination receipts select the actual recipients. Add an HTTP 200/503, restart and recurrence control so the newer firing survives and only the previously informed destination receives the old recovery.

Change-source: pulse-maintainer
2026-10-03 01:29:51 +01:00
pulse-triage[bot] 74fd189fd0 Restore bounded alert delivery and evidence-first TrueNAS troubleshooting (#2428)
## What changed and why

Alert cleanup now retires an expired flapping episode together with its
suppression deadline. Previously either cleanup owner could remove the
deadline but leave the episode latched, suppressing notifications
without a newly bounded cooldown. Active alert identity, unexpired
suppression and ordinary repeat-notification cooldown remain unchanged.

TrueNAS troubleshooting now distinguishes stale polling, missing
telemetry, authentication failures and session turnover. The existing
guides preserve polling evidence before a manual connection test updates
timestamps, use the actual 60-second default and avoid credential resets
or destructive reproductions. This addresses the diagnostic gaps exposed
by #2382, #2396 and #2400; it does not claim those native incidents are
all resolved.

## Reviewed source included

Complete unpublished range:
`0e90236d3bb901dc84d4d07e70d4d2a09d5e6705..971ebde8afdc0f55dd0ea77a0358467caf62ea73`
(five commits, including additive integration history).

- TrueNAS guide candidate `4b0f23e0a7a7d03df391f83896cbf4b48657bd24` (2
October).
- Alert cleanup candidate `d813c936e464eb09bb9ae7e6c7ac33716acde378` (2
October).
- Integration tips `e9294420`, `71382de0`, `971ebde8` preserve the
original candidates and published main ancestry without rewriting them.

## Validation

- Accepted alert candidate evidence: six parent-failing cleanup cases
pass on final; full alerts correctness/races, ten focused race repeats,
notification correctness, library vet/build and 132 governance checks
pass. The integrated alert files are identical to that candidate. These
proofs used Go 1.26.7; declared Go 1.26.8 CI remains required.
- Accepted guide evidence: seven guide checks, three polling controls
and 25 Docs/viewer tests; desktop Chromium and phone WebKit
navigation/readability checks. Integrated guide/test files are unchanged
from that candidate.
- Exact combined head: seven guide checks pass in offline source proof
`source-x4fm8fxy`, exit 0, complete output and completed guest shutdown.
The preceding confined lightweight attempt could not create loopback
sockets (five errors); it is an execution-context limitation, not a
pass.
- Publication provenance and whitespace checks pass; live main matches
the range base.

Required exact-head CI and independent source review still gate landing.
Real-duration alert queue/HTTP acceptance remains with its existing
owner after an interrupted proof; native monitoring acceptance and
containing-release delivery remain separate. No release, tag or
deployment is changed by this PR.


[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
2026-10-03 00:21:44 +00:00
rcourtman 2448a71860 Let table callers own the cell padding they ask for (#2427)
## Defect

`TableCell` and `TableHead` in
`frontend-modern/src/components/shared/Table.tsx` prepend `px-2 sm:px-3
py-*` to the caller's class. Tailwind emits every padding utility at
equal specificity in spacing-scale order, so a caller's smaller utility
loses to the base no matter where it sits in the string: `px-1` loses to
`px-2`, `sm:px-1.5` loses to `sm:px-3`, and `p-0` loses to both axes.

Measured on 2026-10-02 against `origin/main` with a Playwright sweep of
every table on every platform page, tab, Alerts and Settings page at
1440, 1280, 900, 700, 560 and 390px:

- DiskList cells asked for `px-1 sm:px-1.5 lg:px-2` and rendered 8px
below 640px and 12px at 640–1023px.
- The platform helper's `px-1.5 sm:px-2` cell padding had never taken
effect since it was introduced in May; 58 platform tables rendered
8/12px while the stylesheet already pins their headers at 6px, so
left-aligned header text sat 6px left of its column at desktop widths.
- Workloads header cells (`TableHead`) rendered 8/12px over raw `td`
data cells at 6/8px.
- Expansion wrappers that pass `p-0` (`InlineDetailTableRow`, windowing
spacers) carried 8/12px of horizontal and 2px of vertical padding; the
physical-disk detail row asked for 16px and got 12px at 640px and up.

PR #2409 and PR #2418 worked around the primitive with layout-mode
`!px-1` overrides.

## Fix

Apply the convention `TableHeader` already uses for `border-*` and
`TableBody` for `divide-*` to padding. When the caller's class names a
side's padding (`p-*`, `px-*`, `pl-*`/`ps-*`, `pr-*`/`pe-*`, `py-*`,
`pt-*`, `pb-*`, with or without `!`), the base padding for that side is
omitted. Sides the caller leaves alone keep the base, so a `pr-2` column
keeps its left inset. Prefixed-only variants such as `lg:px-0` do not
count as ownership and keep layering on the base as before. The class
resolves inside the JSX attribute, so layout-mode class switches stay
reactive. Nothing passed means the base is unchanged.

Five unit tests cover the base, full and single-side ownership,
important and larger values, `p-*`, prefixed-only classes, and
reactivity.

## Blast radius, measured before and after on the same mock stack

- 455 table states compared across both sweeps: clipped-cell count
improved in 89, unchanged in 362, and worse in 4. All four "worse" cases
have identical or wider content boxes after the change and differ only
in live mock values (`28s ago` vs `8s ago`, a usage label 2px longer),
so they are data drift, not layout.
- Platform tables: cells 12→8px at 700px and up, 8→6px at 390/560px;
header rows 29→21px (the helper's declared `py-0.5` now applies).
Headers and cells now line up within 2px instead of 6px.
- DiskList at 390px: cells 8→4px, matching the composed class.
Physical-disk detail row 12→16px at 640px and up.
- Inline detail rows (`p-0`): cell padding 12/12/2/2 → 0, so the detail
panel's own `px-2 sm:px-4` inset is the only inset (28px → 16px at
desktop).
- Alerts overview stats, alert history, AI cost table, Settings
infrastructure tables: now render the padding their classes name; no
clipping regressions.
- The storage pools table (StoragePoolRow) is unchanged: its cells
already carried 8px.

## Overrides

- `ProxmoxReplicationTable.tsx` keeps its compact-mode `!px-1`: it must
beat the platform helper's own `px-1.5 sm:px-2` in the same class
string, which this primitive change cannot do for it. Without it compact
cells would render 6/8px instead of 4px.
- The DiskList/StoragePoolRow `!px-1` overrides from PR #2418 are not on
`main` (that PR is still open and currently conflicting on the receipt).
Once it lands, its layout-mode `!px-1` is redundant with the composed
`px-1 sm:px-1.5 lg:px-2` and can be dropped in the same pass that
rebases it.

Browser verification receipt covers the touched runtime file at the
viewports above.
2026-10-03 01:21:18 +01:00
pulse-triage[bot] 2c57a54ec4 Preserve sending-row crash recovery in the occurrence fixture
Assert surviving row status before restart, then expect the existing sending-to-pending crash recovery after reopening the queue. The initial source-dtamnmrn fixture failure is retained; runtime source and delivery policy are unchanged.

Change-source: pulse-maintainer
2026-10-03 01:20:39 +01:00
pulse-triage[bot] b6a42d8a4f Merge reviewed evidence-preserving performance help
Preserve exact candidate 286c8a1f51. Retained copied-recipe, mirror, Docs viewer and desktop/phone browser evidence covers this existing guide improvement; no runtime or installed performance claim.

Change-source: pulse-maintainer
2026-10-03 01:17:20 +01:00
pulse-triage[bot] d7de6d1f6b Merge reviewed current-snapshot resource details repair
Preserve exact candidate 0d8d5beb5f and its browser-bound parent. Retained full frontend proof and desktop/phone regressions cover this existing monitoring-trust repair.

Change-source: pulse-maintainer
2026-10-03 01:17:10 +01:00
pulse-triage[bot] 8f42497b8f Keep delayed alert recovery scoped to its resolved occurrence
Capture the resolved alert before asynchronous callbacks and carry its start/end identity through monitor recovery. Cancel only that occurrence in grouping, cooldown and persistent firing rows, retaining newer incidents, operational links, destination receipts and failed attempts. Keep the explicit identifier-wide cancellation API and legacy callback IDs. Add snapshot, restart and connected queue-to-HTTP regression controls.

Change-source: pulse-maintainer
2026-10-03 01:16:42 +01:00
pulse-triage[bot] b3937a4803 Use the actual lookup receipt shape in demo ownership proof
Assert the existing file-level verification receipt so the new routing control exercises real ownership instead of assuming an unavailable summary field.

Contract-Neutral: Test-only assertion of existing subsystem lookup output; no runtime or authority change.
Change-source: pulse-maintainer
2026-10-03 01:13:46 +01:00
pulse-triage[bot] 751fb67523 Bind demo controls without broadening unrelated release proof
Keep new source paths on their own connected proof policy after the full lookup suite exposed six broadened metadata expectations. Preserve terminal no-op cancellation evidence and the runtime file owner.

Contract-Neutral: Correct connected observation and verification routing within the existing demo operations and authority.
Change-source: pulse-maintainer
2026-10-03 01:12:47 +01:00
pulse-triage[bot] f56e28e6af Own demo update and recovery through sustained host observation
Compose the existing signed stable demo paths with the Relay host lock, durable systemd ownership, full persistent estate capture and five-minute forward and recovery watches. Preserve uncertain attempts and failed rollback, refuse destructive headroom pruning, and keep native installed acceptance separate from connected source controls.

Change-source: pulse-maintainer
2026-10-03 01:05:16 +01:00
rcourtman b22571f196 Let table callers own the cell padding they ask for
TableCell and TableHead composed `px-2 sm:px-3 py-*` ahead of the
caller's class, but Tailwind emits every padding utility at the same
specificity in spacing-scale order, so a caller's `px-1` lost to the
base `px-2` and `sm:px-1.5` lost to `sm:px-3` wherever it sat in the
string. Measured on 2026-10-02: DiskList cells carried 16px of
horizontal padding on a 390px phone although their class asked for
8px, and 24px at 640-1023px although it asked for 12px; the Workloads
header cells sat at 8/12px above data cells at 6/8px; the platform
helper's `px-1.5 sm:px-2` had never taken effect on a cell since it
was introduced in May. PR #2409 and PR #2418 worked around it with
layout-mode `!px-1` overrides.

Apply the convention TableHeader already uses for borders and
TableBody for dividers to padding: when the caller's class names a
side's padding (`p-*`, `px-*`, `pl-*`, `pr-*`, `py-*`, `pt-*`, `pb-*`,
with or without `!`), the base padding for that side is left out, so
the caller's utility is the only one on the element. Sides the caller
leaves alone keep the base, so a `pr-2` column still gets its left
inset, and prefixed-only variants such as `lg:px-0` keep layering on
the base as before. The base is unchanged when nothing is passed, and
the class is resolved inside the JSX attribute so layout-mode class
switches stay reactive.

Platform tables pick up the helper's declared 6/8px cell padding,
which lines data cells up under the 6px headers the stylesheet already
pins, and their header rows drop to the helper's 2px vertical padding.
2026-10-03 01:01:00 +01:00