omp
๐งญ Cronsban Full Blueprint
Full dense blueprint for Cron + Kanban + OMP + Discord + Pi WebUI + durable swarm gateway architecture.
Cronsban = Cron + Kanban + OMP/Pi sessions + durable swarm gateway. It is the operating design for converting raw requests, Discord messages, scheduled checks, and WebUI actions into verified, auditable work without unsafe autonomous loops.
0. Mission#
Every incoming intent becomes either:
1. a Kanban card with acceptance criteria, or
2. a durable queued job with idempotency, policy, logs, artifacts, and verification.
The system is intentionally boring at the dangerous boundaries: explicit allowlists, durable state before execution, one owner per channel/session, and no public raw runtime state.
1. Non-negotiables#
- Treat Discord access like SSH access.
- Persist jobs before invoking OMP/Pi/AIRI/Red.
- Never put bot tokens, launcher secrets, API keys, RCON, raw sessions, or hidden runtime state into Discord, public wiki pages, Node-RED flows, Red Config, or generated summaries.
- Empty allowlists mean not configured, not public.
- One Discord token/channel/thread is owned by exactly one bridge/gateway process.
- Cron jobs must be bounded, idempotent, locked, and observable.
pi-schedule-promptis not a durable daemon: jobs fire only while a Pi session is open in that cwd.- Local WebUI binds
127.0.0.1by default; remote access requires HTTPS + authentication. - Components/buttons are hints, not authority; every click re-checks permissions server-side.
- Done means behavior is proven end-to-end.
2. Source-backed package verdict#
| Package/system | Use it for | Command/API | Storage | Keep | Avoid |
|---|---|---|---|---|---|
| OMP | Main operator runtime | omp --allow-home |
~/.omp/agent, ~/.omp/plugins |
Existing local runtime and tool/LSP harness | Running child sessions with wrong cwd/env |
| OMP Discord remote | Live Discord steering | /discord-status, /new, /session, launcher 127.0.0.1:8765 |
Live OMP/plugin state | Thread-per-session, steering, tool cards | Treating it as durable queue/file gateway |
pi-board |
Real Kanban/sprint WebUI | /board; board_* tools |
.pi/board.db |
Tasks, WIP limits, sprints, stats, import/export | Making board DB the execution queue |
pi-kanban |
Pi session/todo/subagent observability | /kanban start, /kanban open web, /kanban session pin |
Pi session JSONL | Sessions, todos, subagents, markdown plans, live SSE | Assuming it sees OMP sessions without adapter/sync |
pi-schedule-prompt |
Pi-local reminders/deferred prompts | schedule_prompt, /schedule-prompt |
.pi/schedule-prompts.json |
Human scheduling UX, per-task model, widget | Durable unattended automation |
| Cronsban gateway | Durable control plane | Discord slash, WebUI REST/SSE, cron enqueue | SQLite WAL + artifact store | Queue, policy, events, adapters, approvals | Shipping without auth + persistence |
| Nexus/Hermes/wiki | Safe summaries | generated pages/JSON | nexus-dash/data, wiki content/public |
Public status, generated summaries | Publishing raw logs or secrets |
| Red/Node-RED | Optional connector edge | local HTTP/WebSocket/cog/nodes | connector metadata | Low-code/status integration | Owning Discord token or direct Pi execution |
Recommended split:
pi-board = human-visible work board
pi-kanban = Pi session/subagent observability
Cronsban DB = durable execution truth
Nexus/wiki = safe published status
3. Entire stack#
| Layer | Default | Responsibility |
|---|---|---|
| Ingress | Discord, WebUI, cron/systemd, Pi board actions, OMP launcher | Capture intent. |
| Auth/policy | allowlists, roles, channel maps, path policy, approval rules | Decide whether intent may run. |
| Queue | SQLite WAL jobs |
Persist before execution; enforce FIFO/concurrency/idempotency. |
| Session router | scopes, sessions |
Map DM/channel/thread/workspace to exactly one active session. |
| Adapters | OMP subprocess, live OMP extension, Pi, AIRI, Red, external | Execute work without Discord coupling. |
| Events | append-only events |
Replayable state for Discord cards and WebUI. |
| Renderers | Discord cards, WebUI, public wiki summaries | Show safe state at the right detail level. |
| Artifacts | private artifact directory + metadata table | Store files/logs/screens safely before sharing. |
| Verification | tests/checks/health/artifact inspection | Move cards/jobs to Done only with proof. |
4. Architecture#
โโโโโโโโโโโโโโโโโโโโโโ
Discord user โโโโถโ Discord adapter โ
โ slash/buttons/files โ
โโโโโโโโโโโฌโโโโโโโโโโโ
โ normalized ingress event
Cron/systemd โโโโโโโโโโโโโโโค
WebUI action โโโโโโโโโโโโโโโค
Pi-board card โโโโโโโโโโโโโโค
โผ
โโโโโโโโโโโโโโโโโโโโโโ
โ Policy + idempotencyโ
โ authz/path/approval โ
โโโโโโโโโโโฌโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโ
โ SQLite WAL queue โ
โ scopes/jobs/events โ
โโโโโโโโโโโฌโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโ
โ Session router โ
โ per-scope FIFO โ
โโโโโโโโโโโฌโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
OMP subprocess live OMP adapter AIRI/Red/etc.
โ โ โ
โโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโ
โ Event/artifact log โ
โโโโโโโโฌโโโโโโโโฌโโโโโโ
โผ โผ
Discord cards WebUI/SSE wiki safe summary
5. Data model#
5.1 Stores#
| Store | Path/default | Owner | Public? | Notes |
|---|---|---|---|---|
| OMP sessions | ~/.omp/agent |
OMP | No | Runtime state; summarize only. |
| Pi sessions | ~/.pi/agent/sessions |
Pi | No | pi-kanban reads this directly. |
| Pi board | .pi/board.db |
pi-board |
No | Human board state; can export summaries. |
| Pi schedules | .pi/schedule-prompts.json |
pi-schedule-prompt |
No | Not durable if no Pi session is open. |
| Gateway DB | e.g. .cronsban/gateway.db |
Cronsban | No | Durable execution truth. |
| Artifact store | e.g. .cronsban/artifacts/<session> |
Cronsban | No | Hash, classify, and approval-gate before sharing. |
| Wiki summaries | wiki/content/**, public/wiki/** |
Hugo/wiki pipeline | Yes | Safe summaries only. |
5.2 Gateway tables#
| Table | Minimum fields | Purpose |
|---|---|---|
policies |
id, allowlists, blocked paths, concurrency, attachment limits |
Authz and safety defaults. |
scopes |
id, kind, Discord IDs, workspace root, policy_id, state |
DM/channel/thread/workspace identity. |
sessions |
id, scope_id, adapter, workspace, model, thinking, state, thread ID |
Agent session lifecycle. |
jobs |
id, scope_id, session_id, kind, status, idempotency_key, payload, timestamps, heartbeat |
Durable FIFO work. |
events |
id, session_id, job_id, type, payload, redaction state, timestamp |
Append-only replay log. |
messages |
Discord IDs, direction, redacted content hash/snippet, actor, timestamps | Audit and idempotency. |
artifacts |
id, session_id, path, hash, MIME, bytes, source, classification, Discord attachment IDs |
File/log/image lifecycle. |
approvals |
id, scope_id, requester, operation, risk, status, expiry, decision actor |
Risk gate. |
dashboards |
scope/session, channel/thread, message IDs, renderer version | Stable in-place dashboard updates. |
schedules |
id, scope/session, cron/interval/once spec, next/last run, idempotency seed, enabled |
Durable scheduled enqueue. |
connectors |
kind, local endpoint, auth hash, capabilities, state | Red/Node-RED/external connector metadata. |
Required DB defaults:
PRAGMA journal_mode=WAL;
PRAGMA foreign_keys=ON;
CREATE UNIQUE INDEX idx_jobs_idempotency ON jobs(idempotency_key);
CREATE INDEX idx_jobs_scope_status_created ON jobs(scope_id, status, created_at);
CREATE INDEX idx_events_session_id ON events(session_id, id);
CREATE INDEX idx_artifacts_session_id ON artifacts(session_id, created_at);
CREATE INDEX idx_approvals_scope_status ON approvals(scope_id, status, created_at);
CREATE INDEX idx_schedules_enabled_next ON schedules(enabled, next_run_at);
5.3 Event types#
scope.created
session.started
session.resumed
session.archived
job.queued
job.started
job.heartbeat
job.succeeded
job.failed
job.cancelled
assistant.delta
assistant.final
tool.started
tool.finished
approval.requested
approval.resolved
artifact.created
artifact.shared
schedule.fired
render.updated
policy.denied
error
6. Routes and command surfaces#
6.1 Existing OMP launcher#
| Method | Path | Body | Meaning |
|---|---|---|---|
GET |
http://127.0.0.1:8765/health |
none | Reports launcher health/ready/armed. |
POST |
http://127.0.0.1:8765/new-session |
{"secret":"...","args":"..."} |
Starts or queues a new OMP session if secret matches. |
Launcher rules:
- Bind local unless reverse-proxied with HTTPS/auth.
- Secret must exist before OMP boots.
- Never publish the secret.
6.2 Discord slash commands#
| Command | Action |
|---|---|
/status |
Health, permissions, queue, adapter readiness. |
/dash |
Create/refresh pinned dashboard card for current scope. |
/ask prompt: |
Enqueue explicit prompt. |
/new prompt? |
Start new session/thread. |
/session |
List/select/resume/archive sessions. |
/stop drain?: |
Abort active job; optionally drain queued jobs for scope. |
/compact instructions? |
Compact current session. |
/model model? |
Show/set model. |
/think level: |
Show/set thinking level. |
/artifacts |
Show latest artifact cards. |
/approve request_id mode: |
Approve once/always for a pending request. |
/deny request_id reason? |
Deny a pending request. |
/schedule |
Create/list/disable durable gateway schedules. |
/board card? |
Link or create a Kanban card for the current scope/job. |
Plain message rules:
- DM: accept only linked/allowlisted users.
- Project channel: accept only mention-mode or explicitly prompt-enabled channels.
- Session thread: route to bound session for allowlisted users/roles.
- Host/control channel: slash commands only; raw prompts rejected with a short hint.
6.3 Discord component IDs#
pgw:v1:<kind>:<dbId>:<action>
pgw:v1:dash:scope_01J:refresh
pgw:v1:session:sess_01J:stop
pgw:v1:approval:apr_01J:approve_once
pgw:v1:artifact:art_01J:upload
Rules:
custom_idis 1-100 chars and unique per message.- Store full state in SQLite, not in the custom ID.
- Re-check actor authorization on every click/select/modal submit.
- Disable expired or already-used destructive controls.
- Legacy components are the safer default; Components V2 can be adopted per-message only after testing because the flag cannot be removed from that message.
6.4 Local WebUI routes#
Bind 127.0.0.1 by default.
| Route | Method | Purpose |
|---|---|---|
/ |
GET |
Dashboard shell. |
/api/health |
GET |
Gateway/DB/Discord/adapter health. |
/api/scopes |
GET |
List scopes/workspaces/channels. |
/api/sessions |
GET/POST |
List/start sessions. |
/api/sessions/:id/stop |
POST |
Abort session/job. |
/api/sessions/:id/compact |
POST |
Compact session. |
/api/sessions/:id/model |
POST |
Set model. |
/api/sessions/:id/think |
POST |
Set thinking level. |
/api/jobs |
GET/POST |
List/enqueue jobs. |
/api/jobs/:id/cancel |
POST |
Cancel queued/running job by policy. |
/api/events?after=<id> |
GET |
Replay events. |
/events?after=<id> |
GET |
SSE/WebSocket live stream. |
/api/artifacts |
GET |
Artifact browser. |
/api/artifacts/:id/upload |
POST |
Upload safe artifact to Discord. |
/api/approvals |
GET |
Pending approvals. |
/api/approvals/:id/approve |
POST |
Approve. |
/api/approvals/:id/deny |
POST |
Deny. |
/api/schedules |
GET/POST |
Durable schedules. |
/api/schedules/:id/disable |
POST |
Disable schedule. |
/api/connectors |
GET/POST |
Red/Node-RED connector config. |
/api/setup/* |
POST |
Local setup wizard steps; secrets accepted only through local terminal/WebUI secret field. |
6.5 Pi package WebUI surfaces#
| Surface | Route/command | Use |
|---|---|---|
pi-board |
/board, default http://localhost:3333, PI_BOARD_PORT |
Real Kanban board with Backlog/In Progress/Code Review/UAT/Completed, WIP limits, sprints, stats, import/export. |
pi-kanban |
/kanban start, /kanban open web, /kanban open app, session pin/link commands |
Observe Pi sessions/todos/subagents/plans with live SSE. |
pi-schedule-prompt |
/schedule-prompt, schedule_prompt tool |
In-session scheduling widget and job overlay. |
7. UI/UX blueprint#
7.1 Discord dashboard card#
Gateway: ready | DB: healthy | Discord: connected
Scope: project-channel / thread / workspace
Session: sess_01J | model: provider/model | think: medium
Queue: 1 running, 2 queued | Schedules: 3 enabled
Artifacts: 4 | Approvals: 1 pending
[New] [Stop] [Compact] [Refresh]
<select session>
<select model>
<select thinking>
[Artifacts] [Approvals] [Open WebUI]
Card rules:
- One card = one decision surface.
- One pinned/updatable dashboard message per scope.
- Long output becomes stream pages + artifacts, not giant embeds.
allowed_mentions: { parse: [] }on bot output unless explicitly approved.- Tool cards show safe args summary, status, result/error summary, and artifact links.
- Approval cards show operation, risk, requester, expiry, and exact buttons.
7.2 Local WebUI layout#
Top bar: gateway health | Discord | DB | active adapter | account
Left rail: scopes, workspaces, Discord channels, sessions
Center: event timeline, assistant stream, tool cards
Right rail: queue, schedules, approvals, artifacts, controls
Mobile: tabs: Sessions / Timeline / Controls / Artifacts
WebUI is for admin-heavy operations that Discord is bad at:
- setup wizard;
- policy/allowlist editing;
- multi-session timeline;
- queue and schedule inspection;
- artifact browser;
- Red/Node-RED connector setup;
- metrics and diagnostics.
7.3 Kanban board UX#
Use pi-board columns as the human planning layer:
Backlog โ In Progress โ Code Review โ UAT โ Completed
Cronsban status mapping:
| Board status | Gateway meaning |
|---|---|
| Backlog | Captured, not ready. |
| In Progress | Has active or queued job. |
| Code Review | Output exists; maintainer review needed. |
| UAT | Verification scenario running or waiting for operator check. |
| Completed | Verification evidence recorded. |
Required card fields:
Outcome:
Scope:
Acceptance:
Risk:
Owner:
Source:
Queue/job link:
Artifacts:
Verification:
8. Cron and schedule design#
8.1 Three scheduler tiers#
| Tier | Use | Never use for |
|---|---|---|
| OS cron/systemd timer | Host-level collectors, builds, health checks, queue enqueue wrappers | Raw unbounded agent loops or secret-dumping diagnostics |
pi-schedule-prompt |
Pi-local reminders and lightweight recurring prompts while a Pi session is open | Durable unattended automation |
| Gateway scheduler | Durable prompt/job enqueue with idempotency, recovery, audit, dashboards | Direct shelling around policy/queue |
8.2 Host cron wrapper contract#
set explicit cwd
load explicit env only if required
acquire lock
compute idempotency key
run bounded command or enqueue durable job
write structured status
exit nonzero on failure
Public summary fields:
name
cadence
last_started_at
last_finished_at
status
exit_class
safe_summary
artifact_count
Never publish raw command output by default.
8.3 Durable schedule fields#
type ScheduleKind = 'cron' | 'interval' | 'once';
type GatewaySchedule = {
id: string;
scopeId: string;
sessionId?: string;
kind: ScheduleKind;
spec: string;
promptOrCommand: string;
enabled: boolean;
nextRunAt?: string;
lastRunAt?: string;
idempotencySeed: string;
createdBy: string;
policyId: string;
};
Cron format notes:
- Traditional OS cron uses five fields.
pi-schedule-promptuses six fields and includes seconds.- The gateway should store the parser kind so
*/15 * * * *is never silently interpreted as* */15 * * * *.
9. Integration plan#
9.1 OMP#
- Keep
/home/mc/.envas the OMP/Pi compatibility config source. - Keep
PI_CODING_AGENT_DIR=/home/mc/.omp/agent. - Spawn child sessions through
/home/mc/.local/bin/omp-plugin-env --allow-home. - Use live extension mode only for current operator session steering.
- Use subprocess mode for durable queue execution.
9.2 Discord#
- Use
discord.jsv14 for gateway/REST/interactions. - Register guild-scoped commands first.
- Require guild/channel/user/role allowlists before accepting prompts.
- Download attachments to private artifacts before agent use.
- Use one dashboard message per scope and edit in place.
9.3 Pi board / Pi kanban#
pi-boardowns planning tasks and sprint metrics.pi-kanbanowns Pi session/todo/subagent observability.- Cronsban may link to board cards but must not depend on board status as proof of execution.
- If OMP session visibility is needed in
pi-kanban, build an explicit adapter/sync; do not fake by copying raw hidden session state into public docs.
9.4 Nexus/Hermes/wiki#
- Nexus/Hermes ingest safe status JSON only.
- Wiki generated pages publish counts, status, and safe summaries.
- Raw diagnostics/log text stays private.
- Every public page must avoid secrets and hidden runtime paths beyond high-level source references.
9.5 Red/Node-RED#
- Red-DiscordBot is a connector cog, not the gateway core.
- Red Config stores non-secret policy only.
- Node-RED can enqueue jobs and subscribe to events over local HTTP/WebSocket.
- Node-RED must not own the Discord token or invoke Pi directly while Cronsban is enabled.
10. Policy and approvals#
Default blocked/approval-gated paths:
.env
.env.*
*.pem
*.key
id_rsa
id_ed25519
.hermes/**
.omp/**
.config/**
browser profiles
token stores
runtime session files
raw generated dashboard state that may contain secrets
Risk actions requiring approval:
| Action | Approval |
|---|---|
| Write outside workspace | Required. |
| Delete/revert/stash/reset | Required unless explicitly requested in current task. |
| Upload artifact to Discord | Required when classifier sees secrets/private state or unknown file type. |
| Run live-service restart | Required unless task explicitly calls for state change. |
| Expose WebUI remotely | Required and must include HTTPS/auth. |
| Connector changes | Required for Red/Node-RED permissions and tokens. |
11. Rollout phases#
Phase 0 โ Inventory and ownership#
- Identify current Discord bridge token/channel/thread ownership.
- Identify safe test guild/channel/token.
- List existing cron/systemd jobs and whether they mutate state.
- Decide board ownership:
pi-boardfor planning, gateway DB for execution.
Acceptance:
- No ambiguous token/channel ownership remains.
- Unsafe or unowned crons are disabled or converted to no-op/report-only drafts before production use.
Phase 1 โ Board and observability baseline#
- Install/review
pi-boardonly after source review. - Install/review
pi-kanbanonly after source review. - Create card template and status mapping.
- Add public safe wiki summary link targets.
Acceptance:
- Board card can represent one work item with acceptance and verification fields.
- Session observability does not expose secrets or raw hidden state publicly.
Phase 2 โ Safe scheduler baseline#
- Wrap host cron jobs with cwd/env/lock/idempotency/status output.
- Document which jobs are host cron vs Pi schedule vs durable gateway schedule.
- Keep
pi-schedule-promptlimited to in-session reminders until durable queue exists.
Acceptance:
- Double-run is prevented by lock.
- Failed runs produce safe visible status.
- No scheduled prompt can silently mutate public docs without verification.
Phase 3 โ Gateway core#
- SQLite WAL migrations.
- Repositories for policies, scopes, sessions, jobs, events, artifacts, approvals, schedules.
- Per-scope FIFO workers.
- Fake adapter emitting assistant/tool/artifact/approval events.
Acceptance:
- Authorized enqueue creates one job.
- Duplicate idempotency key creates no duplicate job.
- Restart preserves queued jobs.
- Fake adapter event replay reconstructs dashboard state.
Phase 4 โ Discord daemon#
discord.jslogin and slash command registration./status,/dash,/ask,/stop.- Component dispatcher and custom ID validation.
- Stream coalescer and dashboard editor.
Acceptance:
- Unauthorized message is ignored and audited.
- Dashboard refresh edits the same message.
- Large output splits safely.
/stopaborts fake long job.
Phase 5 โ OMP/Pi adapters#
- OMP subprocess adapter.
- Optional live OMP extension adapter.
- Session start/resume/compact/abort/model/thinking.
- Thread/session/workspace routing.
Acceptance:
- Test channel can run a harmless prompt.
- Restart behavior is deterministic.
- Existing production bridge remains owner until explicit cutover.
Phase 6 โ Artifacts, approvals, and WebUI#
- Artifact ingest/upload policy.
- Approval cards and WebUI approval panel.
- Local WebUI REST/SSE event replay.
- Setup wizard for token/allowlist/policy.
Acceptance:
- Attachment becomes private artifact before agent use.
- Likely secret artifact cannot upload without denial/approval path.
- Approval buttons reject unauthorized users.
- WebUI shows event replay from cursor.
Phase 7 โ Connector and production cutover#
- Red connector cog/API.
- Node-RED enqueue/subscribe nodes or HTTP examples.
- Test token/channel soak with harmless operations.
- Stop old bridge for production channel only after gates pass.
- Move allowlists to new gateway.
Acceptance:
- Red/Node-RED can enqueue/status without Discord token access.
- Old and new bridge do not race on the same channel.
- Production gate checklist is complete.
12. Production gate checklist#
- Bot logs in and reaches ready.
-
/statusworks only where allowed. - Unauthorized user is ignored and audited.
- Authorized prompt creates exactly one job.
- Duplicate Discord interaction/message ID does not duplicate a job.
- Restart during queued job does not lose the job.
- Restart during running job follows adapter recovery policy.
-
/stopaborts active work and handles queued work by policy. - Dashboard refresh edits the same message.
- Large assistant output splits below Discord limits.
- Tool card transitions running โ success/error.
- Attachments download privately, hash, and link to artifacts.
- Artifact upload denies likely secrets.
- Approval controls reject unauthorized users.
- Cron/schedule jobs cannot overlap.
- WebUI binds localhost unless explicit remote auth exists.
- Red/Node-RED connectors do not receive Discord tokens.
- Public wiki summaries contain no raw logs, secrets, profiles, or session content.
13. First complete slice#
Ship this first, or do not cut over:
- SQLite WAL queue + event log.
- Policy allowlists + idempotency.
- Discord daemon with
/status,/dash,/ask,/stop. - One fake adapter test harness.
- One OMP subprocess adapter.
- Per-channel/thread session scope.
- Stream coalescer + dashboard message editor.
- Private artifact download path.
- Tests/fixtures covering unauthorized user, duplicate interaction, restart recovery, stop, stream split, artifact, and approval denial.
Hard rule: a pretty dashboard without queue persistence and authorization is worse than no dashboard.
14. Operator runbook#
Create a new work item#
1. Create or link `pi-board` card.
2. Fill Outcome / Acceptance / Risk / Verification.
3. Use `/ask` or WebUI to enqueue job.
4. Watch `/dash` or WebUI event stream.
5. Attach artifacts to card/job.
6. Move to Done only after verification evidence exists.
Create a recurring host job#
1. Decide whether this belongs in OS cron, pi-schedule-prompt, or gateway schedules.
2. If OS cron: write wrapper with cwd/env/lock/idempotency/status.
3. If gateway schedule: store schedule row and enqueue jobs through queue.
4. If pi-schedule-prompt: keep it in-session and non-critical.
5. Publish only safe status summaries.
Handle a risky operation#
1. Policy detects risky path/action/upload.
2. Job pauses and emits approval.requested.
3. Discord/WebUI renders approval card.
4. Authorized actor approves/denies.
5. Decision is appended to events.
6. Job resumes or fails safely.
15. Source links#
Local source material:
/home/mc/docs/omp-coms.md/home/mc/docs/omp-pi-plugin-cheatsheet.md/home/mc/docs/discord-gateway-research/INDEX.md/home/mc/docs/discord-gateway-research/CHEATSHEET.md/home/mc/docs/discord-gateway-research/03-gateway-dashboard-blueprint.md/home/mc/docs/discord-gateway-research/04-implementation-contract.md/home/mc/docs/discord-gateway-research/06-interactive-discord-ui.md/home/mc/docs/discord-gateway-research/07-approved-implementation-queue.md/home/mc/wiki/content/hermes/kanban.md/home/mc/wiki/content/operations/recurring-logs.md
External source material:
- https://pi.dev/packages/pi-kanban
- https://nikiforovall.github.io/pi-kanban/docs/
- https://pi.dev/packages/pi-board
- https://pi.dev/packages/pi-schedule-prompt
- https://discord.com/developers/docs/interactions/message-components
- https://discord.com/developers/docs/resources/message
Note: the referenced Discord message URL did not expose private message content through unauthenticated web reads, so this blueprint uses observed local repository research and public primary documentation.