Files
zulip-platform-plugins/docs/contracts/zulip-platform-verification.prose.md
Abiba (pi) 40ce413fd8 contract: add host + Health URL columns, use health_url param
- Added Host column (Abiba: 192.168.68.24, Hermes agents: 192.168.68.123)
- Changed Health Port → Health URL with full http://host:port/health URLs
- Updated Check 1 to reference {{health_url}} instead of {{health_port}}
- Added .gitignore for .agents/ (OpenProse run state)
2026-07-02 17:18:40 +00:00

99 lines
3.4 KiB
Markdown

---
kind: responsibility
name: zulip-platform-verification
version: 1.0.0
description: >
Cross-platform Zulip agent verification contract. Validates both pi (TypeScript
extension) and Hermes (Python BasePlatformAdapter) plugins can connect to Zulip,
receive DMs, filter own messages, resolve @all-bots, and relay LLM responses.
Designed to run on schedule (daily) or on-demand by any Syslog agent.
author: Abiba (pi agent)
---
# Zulip Platform Verification Contract
## Platforms Under Contract
| Platform | Agent | Host | Bot Email | Health URL |
|----------|-------|------|-----------|------------|
| pi | Abiba | `192.168.68.24` | abiba-bot@chat.sysloggh.net | `http://192.168.68.24:9200/health` |
| Hermes | Tanko | `192.168.68.123` | tanko-bot@chat.sysloggh.net | `http://192.168.68.123:9201/health` |
| Hermes | Mumuni | `192.168.68.123` | mumuni-bot@chat.sysloggh.net | `http://192.168.68.123:9202/health` |
| Hermes | Koonimo | `192.168.68.123` | koonimo-bot@chat.sysloggh.net | `http://192.168.68.123:9203/health` |
| Hermes | Koby | `192.168.68.123` | koby-bot@chat.sysloggh.net | `http://192.168.68.123:9204/health` |
## Parameters
- zulip_site: string — Zulip server URL (default: "https://chat.sysloggh.net")
- agents: array — List of agent configs to verify (default: all)
- test_message: string — Content to send in loopback DM (default: "🔬 Contract self-test")
## Checks (per agent)
### Check 1: Health Endpoint
- GET {{health_url}} → expect 200, `{ status: "ok", connected: true }`
### Check 2: Queue Registered
- Health response must include `queue_id` (non-null string)
### Check 3: Bot Identity Resolved
- Health response must include `bot_user_id` (positive integer, not null)
### Check 4: @all-bots Resolved
- Health response must include `all_bots_user_id` (positive integer, not null)
- Must match the actual Zulip @all-bots user (resolve from `/api/v1/users`)
### Check 5: Poll Loop Active
- `idle_seconds` < 300 (5 min) OR `stuck` = false
- `silence_seconds` < 600 (10 min) for Hermes adapter
### Check 6: Event Reception (Loopback)
- Send test DM via Zulip API from external account
- Verify `idle_seconds` resets to <10s within 5s of DM
- OR verify `messages_processed` increments (for external-source DMs)
### Check 7: Self-Test (if available)
- Hermes: POST to adapter's `selftest()` method → expect verdict "healthy"
- pi: Run `/zulip-test` command via RPC → expect "All checks passed"
### Check 8: Echo-Loop Prevention
- Health endpoint must include mechanism to identify bot email
- Own-sent messages must not trigger processing
## Returns
```json
{
"verdict": "healthy" | "degraded" | "critical",
"timestamp": "ISO-8601",
"agents": {
"abiba": {
"platform": "pi",
"verdict": "healthy",
"checks": { ... },
"details": { ... }
},
"tanko": {
"platform": "hermes",
"verdict": "degraded",
"checks": { ... },
"details": { ... }
}
},
"summary": {
"total": 5,
"healthy": 4,
"degraded": 1,
"critical": 0
}
}
```
## Maintains
- Each agent is independently verified; one failure doesn't block others
- @all-bots user_id is cross-validated against Zulip API (catches config drift)
- Report is saved to vault at `/root/vault/contract-reports/zulip-verification-{date}.md`
- Alert sent to owner if any agent is critical or >2 are degraded
- Contract is self-documenting — results include raw health snapshots