Skip to content
wiki.fftac.org

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']
        );