AI Wikis / Agentic Web
Talisman of Admin for Teleodynamic.com
Report summary
The Talisman system on UAIX is explicitly a rare, advanced governance pattern for environments that need immutable totem.uai and taboo.uai anchors, external enforcement outside the model , no-op talk-back instead of self-mutation , human review , audit evidence , and rollback . UAIX also states that
Key topics
- AI Wikis / Agentic Web
- AI Wikis
- Agentic Web
- AI
- UAIX
- UAI
- AI Memory
- WordPress
- TypeScript
Research provenance
For citation, use the report title and canonical URL. Archival presence does not establish authorship or promote report statements into portfolio evidence.
Source availability: 54 citation markers in the source export have no recoverable source links. Those markers are omitted from this reader; any supplied bibliography and ordinary links remain. Check the original sources before relying on the cited claims.
This page renders the archived Markdown as safe, formatted HTML. It is background research and does not become a portfolio claim without evidence review.
Full report
On this page
Executive Summary
The Talisman system on UAIX is explicitly a rare, advanced governance pattern for environments that need immutable totem.uai and taboo.uai anchors, external enforcement outside the model, no-op talk-back instead of self-mutation, human review, audit evidence, and rollback. UAIX also states that it is not a runtime controller, endpoint permission system, credential validator, or general safety guarantee; those controls must be implemented locally. For Teleodynamic.com, that means “Talisman of Admin” should be designed less like a generic memory plugin and more like a policy-governed control plane sitting inside WordPress admin, with WordPress handling UI, roles, and administrative workflows while the plugin itself enforces the local implementation boundary that UAIX leaves to operators.
The best-fit architecture is a plugin-first, theme-independent design with a hybrid storage model: use the Options API for durable plugin configuration, a custom post type for human review objects such as change requests, and custom database tables for high-write, relational, and graph-like data such as anchors, versions, action runs, webhook deliveries, and audit logs. That matches WordPress guidance: options are appropriate for setup information, post meta is preferred when practical, but growing plugin data can justify separate tables managed with dbDelta() and version-aware migrations. Plugin activation, uninstall, admin menus, REST route namespaces, and multisite handling also fit naturally in plugin lifecycle hooks rather than theme code. The uploaded background memo usefully frames synchronization and review concerns, but I would still keep this runtime in a standalone plugin so governance survives theme changes and can be administered consistently.
For external AI-agent access, I recommend a REST-first control plane with a versioned namespace such as toa/v1, explicit permission_callback handlers on every route, JSON-schema validation/sanitization, and capability-aware responses. For interactive browser admin, use standard WordPress cookie auth plus X-WP-Nonce; for remote services and richer external integrations, front the plugin with OAuth 2.0 / OpenID Connect and optionally mTLS-bound tokens for high-trust clients. WebSockets are useful for live dashboards and status streams, but not as the canonical mutation API. gRPC is best reserved for an optional sidecar or internal service bridge, not the public plugin surface. That recommendation lines up with WordPress REST patterns, OAuth/OIDC requirements, WebSocket and gRPC protocol properties, OpenAI’s current developer surfaces for Agents, ChatGPT Apps/Actions, MCP/connectors, webhooks, and WebSocket mode, and UAIX’s guidance to keep durable project memory separate from runtime execution.
The most important architectural conclusion is this: external agents should never get a direct “edit protected anchor” capability. In Talisman mode, protected anchors are request-only for agents. Agents can query memory, describe conflicts, propose changes, trigger allowed actions, and emit change requests, but the actual mutation of protected anchors must remain a human-reviewed, audited, out-of-band apply step. That is the single strongest design choice in this report, because it reproduces the central invariant of the UAIX talisman pattern inside WordPress.
Research Basis and Design Principles
UAIX gives four design constraints that should shape the plugin from the start. First, the Talisman system is for complicated, persistent, multi-actor ecosystems, not ordinary chatbots or simple single-agent workflows. Second, talisman.uai, totem.uai, and taboo.uai are read-only to the agent. Third, when an anchor blocks action, the agent must no-op and write a talk-back change request. Fourth, the actual write protection must be enforced by repository protections, filesystem permissions, CI rules, deployment policy, or runtime interception outside the model. A WordPress implementation therefore needs a policy engine, a review queue, immutable audit/version records, and a boundary between “requested” and “applied.”
A second important principle comes from UAIX’s wizard placement rule: talisman setup should not be mixed into the ordinary memory-package authoring flow. UAIX says it belongs behind one advanced gateway link only, with a warning label, while ordinary package creation stays on the normal path. That is a good UI principle for WordPress too. In practice, “Talisman of Admin” should default to standard memory mode and require an explicit Protected Anchor Mode enablement step with warnings, review-owner assignment, checksum policy, and rollback policy before the feature becomes active.
A third principle comes from WordPress itself. Admin pages should be attached through plugin menus guarded by capabilities, with the render callback re-checking capability. REST routes must be registered on rest_api_init, must be namespaced, and should always define permission_callback. Route inputs should be validated and sanitized using route args or REST schema helpers. Nonces help with CSRF and intent, but WordPress is explicit that nonces are not authorization and must be paired with capability checks such as current_user_can().
A fourth principle comes from UAIX’s OpenAI handoff guidance and OpenAI’s current developer surface. UAIX recommends keeping the runtime and the durable project-memory layer separate: OpenAI runs the agents, while repo-local files such as AGENTS.md and .uai/* preserve durable state, constraints, decisions, progress, and verification plans. In parallel, OpenAI’s current developer docs expose relevant surfaces for Apps SDK, ChatGPT Actions, MCP/connectors, webhooks, and WebSocket mode. The practical implication is that the plugin should support both a live API surface and a portable handoff bundle so Teleodynamic can work with multiple current and future agent runtimes without making WordPress the only durable memory location.
flowchart LR
A[WordPress Admin UI] --> B[TOA Application Layer]
C[REST API toa/v1] --> B
D[Optional WebSocket or gRPC Sidecar] --> B
E[External AI Agents<br/>ChatGPT Action / MCP Bridge / Service Client] --> C
B --> F[Policy Enforcer]
B --> G[Change Request Service]
B --> H[Memory Graph Service]
B --> I[Audit and Observability]
B --> J[Backup and Restore]
B --> K[Agent Registry and Webhooks]
F --> L[(toa_anchor)]
F --> M[(toa_anchor_version)]
G --> N[(toa_change_request CPT)]
H --> O[(toa_graph_node)]
H --> P[(toa_graph_edge)]
I --> Q[(toa_action_run)]
I --> R[(toa_audit_log)]
K --> S[(toa_agent_app)]
K --> T[(toa_agent_token)]
K --> U[(toa_webhook_delivery)]
J --> V[(toa_backup_snapshot)]
W[Cron and WP-CLI] --> B
X[Reviewers and Operators] --> A
The architecture above is a design recommendation derived from UAIX’s external-enforcement model, WordPress plugin lifecycle and REST patterns, and the need to separate human-reviewed anchor application from agent-requested change proposals.
Plugin Architecture
I would implement the plugin under a namespace such as Teleodynamic\TalismanOfAdmin, with a top-level module split that reflects real operational boundaries rather than WordPress file categories alone:
| Module | Responsibility |
|---|---|
| Bootstrap | Activation, migration checks, dependency loading, service container bootstrap |
| Admin | Menus, screens, assets, form handlers, WP list tables, review UX |
| Domain Anchors | Protected-anchor rules, current state, versioning, checksum/signature policy |
| Domain Change Requests | Talk-back records, reviewer workflow, apply/reject pipeline |
| Domain Memory Graph | Nodes, edges, search, graph traversal, visualizer payloads |
| Domain Actions | Allowed task execution, dry-run, no-op behavior, idempotency |
| Security | Capability mapping, cookie/nonce auth, token validation, scope enforcement |
| Integrations | REST controllers, webhook dispatching, optional sidecar bridge, export bundle |
| Infrastructure | Custom tables, repositories, cron jobs, encryption helpers, backups, logging |
This modular split is not mandated by WordPress, but it maps cleanly onto the constraints WordPress does set: plugin lifecycle hooks for setup/cleanup, REST controllers registered on rest_api_init, capability-based menus, options/settings storage, privacy exporters/erasers, and cron-triggered maintenance.
Storage model
The storage model should be hybrid.
Use custom tables for canonical operational data because this plugin must support versioned anchors, graph traversals, action run logs, token registries, retry queues, and audit trails. WordPress explicitly notes that setup information generally belongs in options, post meta is preferred when practical, but plugin data that grows with use can appropriately live in separate tables. Those tables should be created and updated with dbDelta(), with a plugin database version checked after updates because activation hooks do not run on plugin upgrade.
Use a custom post type for human review objects because change requests benefit from editorial affordances familiar to WordPress: custom statuses, comments/discussion, author attribution, search, moderation-like list views, and optional revision history. The source of truth for protected-anchor content should still remain in custom tables, but the human review queue fits naturally as a CPT. Custom post type capabilities and map_meta_cap handling make that practical.
Use taxonomies and registered meta sparingly. Taxonomies are useful to classify change requests by request type, risk, or scope. Registered meta is useful for selected CPT metadata that needs schema-aware validation and optional REST exposure.
Proposed schema
| Entity | Storage | Purpose | Key fields | Notes |
|---|---|---|---|---|
toa_anchor | Custom table | Current canonical anchor or memory artifact | id, site_id, anchor_type, slug, title, status, content_format, current_version_id, checksum_sha256, is_protected, sensitivity, created_by, updated_by, created_at_utc, updated_at_utc | anchor_type should at least cover talisman, totem, taboo, and memory_doc. Protected rows are never directly agent-mutable. |
toa_anchor_version | Custom table | Immutable version history for anchors | id, anchor_id, version_no, body, normalized_hash, reason, requested_by, approved_by, approval_status, signed_at_utc, applied_at_utc, rollback_target_version_id | This is the core audit/rollback object. |
toa_change_request | CPT | Human-facing review object for talk-back requests | Title/body + meta such as _toa_target_anchor_id, _toa_blocked_action, _toa_requested_change, _toa_evidence_json, _toa_risk_level, _toa_action_run_id, _toa_source_agent_app_id | Use custom post statuses: toa-pending, toa-approved, toa-rejected, toa-applied, toa-superseded. |
toa_graph_node | Custom table | Memory graph vertices | id, site_id, node_type, external_key, label, summary, payload_json, trust_level, source_anchor_id, created_at_utc, updated_at_utc | Designed for search and visualizers, not for arbitrary raw prompt dumps. |
toa_graph_edge | Custom table | Memory graph relationships | id, site_id, from_node_id, to_node_id, edge_type, weight, metadata_json, source_anchor_id, created_at_utc | Index by (from_node_id, edge_type) and (to_node_id, edge_type). |
toa_action_run | Custom table | Action execution, dry runs, no-ops, run history | id, site_id, request_uuid, agent_app_id, user_id, action_type, state, capability_required, input_json, output_json, idempotency_key, correlation_id, started_at_utc, ended_at_utc | This is the canonical run ledger for dashboarding and webhooks. |
toa_agent_app | Custom table | Registered machine or app client | id, site_id, client_name, client_type, auth_mode, status, scopes_json, redirect_uris_json, jwks_uri, certificate_subject, created_by, created_at_utc | Holds trust metadata for OAuth, OIDC, mTLS, or app-password fallback. |
toa_agent_token | Custom table | Opaque token registry | id, agent_app_id, token_hash, token_type, scope_string, audience, expires_at_utc, last_seen_at_utc, revoked_at_utc, cert_thumbprint | Store token hashes, not raw bearer values. |
toa_webhook | Custom table | Outbound webhook subscription | id, site_id, agent_app_id, event_type, target_url, secret_enc, status, retry_policy_json, created_at_utc | One row per subscriber/event pair or per endpoint with event array, depending on implementation choice. |
toa_webhook_delivery | Custom table | Retryable delivery ledger | id, webhook_id, event_uuid, attempt_no, status, request_headers_json, request_body, response_code, response_excerpt, next_attempt_at_utc, delivered_at_utc | Required for supportability and replay. |
toa_audit_log | Custom table | Authoritative audit trail | id, site_id, actor_type, actor_id, event_type, object_type, object_id, severity, before_json, after_json, ip_hash, user_agent_excerpt, correlation_id, created_at_utc | Keep separate from action runs; not every audit event is an action run. |
toa_backup_snapshot | Custom table | Logical backup manifest | id, site_id, snapshot_type, storage_uri, manifest_json, checksum_sha256, encrypted_key_ref, created_by, created_at_utc, restored_at_utc | Supports audited export/restore flows. |
The storage split above is a proposed schema, but it is grounded in WordPress’s own division of concerns: options for setup data, custom tables for growing plugin data, CPT capabilities for review objects, and taxonomy/meta support when classification or schema-aware metadata is useful.
Custom post types, taxonomies, and meta
I recommend one primary CPT:
toa_change_request: source object for all agent-emitted talk-back records and human-initiated protected-anchor change proposals.
I recommend these taxonomies:
| Taxonomy | Applies to | Example terms | Purpose |
|---|---|---|---|
toa_request_type | toa_change_request | anchor_update, taboo_relaxation, totem_refinement, policy_import, rollback | Operational classification |
toa_risk_level | toa_change_request | low, medium, high, critical | Review routing and SLA |
toa_scope | toa_change_request | site, network, external_agent, privacy | Governance and reporting segmentation |
Recommended registered meta for toa_change_request includes _toa_target_anchor_id, _toa_target_anchor_type, _toa_blocked_action, _toa_requested_change, _toa_evidence_json, _toa_no_op_performed, _toa_action_run_id, _toa_source_agent_app_id, _toa_apply_result_version_id, and _toa_reviewer_summary. Use register_meta() with explicit types, auth callbacks, and REST schema only for fields that truly need API exposure.
Roles and capabilities
WordPress is capability-first, not role-name-first, and explicitly discourages checking role names in place of capabilities. For Talisman of Admin, I would create three plugin roles and a compact capability lattice, then back object-sensitive operations with meta-cap mapping.
| Role | Intended user | Core capabilities |
|---|---|---|
toa_operator | Day-to-day steward of the ecosystem | toa_view_dashboard, toa_read_memory, toa_view_graph, toa_manage_memory, toa_manage_agents, toa_manage_webhooks, toa_export_data, toa_restore_data, toa_manage_settings, toa_view_audit, toa_request_anchor_change |
toa_reviewer | Human approver for protected-anchor changes | toa_view_dashboard, toa_read_memory, toa_view_graph, toa_view_audit, toa_review_anchor_change, toa_apply_anchor_change, toa_view_change_requests |
toa_analyst | Read-only observer / investigator | toa_view_dashboard, toa_read_memory, toa_view_graph, toa_view_audit, toa_view_change_requests |
I would also define meta capabilities such as toa_view_anchor, toa_edit_anchor, toa_review_request, toa_apply_request, and toa_view_audit_record. The meta-cap layer should enforce separation of duties, for example: a requester should not approve their own high-risk protected-anchor change unless they also have an explicit override capability and that override is independently logged. This is a recommended application of WordPress’s meta-cap pattern, not a core requirement, but it aligns very well with the talisman review model.
| Capability | Administrator | TOA Operator | TOA Reviewer | TOA Analyst |
|---|---|---|---|---|
toa_view_dashboard | Yes | Yes | Yes | Yes |
toa_read_memory | Yes | Yes | Yes | Yes |
toa_view_graph | Yes | Yes | Yes | Yes |
toa_manage_memory | Yes | Yes | No | No |
toa_request_anchor_change | Yes | Yes | Optional | No |
toa_review_anchor_change | Yes | No | Yes | No |
toa_apply_anchor_change | Yes | Optional override only | Yes | No |
toa_manage_agents | Yes | Yes | No | No |
toa_manage_webhooks | Yes | Yes | No | No |
toa_view_audit | Yes | Yes | Yes | Yes |
toa_export_data | Yes | Yes | Optional | No |
toa_restore_data | Yes | Yes | No | No |
toa_manage_settings | Yes | Yes | No | No |
This mapping is a recommended cap model built on WordPress role creation, current-user capability checks, post-type capability mapping, and taxonomy capabilities.
Hooks, cron, backup, and restore
The plugin should register the following WordPress hooks and lifecycle behaviors:
| Hook or mechanism | Purpose |
|---|---|
register_activation_hook() | Create tables, seed options, register roles/caps, initialize default schedules |
plugins_loaded | Run database-version checks and migrations because activation hooks do not run on plugin updates |
init | Register CPTs, taxonomies, post statuses, and rewrite-independent objects |
admin_menu / network_admin_menu | Register top-level and sub-menu admin screens |
admin_enqueue_scripts | Load bundled JS/CSS only on plugin screens |
rest_api_init | Register toa/v1 routes with explicit permission_callback |
map_meta_cap filter | Object-sensitive capability translation |
| Privacy exporter/eraser filters | WordPress GDPR tool integration |
| Custom cron hooks | Periodic maintenance, retry queues, retention, signature refresh verification, backup jobs |
register_uninstall_hook() or uninstall.php | Optional full cleanup on delete, not on deactivation |
Cron jobs should exist, but because WP-Cron runs only on page load and can drift on low-traffic sites, I would treat server cron or scheduled WP-CLI invocation as the production-grade path for critical jobs.
Recommended scheduled jobs:
| Job | Cadence | Function |
|---|---|---|
toa_webhook_retry | Every 5 minutes | Redeliver failed webhooks with backoff |
toa_token_reaper | Every 15 minutes | Revoke expired tokens and purge tombstones |
toa_anchor_integrity_check | Hourly | Recompute hashes/signatures and compare against stored state |
toa_metrics_rollup | Hourly | Precompute dashboard counters and graph summaries |
toa_retention_enforce | Daily | Apply data retention and redaction policies |
toa_backup_snapshot | Daily or weekly | Create logical backup packages |
toa_noop_anomaly_scan | Daily | Flag repeated taboo-loosening or constraint-friction patterns |
For backup and restore, I recommend two layers:
Logical plugin backup
- ZIP or tarball containing JSON/YAML exports of anchors, versions, graph nodes/edges, action runs metadata, change request CPT content/meta, webhooks, and settings.
- Signed manifest with checksums.
- Optional field-level encrypted blobs for sensitive payloads.
- Plugin-specific restore endpoint and WP-CLI command.
Full database backup
- Rely on
wp db export/wp db importor hosting backups for disaster recovery. - Use logical plugin exports for audited migration, partial restore, environment promotion, and rollback rehearsal.
That distinction matters because wp export creates WXR files for authors, terms, posts, comments, and attachments, but does not include site configuration or arbitrary plugin tables. Accordingly, Talisman of Admin needs its own logical export/restore path for canonical plugin data.
Admin Experience and Governance Workflow
The admin UX should feel native to WordPress, but it should not feel like a normal content-authoring plugin. In Talisman mode, the UI is fundamentally about controlled review, observability, and high-signal diffs, not free-form editing. That is why the first-run flow should ask for: whether Protected Anchor Mode is really required, who the reviewers are, what files/anchors are protected, what retention policy applies, where backups go, and whether external runtime enforcement exists. If those answers are incomplete, the plugin should refuse to enable Talisman mode and keep the site in ordinary memory mode. That mirrors UAIX’s “all conditions must be true” rule.
The admin surface should be a top-level menu page such as Talisman of Admin with sub-pages. WordPress’s menu APIs are a natural fit here, with capability-gated menu visibility and callback-level capability rechecks.
Recommended screens
| Screen | Primary jobs | Key widgets or components | Default audience |
|---|---|---|---|
| Overview | Executive status and alerts | KPI cards, pending reviews, no-op trend, failed webhooks, integrity summary | Analyst+ |
| Protected Anchors | View current talisman, totem, taboo state | Side-by-side diff view, checksum badge, signer badge, apply history | Reviewer+ |
| Change Requests | Review talk-back queue | Inbox list, severity filters, evidence panel, approve/reject/apply actions | Reviewer+ |
| Memory Graph | Explore memory ecosystem | Graph canvas, node inspector, edge legends, scope/time filters | Analyst+ |
| Action Runs | Inspect allowed actions and no-ops | Stateful run log, dry-run comparisons, correlation IDs, replay metadata | Operator+ |
| Agent Apps | Register and manage external AI clients | Client registry, scopes, auth mode, redirect URIs, certificate subject, revoke buttons | Operator+ |
| Webhooks | Delivery health and replay | Subscription list, backoff state, test delivery, dead-letter queue | Operator+ |
| Audit Trail | Forensic view of all sensitive events | Actor/object/event timeline, export filters, diff snapshots | Analyst+ |
| Backups | Logical export and restore workflows | Snapshot list, verify checksum, restore dry-run, environment labels | Operator+ |
| Settings | Feature flags, retention, privacy, network mode | Tabs for General, Security, Integrations, Privacy, Advanced Rare Use | Operator+ |
The UI above is a recommended composition derived from UAIX’s review and rollback expectations plus WordPress admin patterns for menu pages and settings.
Sample admin mockup
┌──────────────────────────────────────────────────────────────────────────────────────────────┐
│ Talisman of Admin Site: teleodynamic.com Mode: Protected│
├──────────────────────────────────────────────────────────────────────────────────────────────┤
│ Overview │ Anchors │ Change Requests │ Memory Graph │ Action Runs │ Agents │ Audit │ Settings│
├──────────────────────────────────────────────────────────────────────────────────────────────┤
│ KPIs │
│ [Protected Anchors: 3] [Pending Reviews: 5] [No-Op Events 24h: 12] [Failed Webhooks: 1] │
│ [Integrity Drift: 0] [Expired Tokens: 4] [Last Backup: 2026-06-08T05:00:00Z] │
├───────────────────────────────┬──────────────────────────────────────────────────────────────┤
│ Alerts │ Pending Review Queue │
│ • Repeated taboo-loosening │ #CR-104 Update taboo scope High Pending │
│ requests from agent app A │ #CR-105 New totem mission clause Medium Pending │
│ • Webhook retry attempt 3 │ #CR-106 Reindex graph override Low Needs context │
│ • Token nearing expiry │ │
├───────────────────────────────┼──────────────────────────────────────────────────────────────┤
│ Anchor Health │ No-Op / Conflict Trend │
│ talisman.uai ✓ signed │ 7d sparkline + filters by anchor/app/risk │
│ totem.uai ✓ signed │ │
│ taboo.uai ✓ signed │ │
├───────────────────────────────┼──────────────────────────────────────────────────────────────┤
│ Memory Graph Snapshot │ Audit Feed │
│ miniature node graph │ 09:14Z reviewer approved CR-104 │
│ color by trust/sensitivity │ 09:08Z agent app "chatgpt-prod" emitted talk-back │
│ click to inspect │ 08:55Z checksum verification passed │
└───────────────────────────────┴──────────────────────────────────────────────────────────────┘
UX specifics that matter
The Overview screen should surface the metrics that UAIX itself says are operationally meaningful: repeated no-op events, repeated requests to loosen taboo.uai, checksum/signature state, and the health of the review queue. Those are not vanity metrics; they are exactly the patterns UAIX associates with over-constrained ecosystems, unsafe pressure, or prompt injection pressure.
The Protected Anchors screen should not expose a single-click inline editor. Instead, it should show current canonical text, prior versions, normalized diffs, approval history, and an “Open change request” action. A direct edit surface may still exist for explicitly authorized humans, but even that should route through a generated internal change request and produce a versioned apply event rather than silently mutating the current row. That keeps human edits auditable and preserves the same governance pattern as agent proposals. The underlying principle comes directly from UAIX’s talk-back and human-reviewed apply flow.
The Change Requests screen should be the center of gravity. The right-hand detail panel should show:
- target anchor
- blocked action
- requested change
- evidence
- risk summary
- rollback impact
- source agent/app
- linked action run
- compare-before/apply-after diff
- reviewer checklist
- result timeline
That shape mirrors UAIX’s example talk-back record and review requirements.
The Memory Graph screen should support two modes: a topological graph for exploratory investigation and a faceted list for scalable search. Graphs are visually compelling, but large graphs can overwhelm WP-admin. The scalable pattern is to compute neighborhoods server-side and render subgraphs around an anchor, action run, or query phrase. For WordPress admins, that is the difference between a useful visualizer and an unreadable canvas. The graph should also allow “show only protected-anchor influence,” “show only conflict edges,” and “show only action evidence” filters.
The Settings area should have a prominent Advanced Rare Use banner and separate standard memory settings from protected-anchor settings. That is the closest possible translation of UAIX’s “advanced gateway only” rule into WordPress UX.
Security and Agent Integration Design
The security model should be layered because the plugin has three distinct trust contexts: interactive WordPress admins, remote machine clients, and high-accountability protected-anchor operations. The trusted path for a logged-in admin is WordPress cookie auth plus REST nonce. The trusted path for a remote system is OAuth/OIDC or, as a fallback, WordPress Application Passwords over HTTPS. The trusted path for protected-anchor application is never an agent token alone; it always includes reviewer authorization, object-level capability checks, a decision record, and an auditable apply step. That structure is consistent with WordPress REST auth, UAIX’s enforcement boundary, and OAuth’s limited-access model.
Browser and admin security
For WordPress-internal admin requests, use:
- WordPress login cookies
- REST nonces with the
wp_restaction andX-WP-Nonce current_user_can()checks at both route and service-layer boundaries- object-sensitive checks through meta caps
check_admin_referer()for classic form submissions
WordPress is explicit that nonces protect intent and help with CSRF, but they are not authentication or authorization. In other words, the plugin should never treat a valid nonce as sufficient to mutate anchors, approve reviews, or export backups.
All REST routes should:
- register on
rest_api_init - use a versioned namespace such as
toa/v1 - define
permission_callback - validate and sanitize request args through route schema
- return structured errors with correlation IDs
Those are WordPress-native guardrails, and they should be treated as mandatory in this plugin.
Data validation, sanitization, and output safety
Talisman of Admin will inevitably process untrusted input: admin form fields, remote API requests, webhook payloads, and possibly AI-generated change proposals. WordPress’s own guidance is clear: validate as early as possible, prefer safelists and strict comparisons when possible, sanitize general text when necessary, and escape as late as possible on output. For a plugin like this, that means:
- safelist enums such as anchor types, risk levels, actions, and scopes
- regex validation for slugs, callback URLs, and identifier formats
sanitize_text_field()for general single-line stringswp_kses()orwp_kses_post()for reviewer-visible rich textesc_html(),esc_attr(),esc_url(), and friends at render time- REST-schema validation for JSON bodies
- reject malformed arrays/objects early rather than normalizing everything silently
Encryption, transport, and secrets
In transit, require HTTPS for every remote integration. OAuth revocation endpoints must be HTTPS, bearer tokens should be sent in headers not URLs, and WordPress Application Passwords are documented for HTTPS-served REST requests.
At rest, I recommend three different treatments:
- Hash opaque access tokens and refresh tokens, so the database never stores bearer material in plaintext.
- Encrypt reversible secrets such as webhook signing secrets, client secrets, and any cached third-party credentials.
- Leave anchor content plaintext by default, but support field-level encryption for restricted anchors or evidence payloads containing sensitive data.
WordPress’s own Application Passwords guide recommends storing credentials encrypted rather than in plaintext and explicitly mentions libsodium or external secret managers such as Vault. The plugin should follow the same principle for its own machine credentials.
For secrets management, the most robust design is:
- key-encryption keys in environment variables,
wp-config.phpconstants, or external secret/KMS systems - only encrypted data keys or sealed blobs in database rows
- secret rotation UI and cron-assisted rotation reminders
- no long-lived raw secrets in logs, exports, or support bundles
That last point matters as much for compliance as for security.
Protocol and integration options comparison
| Option | Strengths | Weaknesses | Best use | Recommendation |
|---|---|---|---|---|
| HTTPS REST with OpenAPI | Native fit for WordPress REST routes; easiest to secure with capabilities, schema validation, OAuth, and app-password fallback; best match for broad agent interoperability and ChatGPT-style action surfaces | Requires polling or separate streaming channel for live updates | Canonical control plane for anchors, review objects, memory queries, action runs, backups | Primary protocol |
| WebSocket | Standards-based two-way channel; good for live progress, graph updates, webhook monitor streams, and operator dashboards | Poor fit as the main mutation plane in a typical WordPress/PHP runtime; requires a long-lived sidecar or broker | Live dashboards, run status feeds, reviewer presence, event streaming | Optional secondary protocol |
| gRPC | Strongly typed contracts, unary and streaming RPC styles, message ordering within an RPC, code generation | Not a natural public surface for WordPress admin or browser-driven clients; better behind a sidecar | Internal service bridge, telemetry pipeline, heavy graph services | Optional internal bridge only |
| MCP / connector adapter | Aligns with current agent ecosystems and OpenAI’s surfaced tooling areas; can provide tool-style access without exposing raw admin UI | Rapidly evolving ecosystem; still best when backed by a stable canonical API | Agent-facing adapter on top of REST or handoff bundle | Add after REST stabilizes |
| Portable handoff bundle | Vendor-neutral durable memory layer; works even when live mutation should be disallowed | Not suitable for real-time control; requires a sync/apply model | AGENTS.md + .uai export, offline review, agent seeding | Recommended companion surface |
This comparison is based on WordPress REST requirements, the WebSocket RFC, gRPC core concepts, OpenAI’s currently documented product surface, and UAIX’s runtime-versus-durable-memory model.
Authentication options comparison
| Auth pattern | Strengths | Weaknesses | Best-fit client | Recommendation |
|---|---|---|---|---|
| WordPress cookies + REST nonce | Native admin auth, zero extra identity system, strong fit for WP-admin JS | Only works for logged-in WordPress users inside the site context | Internal admin UI | Use for browser admin |
| Application Passwords | Built into WordPress since 5.6; easy fallback for programmatic access over HTTPS; tracks creation and last-used metadata | User-bound, weaker governance for large fleets, not ideal as the long-term enterprise pattern | Small internal automations, dev/test, transitional integrations | Fallback only |
| OAuth 2.0 Authorization Code + OIDC | Limited access, standard user consent, standard identity layer, supports ID Tokens and refresh/offline access patterns | More moving parts; best delivered via external IdP/gateway rather than home-grown in-plugin AS/OP | External human-mediated apps, SSO-backed admin tools, ChatGPT-style user-authorized integrations | Recommended external-facing standard |
| OAuth 2.0 Client Credentials | Standard service-to-service access; limited scopes; no end-user context | Must only be used by confidential clients; not suited to user-delegated review actions | Headless service agents, sidecars, CI/CD automations | Use for service clients only |
| OAuth 2.0 mTLS-bound tokens | Strong proof-of-possession and client identity binding | Operationally heavier, certificate lifecycle burden | High-trust regulated or internal infrastructure clients | Offer as high-assurance option |
The OAuth/OIDC columns above follow the specifications directly: OAuth exists to grant limited access, access tokens should be scoped and short-lived, refresh tokens are optional and can mint narrower-scope access tokens, client credentials are for confidential clients, OIDC Authorization Code flow keeps tokens off the user agent and uses ID Tokens for identity, and OIDC requests require the openid scope if you want OIDC semantics. mTLS can be used for client authentication and/or certificate-bound access tokens.
Token lifecycle, scopes, and rate limits
I recommend the following starting token model:
| Token | Lifetime | Rotation | Storage | Notes |
|---|---|---|---|---|
| Access token | 15–60 minutes | Issue new token on refresh or re-auth | Hash only | Aligns with RFC guidance for short-lived bearer tokens |
| Refresh token | 30 days idle / 90 days absolute | Rotate on each use | Hash only | Optional; only for flows that truly need offline access |
| Application Password | Long-lived but manually revocable | Human-managed rotation | WordPress-managed | Use only as compatibility fallback |
| mTLS-bound access token | 15–30 minutes | Rotate frequently | Hash + cert thumbprint | High-assurance integrations |
Recommended plugin scopes:
toa.readtoa.memory.querytoa.graph.readtoa.change_request.createtoa.change_request.reviewtoa.anchor.applytoa.action.runtoa.webhook.managetoa.audit.readtoa.backup.exporttoa.backup.restoretoa.admin
Recommended starting rate limits:
| Surface | Starting limit |
|---|---|
| Read/list endpoints | 60 req/min/token |
| Graph or memory query | 20 req/min/token |
| Action runs | 10 req/min/token |
| Change request creation | 5 req/min/token |
| Backup export / restore | 1 req / 10 min/token |
| Webhook replay | 3 req/min/operator |
These numbers are recommendations, not spec requirements. The key spec-backed rules are that bearer tokens should be short-lived, scoped, and not sent in URLs, and that revocation and introspection should exist for serious integrations. Introspection should return an active boolean at minimum.
Webhook design
Outbound webhooks should be first-class because they are the cleanest way to notify agents about:
change_request.createdchange_request.reviewedanchor.updatedaction_run.state_changedintegrity_check.failedbackup.created
Recommended webhook envelope:
{
"event_id": "evt_01JZ9P7W9Y8K0ZZZZZZZZZZZZZ",
"event_type": "anchor.updated",
"occurred_at_utc": "2026-06-08T10:14:22Z",
"site_id": 1,
"object": {
"type": "anchor",
"id": 12,
"anchor_type": "taboo",
"version_id": 44
},
"correlation_id": "corr_25df2d15f2d74e2f"
}
Recommended delivery rules:
- sign each request with HMAC SHA-256 on raw body plus timestamp
- include
Idempotency-KeyandX-TOA-Signature - retry with exponential backoff
- persist every attempt in
toa_webhook_delivery - support replay from a bounded retention window
- redact sensitive payload fragments from non-admin views
That is a design recommendation rather than a WordPress or OAuth requirement, but it fits the plugin’s auditability goals and OpenAI’s surfaced webhook-centric integration paths.
Common interaction flows
sequenceDiagram
participant Agent
participant API as TOA REST API
participant Policy as Policy Enforcer
participant Queue as Change Request Queue
participant Reviewer
participant Anchor as Anchor Store
participant Hook as Webhook Dispatcher
Agent->>API: POST /toa/v1/change-requests
API->>Policy: Validate auth, scope, capability, target anchor
Policy-->>API: request_only allowed
API->>Queue: Create pending request
API-->>Agent: 202 Accepted + request_id
Reviewer->>Queue: Review request
alt approved
Queue->>Anchor: Create anchor_version + apply
Anchor-->>Queue: New version + checksum
Queue->>Hook: Emit anchor.updated
Hook-->>Agent: Webhook callback
else rejected
Queue-->>Agent: change_request.reviewed rejected
end
The flow above is the direct translation of UAIX’s “talk back instead of mutate” model into WordPress plugin behavior.
sequenceDiagram
participant Agent
participant API as TOA REST API
participant Policy as Policy Enforcer
participant Graph as Memory Graph
participant Run as Action Runner
participant Queue as Change Request Queue
Agent->>API: POST /toa/v1/memory/query
API->>Policy: Check toa.memory.query scope
Policy-->>API: Allowed
API->>Graph: Search nodes/edges
Graph-->>API: Result set
API-->>Agent: 200 Memory results
Agent->>API: POST /toa/v1/actions/run
API->>Policy: Check action against talisman/totem/taboo
alt action allowed
API->>Run: Execute action
Run-->>API: Result
API-->>Agent: 200 or 202 Run accepted
else blocked by protected anchor
API->>Queue: Create talk-back request
API-->>Agent: 409 noop_blocked + change_request_id
end
This second flow is the most important operational safeguard for remote agents: actions may execute, but protected-anchor conflicts should become no-op plus request, not “best effort mutation.”
Sample REST endpoints
| Method | Path | Purpose | Auth/scope | Notes |
|---|---|---|---|---|
GET | /toa/v1/status | Health and mode summary | Admin cookie or toa.read | Private by default |
GET | /toa/v1/anchors | List anchors | toa.read | Filter by type, sensitivity, status |
GET | /toa/v1/anchors/{id} | Read anchor | toa.read | Includes current version metadata |
GET | /toa/v1/anchors/{id}/versions | Read version history | toa.audit.read | Reviewer/analyst scope |
POST | /toa/v1/change-requests | Create talk-back or human proposal | toa.change_request.create | Canonical mutation request path for agents |
GET | /toa/v1/change-requests | List requests | toa.read or review scope | Support queue filters |
POST | /toa/v1/change-requests/{id}/review | Approve/reject/comment | toa.change_request.review | Human-only in practice |
POST | /toa/v1/change-requests/{id}/apply | Apply approved anchor change | toa.anchor.apply | Human/operator only |
POST | /toa/v1/memory/query | Query memory graph | toa.memory.query | Supports faceted graph and search |
GET | /toa/v1/graph | Read graph neighborhood | toa.graph.read | Use pagination and bounded neighborhoods |
POST | /toa/v1/actions/run | Execute allowed action | toa.action.run | Must pass policy gate |
GET | /toa/v1/actions/runs/{id} | Read action state | toa.read | Includes no-op reason if blocked |
GET | /toa/v1/audit | Read audit feed | toa.audit.read | Strict pagination, export separately |
POST | /toa/v1/webhooks/test | Send test webhook | toa.webhook.manage | Operator-only |
POST | /toa/v1/backups/export | Create logical backup | toa.backup.export | Long-running; consider async state |
POST | /toa/v1/backups/restore | Restore backup | toa.backup.restore | Staging-first and confirmation required |
POST | /toa/v1/oauth/introspect | Token introspection | internal | Resource-server/admin use |
POST | /toa/v1/oauth/revoke | Token or refresh revoke | internal | HTTPS only |
All of these should be registered through register_rest_route() on rest_api_init, with explicit permission callbacks and schema-based argument handling.
Sample API payloads
Create protected-anchor change request
POST /wp-json/toa/v1/change-requests
{
"target_anchor_id": 12,
"target_anchor_type": "taboo",
"blocked_action": "Allow agent to apply anchor mutation directly.",
"requested_change": "Clarify that direct mutation remains forbidden but reviewer may approve a new exception process for staging-only imports.",
"risk_level": "high",
"evidence": {
"anchor_conflict": "Current taboo blocks all autonomous protected-anchor mutation.",
"risk": "Direct agent mutation would violate talisman semantics.",
"rollback_impact": "If approved change causes unsafe loosening, revert to version 43 immediately."
},
"source": {
"agent_app_id": 7,
"action_run_id": 221
}
}
Response
{
"request_id": 104,
"status": "pending_review",
"no_op_performed": true,
"next_allowed_actions": ["query_memory", "await_review"]
}
Query memory
POST /wp-json/toa/v1/memory/query
{
"query": "Find all memory nodes related to webhook signing and protected-anchor review",
"filters": {
"node_types": ["policy", "action", "artifact"],
"anchor_types": ["talisman", "taboo"],
"limit": 25
},
"include_graph": true
}
Run action
POST /wp-json/toa/v1/actions/run
{
"action": "reindex_graph",
"arguments": {
"site_id": 1,
"scope": "protected_anchors"
},
"dry_run": false,
"idempotency_key": "7d2392de-7f09-4cfd-8844-ec6d1c2a5e34"
}
Blocked action response
{
"run_id": 221,
"state": "noop_blocked",
"blocked_by": {
"anchor_type": "taboo",
"anchor_id": 12
},
"change_request_id": 104,
"message": "Protected anchor conflict. No-op performed and review request created."
}
Developer Surface and Sample APIs
The developer surface should be intentionally simple and boring. I would publish three things:
- a stable OpenAPI spec for
toa/v1 - a portable UAIX export bundle generator
- small typed SDKs generated from the OpenAPI spec plus a webhook verifier utility
That gives Teleodynamic the broadest interoperability story: WordPress-native admin usage, external API usage, and agent-runtime seeding through .uai artifacts. The UAIX/OpenAI handoff guide is especially relevant here because it argues for durable project memory in repo-local files like AGENTS.md and .uai/* even when OpenAI or Codex handles the active run. Talisman of Admin should therefore support an “Export Handoff Bundle” action that writes or downloads:
AGENTS.md.uai/context.uai.uai/constraints.uai.uai/progress.uai.uai/test-plan.uai.uai/totem.uai.uai/taboo.uai.uai/talisman.uaiwhen protected-anchor mode is enabled
I would suggest these packages:
| Package | Language | Purpose |
|---|---|---|
teleodynamic/toa-php | PHP | Server-side integration, WordPress plugin extensions, WP-CLI helpers |
@teleodynamic/toa-client | JavaScript/TypeScript | Admin SPA consumption and external browser/server integrations |
teleodynamic-toa | Python | Agent tooling, data science workflows, automation scripts |
teleodynamic/toa-openapi | OpenAPI spec | Contract generation and documentation |
teleodynamic/toa-webhooks | Multi-language examples | Signature verification and replay handling |
PHP example
<?php
declare(strict_types=1);
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'https://teleodynamic.com/wp-json/toa/v1/',
'timeout' => 15,
]);
$token = getenv('TOA_ACCESS_TOKEN');
/**
* Query the Talisman of Admin memory graph.
*/
$response = $client->post('memory/query', [
'headers' => [
'Authorization' => 'Bearer ' . $token,
'Accept' => 'application/json',
],
'json' => [
'query' => 'Find all taboo edges related to webhook replay policy',
'filters' => [
'node_types' => ['policy', 'artifact'],
'limit' => 10,
],
'include_graph' => true,
],
]);
echo $response->getBody()->getContents();
JavaScript example
/**
* Create a protected-anchor change request using the TOA REST API.
*/
async function createChangeRequest(accessToken) {
const response = await fetch("https://teleodynamic.com/wp-json/toa/v1/change-requests", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${accessToken}`
},
body: JSON.stringify({
target_anchor_id: 12,
target_anchor_type: "taboo",
blocked_action: "Direct protected-anchor mutation",
requested_change: "Request reviewer clarification for staging-only exception handling.",
risk_level: "high",
evidence: {
anchor_conflict: "taboo forbids autonomous mutation",
risk: "Applying change without review would violate talisman policy",
rollback_impact: "Rollback to prior taboo version if unsafe loosening occurs"
}
})
});
if (!response.ok) {
throw new Error(`TOA request failed: ${response.status}`);
}
return response.json();
}
Python example
import os
import requests
BASE_URL = "https://teleodynamic.com/wp-json/toa/v1"
TOKEN = os.environ["TOA_ACCESS_TOKEN"]
headers = {
"Authorization": f"Bearer {TOKEN}",
"Accept": "application/json",
"Content-Type": "application/json",
}
payload = {
"action": "reindex_graph",
"arguments": {
"site_id": 1,
"scope": "protected_anchors",
},
"dry_run": False,
"idempotency_key": "fc5f3af7-8d7f-4c0d-9d63-7f4f8fd08f02",
}
response = requests.post(f"{BASE_URL}/actions/run", headers=headers, json=payload, timeout=15)
response.raise_for_status()
print(response.json())
Suggested internal plugin API
Even though the public surface should be REST-first, the internal PHP API should remain strongly separated from transport concerns. I would define service interfaces roughly like this:
interface AnchorRepositoryInterface {}
interface AnchorVersionRepositoryInterface {}
interface ChangeRequestServiceInterface {}
interface PolicyEnforcerInterface {}
interface MemoryGraphServiceInterface {}
interface ActionRunServiceInterface {}
interface AuditLoggerInterface {}
interface AgentAuthServiceInterface {}
interface BackupServiceInterface {}
interface WebhookDispatcherInterface {}
That makes it practical to add:
- a WP-CLI surface later
- a sidecar protocol bridge
- full test doubles for policy, storage, and webhook behavior
- optional network-mode services on multisite
Operations, Compatibility, and Compliance
Testing, CI/CD, and deployment checklist
This plugin should be treated like a governance system, not just a content plugin. That means the test strategy needs to prove both functional correctness and boundary preservation.
| Test layer | What to verify |
|---|---|
| Unit tests | Policy decisions, role/scope checks, diff generation, no-op conversion, token hashing, signature verification |
| WordPress integration tests | Route registration, permission callbacks, plugin activation, migrations, CPT registration, exporter/eraser callbacks |
| Admin UI tests | Screen access by role, review workflow, warning banners, filter persistence, diff rendering |
| API contract tests | OpenAPI conformance, scope enforcement, idempotency, webhook payload shape |
| Security tests | CSRF/nonces, broken access control, token leakage, replay handling, audit completeness |
| Performance tests | Graph neighborhood queries, audit pagination, action-run burst load, webhook retry storms |
| Upgrade tests | Schema drift handling with dbDelta(), version-check runner on update, rollback of failed migration |
| Disaster-recovery tests | Logical export/import, checksum validation, restore dry-run, point-in-time anchor diff |
Recommended deployment checklist:
| Checklist item | Why it matters |
|---|---|
| HTTPS enforced end-to-end | Required for safe remote auth and token usage |
| Review owners configured | UAIX talisman mode depends on named human review paths |
| Protected mode disabled until checks pass | Prevents half-configured governance |
| Production cron source defined | WP-Cron alone may drift on low-traffic sites |
| Backup destination verified | Restore without tested backup is governance theater |
| Audit retention set | Avoid unbounded growth and unclear compliance posture |
| Scope defaults least-privilege | Prevent over-broad agent access |
| Staging smoke test executed | Change-request apply paths must be tested before prod |
| Integrity baseline recorded | Initial checksums/signatures needed for future drift detection |
The WordPress basis for the deployment mechanics is straightforward: use activation hooks for setup, version checks after update, deactivation only for transient cleanup, uninstall for permanent data removal, and staged database export/import for disaster recovery.
Migration and compatibility considerations
WordPress compatibility considerations are mostly about features, not branding:
- If you want core Application Passwords, you need WordPress 5.6+.
- If you want built-in privacy exporter/eraser integration, you need 4.9.6+.
- For modern REST-first admin UX, target current maintained WordPress branches and test both classic admin and block-editor enabled environments.
For multisite, WordPress documents that each site has its own tables while users are shared, and core provides is_multisite() and switch_to_blog() for cross-site operations. My recommendation is:
- Default v1 mode: per-site isolation, using site-prefixed tables and site-local settings.
- Network dashboard: aggregate via
switch_to_blog()for read-only summaries. - Network governance mode: roadmap item, not day-one default, because centralized write paths across sites substantially increase review and migration complexity.
For settings storage, use per-site options by default and site options (_site_ variants / wp_sitemeta) only for truly network-wide policy. WordPress explicitly distinguishes these storage paths in multisite.
Performance, scaling, and monitoring
The main performance risks are predictable:
- graph traversal and visualization payloads
- audit-log growth
- action-run history growth
- webhook retry storms
- expensive network aggregation on multisite
- backup generation on shared hosting
To keep the plugin fast, I recommend these operational defaults:
| Area | Recommendation |
|---|---|
| Graph reads | Bound every graph response by neighborhood depth and node count; render subgraphs, not whole universes |
| Audit feeds | Strict pagination; summary table plus detail drill-down |
| Dashboard metrics | Precompute with hourly rollups instead of expensive live aggregates |
| Search | Separate text search from graph expansion; do not fuse both naively on every request |
| Webhooks | Isolate retries and dead-letter queue from live request handling |
| Backups | Stream to object storage or filesystem archive outside request/response when possible |
| Cron | Use real server scheduler in production, not page-load-only timing |
| Multisite | Cache network summaries and avoid fan-out on every page view |
Monitoring should include:
- anchor integrity failures
- unusual no-op spikes
- repeated taboo-loosening requests
- queue age for pending reviews
- webhook dead-letter counts
- token revoke/expiry anomalies
- backup freshness
- migration result state
UAIX itself identifies repeated no-op events and repeated requests to loosen taboo.uai as signals worth attention. WordPress also warns that WP-Cron is page-load-driven and can drift, which is exactly why critical maintenance should not depend on traffic patterns alone.
Privacy and compliance notes
This plugin will almost certainly process some form of personal data, even if the primary payload is “AI memory,” because audit logs, application metadata, reviewer identities, IP history, webhook destinations, and exported evidence can all become personal data in context. WordPress’s privacy guidance is directly relevant here: plugins should integrate with personal data export and erasure tools and should suggest text for the site privacy policy.
Recommended privacy posture:
| Data class | Suggested default retention | Privacy note |
|---|---|---|
| Access logs / token last-used metadata | 30–90 days | Keep minimal fields; hash IP where possible |
| Webhook deliveries | 30 days | Retain enough for replay/support, not forever |
| Action run payload bodies | 30–90 days | Redact or encrypt if prompts may contain personal data |
| Audit logs | 365 days minimum | Longer only for explicit regulatory need |
| Change requests | 1–3 years | Human review evidence often needs longer retention |
| Expired token tombstones | 7–30 days | Enough for forensics, then purge |
| Logical backups | 30–90 days rolling | Encrypt at rest; test deletion schedules |
For GDPR-style compliance, the plugin should:
- register a personal data exporter callback
- register a personal data eraser/anonymizer callback
- document what is retained and why
- expose retention configuration in admin
- support data minimization per table and field
- separate necessary governance records from optional verbose traces
One subtle but important point: some records should be anonymized rather than deleted if they are needed to preserve system integrity or security for other users. WordPress’s eraser guidance is explicitly about erasing or anonymizing personal data, not necessarily deleting every related system artifact.
Roadmap, Effort, Risks, and Open Questions
Implementation roadmap
| Milestone | Outcome | Effort | Main risks |
|---|---|---|---|
| Foundation | Plugin skeleton, menus, settings, roles/caps, custom tables, migration framework, basic admin shell | Medium | Schema churn early in project |
| Protected-anchor core | toa_anchor, versioning, checksum/signature policy, integrity checks, basic anchor screens | High | Designing immutable-yet-manageable apply semantics |
| Change-request workflow | CPT, review queue, approve/reject/apply, diff engine, no-op conversion path | High | Reviewer UX complexity, separation-of-duties bugs |
| Memory graph | Node/edge schema, query service, graph API, bounded visualizer | High | Performance and graph-sprawl risk |
| Agent integration layer | REST controllers, scopes, token registry, webhook system, OpenAPI spec, SDK stubs | High | Auth architecture decisions, compatibility surface creep |
| Security hardening | Encryption helpers, secret rotation, audit completeness, abuse/rate controls, security review | Medium | Secret storage design and operational burden |
| Backup and privacy | Logical export/restore, WP-CLI commands, exporter/eraser, retention engine | Medium | Restore correctness and compliance edge cases |
| Production readiness | CI/CD, load tests, staging playbooks, multisite read aggregation, documentation | Medium | Environment-specific drift on real hosting |
Principal risks
The largest architectural risk is trying to make WordPress itself the complete identity provider, OAuth authorization server, OpenID provider, WebSocket broker, graph engine, and durable memory authority all at once. It can be done, but the complexity cost is high. A better pattern is:
- WordPress plugin as the control plane and canonical policy UI
- external IdP or auth gateway for serious OAuth/OIDC
- optional sidecar for WebSocket/gRPC
- optional repo-local
.uaibundle for durable cross-runtime memory
The largest governance risk is accidentally exposing a direct protected-anchor mutation path to remote agents. That would violate the core Talisman invariant and reduce the plugin to a normal admin tool with better marketing. Protected-anchor changes must remain request/review/apply, not request/apply.
The largest operational risk is inadequate review ownership. UAIX is explicit that talisman mode requires named reviewer paths, audit records, rollback evidence, and no-op tolerance. If Teleodynamic cannot commit to that operating model, the right answer is to use ordinary memory-mode features and stop short of full talisman mode.
Open questions and limitations
A few design decisions remain materially important and should be resolved before implementation starts:
| Open question | Why it matters |
|---|---|
| Should the plugin implement only a resource server, or also a full OAuth/OIDC authorization server? | This changes complexity and security review effort substantially. |
Is the canonical memory source WordPress-only, or WordPress plus synchronized .uai files in Git/repo storage? | This affects backup, deployment, conflict resolution, and agent portability. |
| Does Teleodynamic need per-site isolation only, or centralized multisite governance? | This affects schema scope, dashboards, and reviewer flows. |
| How sensitive will action-run bodies and evidence payloads be? | This determines default encryption and retention policy. |
| Are external agents allowed to execute business actions directly, or only query and request? | This determines how broad the API surface should be in v1. |
My highest-confidence recommendation is to start with site-local governance, REST-first APIs, request-only agent mutation for protected anchors, an external IdP for serious OAuth/OIDC, and a portable handoff export path. That combination is the cleanest match to UAIX’s talisman boundary, WordPress’s plugin architecture, and current AI-agent integration realities.