Warning, /swf-monitor/docs/PINGS.md is written in an unsupported language. File is not indexed.
0001 # Pings
0002
0003 A ping is a dated obligation: an action to take on a subject by a due
0004 date, with an owner and a lead time. The alarm system carries pings at
0005 their own severity, `ping`: a ping raises when its due date comes within
0006 its lead time, repeats while open, becomes an alarm when its due date
0007 passes unfulfilled, and clears when the obligation is fulfilled. Pings are
0008 entered by a person on the alarm dashboard or proposed by the AI through
0009 the proposal mechanism ([AI_PROPOSALS.md](AI_PROPOSALS.md)) and accepted
0010 there by a person. This document specifies the record, its lifecycle, the
0011 two ways a ping enters, and its delivery. It builds on the alarm engine
0012 ([alarms.md](alarms.md)) and the alarm queue ([ALARM_QUEUE.md](ALARM_QUEUE.md)).
0013
0014 ## The record
0015
0016 A ping is one entry of kind `ping` in the `swf-alarms` context, beside
0017 the alarm configurations, events, and teams the dashboard already edits:
0018
0019 | Field | Meaning |
0020 |---|---|
0021 | `title` | the obligation, as a sentence: "Renew the osgsub01 host certificate" |
0022 | `due` | the due date |
0023 | `lead_days` | how far ahead the ping raises; default 7 |
0024 | `owner` | the person or team responsible, a recipient token as on alarm configurations |
0025 | `note` | what to do and where; the alarm event body |
0026 | `url` | where to look or act, optional |
0027 | `status` | `open` or `fulfilled` |
0028 | `origin` | `manual`, or the proposal ref that created it |
0029 | `fulfilled_by`, `fulfilled_at` | the fulfilment record |
0030
0031 The entry's content holds the note; the fields live in its `data`. A
0032 fulfilled ping is retained; it is the record that the obligation was met
0033 and when.
0034
0035 ## Lifecycle
0036
0037 One detect module, `pings`, and one alarm entry, `alarm_pings`, carry
0038 every ping through the engine's ordinary tick:
0039
0040 - **Raised.** An open ping whose due date is within `lead_days` yields a
0041 detection keyed on the ping, at severity `ping`. The event is created,
0042 the email bundle goes to the alarm's subscribers and the ping's owner,
0043 and the incident reaches Capcom.
0044 - **Repeated.** The alarm entry's renotify window, seven days by default,
0045 re-sends the open ping and, under the alarm queue design, writes its
0046 `renotified` transition.
0047 - **Overdue.** Once the due date has passed, the detection carries
0048 severity `alarm`: the event's severity is updated on the tick, the
0049 dashboard and the feed show it as an alarm, and the next bundle says so.
0050 This is the alarm queue's `escalated` transition with the due date as
0051 the escalation point.
0052 - **Fulfilled.** A person marks the ping fulfilled on the dashboard, or
0053 accepts an AI proposal to that effect. The module no longer yields it,
0054 and the engine clears the event on the next tick, the same auto-clear
0055 every alarm has. A condition the system cannot verify is closed by a
0056 person: a renewed certificate does not close a ping, a person does,
0057 and the next AI look at the certificate proposes the closure if it is
0058 still open. A rule-based proposer that can verify its own condition
0059 fulfils its pings itself, origin the rule: the campaign configuration
0060 proposer fulfils an open configuration ping once the configuration
0061 exists, whoever created either.
0062
0063 Severity is carried on the event (`data.severity`) and on the incident
0064 the transition logs, so subscribers filter on it: a Capcom feed at
0065 `ping`, an email digest at `alarm` and above.
0066
0067 ## Entering a ping
0068
0069 Two ways in, side by side on the alarm dashboard's Pings section:
0070
0071 - **By hand.** A form with the record's fields; the write is
0072 login-gated like every dashboard write. Fulfilment is one control on
0073 the ping's row.
0074 - **By proposal.** The AI proposes a ping through the proposal mechanism:
0075 category `ping`, ref prefix `pg`, a creation subject keyed on the
0076 obligation and due date, executor `ping_create` in the alarm domain,
0077 the identical call the form makes. The reviewer may change the due
0078 date before accepting, recorded on the payload as an amendment, as the
0079 campaign-plan category does. A proposal is a proposal-created incident
0080 and so reaches Capcom on creation; acceptance creates the ping with
0081 `origin` set to the proposal ref, and the ping then raises on its own
0082 schedule. Fulfilment is proposable the same way, category `ping_fulfil`
0083 on the ping's entry. A denied proposal is denial memory: the same
0084 obligation is not re-proposed until its inputs change.
0085
0086 The proposer is whatever AI is looking: a session's assistant reading a
0087 certificate or a credential, or, later, the alarm responder
0088 ([WRANGLER_AGENT.md](WRANGLER_AGENT.md)). The propose surface is the
0089 existing proposal REST endpoint and an MCP propose tool sized for the
0090 smallest model: title, due date, owner, note, and a comment.
0091
0092 A proposer need not be a model. The proposal design admits rule-based
0093 proposers, and the expiry checks move into the ping system that way:
0094
0095 - **Credentials.** The nightly credential expiry check (EPICPROD_OPS.md)
0096 reads the expiry of the PanDA token and the two x509 proxies. As a
0097 proposer it proposes, for each credential with no open ping on its
0098 expiry, a ping due at that expiry with a seven-day lead, keyed on the
0099 credential and the date so the proposal is made once; when a credential
0100 is renewed it proposes fulfilment of the open ping and a ping on the new
0101 date. Its action-stream warning line retires; the pings are the record.
0102 - **Certificates.** The same shape over the host certificates of the
0103 PanDA and OSG service hosts, read from the served chain: a ping on
0104 each expiry, and a ping on a certificate served without its
0105 intermediate, since browsers without the grid CA bundle cannot verify
0106 it.
0107
0108 Both proposers run where their reads are possible, as `catalog_sync`
0109 chain steps on the production operations agent: the credentials are
0110 readable only in that account's environment, and the certificates are an
0111 ordinary network read from the same host. Neither writes a ping; a
0112 person accepts each one, with the date editable. A credential or host
0113 the check cannot read at all yields no ping, since there is no date to
0114 carry, and stays on the check's own action record.
0115
0116 ### Pings with a remedy
0117
0118 Some obligations the system can carry out itself once a person agrees.
0119 For those the proposer emits two proposals at once: the ping, and a
0120 remedy, a proposal in the obligation's own category whose executor does
0121 the work. The remedy carries the ping's title as its link, and the Pings
0122 section shows the pair as one item with one decision. Approve runs the
0123 remedy: the ping is entered and marked fulfilled in the same act, both
0124 proposals are executed, and the fulfilled history records the obligation
0125 as raised and met by the remedy. Deny denies both; neither is re-proposed
0126 until the finding changes. A ping already open when its remedy is
0127 proposed (entered by hand, or accepted earlier) shows the remedy beside
0128 its Fulfilled control: approving the remedy fulfils the ping, Fulfilled
0129 records that a person did the work by hand. The heartbeat withdraws and
0130 re-derives both proposals while the condition holds; when it no longer
0131 holds, neither returns, and an open ping whose condition was met by hand
0132 is fulfilled by the proposer's next run, origin the rule.
0133
0134 The first such proposer is the **campaign configuration** rule: every
0135 campaign edition that has tasks and no `<edition> Standard
0136 Production` configuration yields a ping, "Create the <edition> Standard
0137 Production configuration", due two days out with a one-day lead, and its
0138 remedy, category `standard_config` (AI_PROPOSALS.md), whose executor
0139 creates the configuration from the template the
0140 `create_standard_prodconfig.py` script clones, with the edition's image
0141 and tag. It runs nightly as a `catalog_sync` chain step on the
0142 production ops agent, through the `propose-campaign-configs.py` doer,
0143 which is also runnable by hand with a dry run. An edition without its
0144 standard configuration cannot be submitted or rerun from PCS; on
0145 2026-09-05 the 26.07.1 edition had run for six weeks in that state.
0146
0147 ## Delivery
0148
0149 - **Email.** The `alarm_pings` entry's recipients are the subscribers;
0150 the ping's owner is added to the bundle that carries it. The engine's
0151 one-email-per-alarm-per-tick rule stands.
0152 - **Capcom.** The `alarm_raised` and `alarm_escalated` incidents at
0153 severity `ping` and `alarm` reach the operator's feed through the
0154 standing notice-routing subscription; `ping` joins the Capcom severity
0155 vocabulary on the tjai side, so a reminder is not dressed as a
0156 warning.
0157 - **The feed.** Under the alarm queue's per-subscriber feeds, an open
0158 ping is an item like any other: unread on raise, on repeat, on
0159 escalation, and on clear.
0160
0161 ## Dashboard
0162
0163 The alarm dashboard gains a Pings section: open pings with due date,
0164 days left, owner, origin, and the fulfil control, ordered by due date;
0165 pending AI-proposed pings beside them in the AI treatment with accept,
0166 amend-date, and deny; fulfilled pings in a collapsed history. The event
0167 history of a ping is the alarm event history it already has.
0168
0169 ## Data
0170
0171 - Entry kind `ping` in `swf-alarms`, fields as above.
0172 - Alarm entry `alarm_pings`: recipients (the subscribers),
0173 `renotification_window_hours` 168, `severity` `ping`.
0174 - Event `data.severity` refreshed on each tick from the detection, so an
0175 overdue ping's event reads `alarm`.
0176 - Proposal categories `ping` (ref `pg`) and `ping_fulfil` (ref `pf`),
0177 with executors `ping_create` and `ping_fulfil`, creation-keyed
0178 preconditions, and their `ACTION_REF_PREFIXES` entries.
0179 - Action-stream records: `ping_create`, `ping_fulfil`, both
0180 origin-stamped, at importance `normal`, live.
0181
0182 ## Delivery sequence
0183
0184 1. The ping entry, the `pings` detect module and its alarm entry, the
0185 dashboard section with entry and fulfil, event severity refresh, the
0186 owner added to the bundle. Pings work by hand end to end.
0187 2. The `ping` and `ping_fulfil` proposal categories, the MCP propose
0188 tool, and the proposal rows in the Pings section.
0189 3. The rule-based proposers: the campaign configuration proposer with
0190 its remedy, the first ping with a remedy; then the credential and
0191 certificate proposers, and the nightly check's warning line retired.
0192 4. `ping` as a Capcom severity on the tjai side.
0193
0194 ## Status
0195
0196 Step 1 was completed 2026-09-04: the ping entry, the `pings` module and
0197 its alarm entry, the dashboard section with entry and fulfil, event
0198 severity refresh, and owner recipients are in production, and the first
0199 two pings raised on the engine's tick. Step 2 was completed the same day:
0200 the `ping` and `ping_fulfil` proposal categories, the `ai_propose_ping`
0201 MCP tool, and the proposal rows on the dashboard with an editable due
0202 date; the first two pings were re-issued as proposals for acceptance.
0203 Step 3 began 2026-09-05 with the campaign configuration proposer in
0204 production: its first run proposed the pings and remedies for 26.07.1 and
0205 26.07.2, approved the same day. The credential and certificate proposers
0206 were completed 2026-09-08 and run as the `credential_ping_propose` and
0207 `certificate_ping_propose` chain steps, with the credential check's
0208 warning line retired to the non-live record. The certificate check reads
0209 the chain served by the PanDA server, its monitor, this host's web face,
0210 and the OSG submit host. Step 4 is not started.