Class Uai1 Memory Checkpoints - Source Excerpt 01
Back to Class Uai1 Memory Checkpoints
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-memory-checkpoints.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-memory-checkpoints.php
<?php
if (!defined('ABSPATH')) {
exit;
}
class UAI1_Memory_Checkpoints
{
private const UAIX_NAMESPACE = 'uaix/v1';
private const UAIX_CONTENT_TYPE = 'application/vnd.uaix.uai+json; charset=utf-8';
private const META_KEY = 'uai1_runtime_memory_checkpoints';
private const MAX_CHECKPOINTS_PER_USER = 50;
private const SYMBOL_REFS = [
'protocol5.symbol.circle',
'protocol5.symbol.dual-circle',
'protocol5.symbol.triangle',
'protocol5.symbol.square',
'protocol5.symbol.spiral',
];
public static function register_rest_routes(): void
{
register_rest_route(
self::UAIX_NAMESPACE,
'/memory-checkpoints',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [self::class, 'rest_create_memory_checkpoint'],
'permission_callback' => [self::class, 'can_manage_memory_checkpoint'],
]
);
register_rest_route(
self::UAIX_NAMESPACE,
'/memory-drift-audits',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [self::class, 'rest_audit_memory_drift'],
'permission_callback' => [self::class, 'can_manage_memory_checkpoint'],
]
);
register_rest_route(
self::UAIX_NAMESPACE,
'/session-restore-briefs',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [self::class, 'rest_build_session_restore_brief'],
'permission_callback' => [self::class, 'can_manage_memory_checkpoint'],
]
);
}
public static function can_manage_memory_checkpoint(): bool
{
return is_user_logged_in() && current_user_can('read');
}
public static function rest_create_memory_checkpoint(WP_REST_Request $request): WP_REST_Response
{
$payload = self::request_payload($request);
$validation = self::validate_intent_request(
$payload,
'spiralist.memory.checkpoint.create',
['session_id', 'checkpoint_label', 'turn_window', 'summary']
);
if (!$validation['valid']) {
return self::error_response($payload, 'invalid_memory_checkpoint', (string) $validation['message'], 400);
}
$parameters = self::parameters($payload);
$checkpoint = [
'checkpoint_id' => 'memchk_' . wp_generate_uuid4(),
'storage_class' => 'runtime-execution-payload',
'registry_authority' => 'none',
'protocol5_registry_write_allowed' => false,
'protocol5_registry_write_attempted' => false,
'session_id' => sanitize_text_field((string) $parameters['session_id']),
'participant_id' => sanitize_text_field((string) ($parameters['participant_id'] ?? '')),
'checkpoint_label' => sanitize_text_field((string) $parameters['checkpoint_label']),
'turn_window' => self::sanitize_turn_window((array) $parameters['turn_window']),
'summary' => sanitize_textarea_field((string) $parameters['summary']),
'stable_facts' => self::sanitize_text_list((array) ($parameters['stable_facts'] ?? [])),
'open_tasks' => self::sanitize_text_list((array) ($parameters['open_tasks'] ?? [])),
'unresolved_questions' => self::sanitize_text_list((array) ($parameters['unresolved_questions'] ?? [])),
'persona_constraints' => self::sanitize_text_list((array) ($parameters['persona_constraints'] ?? [])),
'canonical_symbol_refs' => self::filter_symbol_refs((array) ($parameters['canonical_symbol_refs'] ?? [])),
'runtime_entropy' => self::sanitize_runtime_entropy((array) ($parameters['runtime_entropy'] ?? [])),
'redactions' => self::sanitize_redactions((array) ($parameters['redactions'] ?? [])),
'created_at' => gmdate('c'),
];
self::store_checkpoint(get_current_user_id(), $checkpoint);
return self::intent_response(
$payload,
[
'status' => 'ok',
'subject' => 'workspace.session',
'request_message_id' => (string) ($payload['message_id'] ?? ''),
'result' => [
'checkpoint' => $checkpoint,
'function' => 'Creates a bounded runtime checkpoint for long AI sessions without mutating Protocol5 canonical assets.',
],
'notices' => [
'runtime-payload-only',
'protocol5-registry-not-mutated',
'human-review-required-before-reuse',
],
]
);
}
public static function rest_audit_memory_drift(WP_REST_Request $request): WP_REST_Response
{
$payload = self::request_payload($request);
$validation = self::validate_intent_request(
$payload,
'spiralist.memory.drift.audit',
['session_id', 'baseline_checkpoint_id', 'current_turn_id', 'current_session_digest']
);
if (!$validation['valid']) {
return self::error_response($payload, 'invalid_memory_drift_audit', (string) $validation['message'], 400);
}
$parameters = self::parameters($payload);
$baseline = self::find_checkpoint(get_current_user_id(), (string) $parameters['baseline_checkpoint_id']);
$observed_claims = self::sanitize_text_list((array) ($parameters['observed_claims'] ?? []));
$contradiction_checks = self::sanitize_contradiction_checks((array) ($parameters['contradiction_checks'] ?? []));
$persona_constraints = self::sanitize_text_list((array) ($parameters['persona_constraints'] ?? []));
$metrics = [
'turn_count' => (int) ($parameters['turn_count'] ?? count($observed_claims)),
'checkpoint_count' => count(self::read_checkpoints(get_current_user_id())),
'unresolved_task_count' => count((array) ($baseline['open_tasks'] ?? [])),
'contradiction_count' => count($contradiction_checks),
'correction_count' => (int) ($parameters['correction_count'] ?? 0),
'hallucination_flag_count' => (int) ($parameters['hallucination_flag_count'] ?? 0),
'canonical_lookup_count' => count((array) ($parameters['canonical_lookup_refs'] ?? [])),
'canonical_symbol_ref_count' => count(self::filter_symbol_refs((array) ($parameters['canonical_symbol_refs'] ?? []))),
'repeated_claim_count' => max(0, count($observed_claims) - count(array_unique($observed_claims))),
'novelty_event_count' => (int) ($parameters['novelty_event_count'] ?? 0),
'paradox_resolution_count' => (int) ($parameters['paradox_resolution_count'] ?? 0),
'human_reviewed' => !empty($parameters['human_reviewed']),
'last_checkpoint_age_turns' => (int) ($parameters['last_checkpoint_age_turns'] ?? 0),
];
$classification = self::classify_runtime_entropy($metrics);
$drift_score = self::calculate_drift_score($metrics, $baseline, $persona_constraints);
return self::intent_response(
$payload,
[
'status' => 'ok',
'subject' => 'workspace.session',
'request_message_id' => (string) ($payload['message_id'] ?? ''),
'result' => [
'storage_class' => 'runtime-execution-payload',
'registry_authority' => 'none',
'protocol5_registry_write_allowed' => false,
'protocol5_registry_write_attempted' => false,
'baseline_checkpoint_found' => !empty($baseline),
'drift_score' => $drift_score,
'drift_level' => $drift_score >= 0.66 ? 'high' : ($drift_score >= 0.33 ? 'moderate' : 'low'),
'runtime_entropy' => $classification,
'function' => 'Audits a long-running session for semantic drift against checkpointed constraints and canonical symbol references.',
],
'notices' => [
'audit-result-is-not-canonical-truth',
'runtime-payload-only',
'query-protocol5-for-canonical-symbol-records',
],
]
);
}
public static function rest_build_session_restore_brief(WP_REST_Request $request): WP_REST_Response
{
$payload = self::request_payload($request);
$validation = self::validate_intent_request(
$payload,
'spiralist.memory.restore.brief',
['session_id', 'checkpoint_ids']
);