Operations¶
Status (Services → Artekis → Status, refreshed every 10 s): the setup checklist, storage with the DDL links, database
ownership with Take ownership, the license, the providers, each playbook's last run (test runs excluded) with the
findings the validator dropped and the rule, the email, MQTT, memory-tag and callback deliveries that failed in the
last 7 days, whether the MQTT suite is installed, and the engine. A DONE run that timed out after it started storing
shows a note; its findings were stored and announced.
Database ownership. One Artekis database belongs to one logical gateway. Each gateway keeps its own id outside
its configuration (<data>/var/com.artek.artekis/node-id), so copying configuration or restoring a backup never copies
the identity; the owner heartbeats a lease row once a minute by the database's clock. On a redundant pair only the
Active node runs the engine; it hands the lease back on a planned restart or demotion (the peer claims it within a
minute) and takes over automatically after 5 minutes of silence on a crash. A standalone gateway never takes over and
never hands back. To move the database to a replaced or restored gateway, press Take ownership on the gateway
that should own it (it replaces the row and ends the runs the previous owner left unfinished), or
DELETE FROM artekis_owner; and let the next gateway to tick claim it. A database copied from another gateway (a
demo built from a copy, a test restored from production) stays owned by the gateway it came from: nothing runs on the
new one, and Status says who owns it, until someone presses Take ownership there (or posts
/data/artekis/web/ownership/take from a signed-in session).
Egress (Services → Artekis → Egress): every model call, email and MQTT send with its outcome, filtered by output,
provider, run, outcome and dates; opening a row shows what was sent as policy.egress.logPrompts kept it. A gateway
user with Read can open the kept (redacted) prompt.
Cost: section 6.4. Test run: section 3.
Retention. A nightly prune at 03:15 local deletes runs and egress rows older than settings.retentionDays
(default 180) and the evidence of resolved or dismissed findings past it: never findings, feedback or documents. It
needs the tables but not a license. A conversation in Ask lasts as long as its runs.
Logs. Artekis logs under Artekis.*; Artekis.Audit carries every configuration write, verdict, upload, tool call
from Ask and refused request, with the actor. One WARN a day marks a license in grace; one WARN at start says when the
module cannot read Perspective sessions (the views' server-side level check is then off, and the Views pack card says
so).
Troubleshooting
| Symptom | Look at |
|---|---|
| Nothing runs | Status: the three conditions for scheduling (license, storage (connection, tables, schema version) and ownership) with the reason for the one that fails |
A run is SKIPPED |
its reason: cap (raise the cap or the playbook's maxUsdPerRun), no-collection (the playbook's collections have no context model here), ai-cutoff, licence, no-provider |
A run is FAILED(credential) |
the provider's secret is missing from its Secret Provider, or the key is rejected |
A run is REJECTED(truncated) |
raise budget.maxOutputTokens; REJECTED(parse): an OpenAI-compatible endpoint that does not honour structured output: the probe shows it |
| Findings exist but the views do not update | the playbook's outputs.perspectiveMessage is off, or the project already had an artekisFinding handler the pack did not write (Status's Views pack card names it) |
| A verdict or upload is refused | the session lacks the policy level, or the project has no identity provider |
Tags read Bad_Stale |
this gateway does not own the database, or its schema is not ready: Status names the owner |
Email FAILED / MQTT REJECTED |
Status's delivery failures and the Egress row: the profile or connection name, the MQTT allowlist |
| An alarm never triggers Incident | the Event Stream's filter and the pipeline's Script block (Status step 8), and whether a context model lists the alarm (contextModel.assetFor) |
| Ask is refused | the provider has no tool calling (toolUse on the probe), the session is not logged in, or a per-user cap |
| Anomaly Watch finds nothing on a tag | the tag keeps no history, has fewer than 36 baseline samples in the current state, or did not vary at all over the baseline (a value frozen for the whole baseline gets none, so not even stuck screens it); the run's KPIs list the baselines it built; or the asset was stopped or in changeover, or the screened steps were not Good |
| A detector's download is refused | the reason names it, for example: no expression (stuck, rate), no path, a missing parent folder or one inside a UDT instance, the path already holds a different expression, a referenced tag not readable under the policy, or the tags could not be read (try again) |
| An imported detector files no fires | the model's alarms.journal names a journal that does not hold the detector's alarm (journalFires then shows that journal and 0 fires). With no journal at all, Artekis checks the detector itself (section 8.5), so a silent detector there means its rule did not fire in the window |