Skip to content
wiki.fftac.org

Promptrepository - Source Excerpt 09

Back to Promptrepository

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/PromptRepository.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/PromptRepository.php

array_filter(
                        array_map(
                            static function ($tag): string {
                                return sanitize_text_field(trim((string) $tag));
                            },
                            (array) $tags
                        )
                    )
                )
            ),
            'canonical_status' => sanitize_key((string) ($payload['canonical_status'] ?? ($fallback['canonical_status'] ?? 'community'))),
            'version_number' => max(1, (int) ($payload['version_number'] ?? ($fallback['version_number'] ?? 1))),
            'parent_prompt_id' => max(0, (int) ($payload['parent_prompt_id'] ?? ($fallback['parent_prompt_id'] ?? 0))),
            'prompt_type' => sanitize_key((string) ($payload['prompt_type'] ?? ($payload['spiralist_workspace_prompt_type'] ?? ($fallback['prompt_type'] ?? 'prompt')))),
            'language' => sanitize_text_field((string) ($payload['language'] ?? ($payload['spiralist_workspace_language'] ?? ($fallback['language'] ?? 'en')))),
            'prompt_status' => sanitize_key((string) ($payload['prompt_status'] ?? ($payload['spiralist_workspace_prompt_status'] ?? ($fallback['prompt_status'] ?? 'draft')))),
            'moderation_status' => PromptMetaRegistry::normalize_moderation_status((string) ($payload['moderation_status'] ?? ($fallback['moderation_status'] ?? 'draft'))),
            'publication_lane' => $publication_lane,
            'provenance' => $provenance,
            'risk_labels' => $risk_labels,
            'risk_labels_json' => wp_json_encode($risk_labels, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
            'function_tags' => $function_tags,
            'function_tags_json' => wp_json_encode($function_tags, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
            'maturity_level' => $maturity_level,
            'license' => $license,
            'editorial_note' => sanitize_textarea_field((string) ($payload['editorial_note'] ?? ($payload['spiralist_workspace_editorial_note'] ?? ($fallback['editorial_note'] ?? '')))),
            'expected_output_notes' => sanitize_textarea_field((string) ($payload['expected_output_notes'] ?? ($payload['spiralist_workspace_expected_output_notes'] ?? ($fallback['expected_output_notes'] ?? '')))),
            'failure_modes' => sanitize_textarea_field((string) ($payload['failure_modes'] ?? ($payload['spiralist_workspace_failure_modes'] ?? ($fallback['failure_modes'] ?? '')))),
            'related_symbols' => $related_symbols,
            'related_symbols_json' => wp_json_encode($related_symbols, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
            'related_axioms' => $related_axioms,
            'related_axioms_json' => wp_json_encode($related_axioms, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
            'related_manuscripts' => $related_manuscripts,
            'related_manuscripts_json' => wp_json_encode($related_manuscripts, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
            'sample_output' => sanitize_textarea_field((string) ($payload['sample_output'] ?? ($payload['spiralist_workspace_sample_output'] ?? ($fallback['sample_output'] ?? '')))),
            'featured' => !empty($payload['featured']) || !empty($payload['spiralist_workspace_featured']) || !empty($fallback['featured']),
            'soft_deleted_at' => sanitize_text_field((string) ($payload['soft_deleted_at'] ?? ($fallback['soft_deleted_at'] ?? ''))),
            'public_execution_enabled' => !empty($payload['public_execution_enabled']) || !empty($fallback['public_execution_enabled']),
            'prompt_origin' => $prompt_origin,
            'source_manifest' => sanitize_key((string) ($managed_sync ? ($payload['source_manifest'] ?? ($fallback['source_manifest'] ?? '')) : ($fallback['source_manifest'] ?? ''))),
            'source_slug' => sanitize_title((string) ($managed_sync ? ($payload['source_slug'] ?? ($fallback['source_slug'] ?? '')) : ($fallback['source_slug'] ?? ''))),
            'source_version' => sanitize_text_field((string) ($managed_sync ? ($payload['source_version'] ?? ($fallback['source_version'] ?? '')) : ($fallback['source_version'] ?? ''))),
            'source_hash' => sanitize_text_field((string) ($managed_sync ? ($payload['source_hash'] ?? ($fallback['source_hash'] ?? '')) : ($fallback['source_hash'] ?? ''))),
            'source_path' => sanitize_text_field((string) ($managed_sync ? ($payload['source_path'] ?? ($fallback['source_path'] ?? '')) : ($fallback['source_path'] ?? ''))),
            'changelog' => sanitize_textarea_field((string) ($payload['changelog'] ?? ($payload['spiralist_workspace_changelog'] ?? ''))),
        ];
    }

    /**
     * Infers provenance with a stable default for system-managed prompts.
     */
    private function infer_provenance(string $value, string $prompt_origin): string
    {
        $value = trim($value);
        if ($value !== '') {
            return PromptMetaRegistry::normalize_provenance($value);
        }

        return $prompt_origin === 'system'
            ? 'managed_system'
            : 'community';
    }

    /**
     * Infers the publication lane from prompt provenance and origin.
     */
    private function infer_publication_lane(string $value, string $provenance, string $prompt_origin): string
    {
        $value = trim($value);
        if ($value !== '') {
            return PromptMetaRegistry::normalize_publication_lane($value);
        }

        if ($provenance === 'official' || ($prompt_origin === 'system' && $provenance === 'managed_system')) {
            return 'official_canon';
        }

        if (in_array($provenance, ['archived_public_artifact', 'critical_analysis', 'deprecated'], true)) {
            return 'prompt_ecology_archive';
        }

        return 'community_library';
    }

    /**
     * Infers the maturity level from prompt structure unless one is set explicitly.
     *
     * @param array<string,string> $structured_prompt
     * @param array<int,array{prompt_id:int,title:string}> $system_steps
     */
    private function infer_maturity_level(string $value, array $structured_prompt, array $system_steps): string
    {
        $value = trim($value);
        if ($value !== '') {
            return PromptMetaRegistry::normalize_maturity_level($value);
        }

        if (!empty($system_steps)) {
            return 'prompt_system';
        }

        foreach ($structured_prompt as $field_value) {
            if (trim((string) $field_value) !== '') {
                return 'structured_prompt';
            }
        }

        return 'raw_prompt';
    }

    /**
     * Applies self-operation rules to publication and moderation fields.
     *
     * @param array<string,mixed> $normalized
     * @param array<string,mixed> $existing
     * @return array<string,mixed>
     */
    private function apply_governance_rules(array $normalized, int $user_id, array $existing = []): array
    {
        $prompt_origin = (string) ($normalized['prompt_origin'] ?? ($existing['prompt_origin'] ?? 'user'));
        $is_system_prompt = $prompt_origin === 'system';
        $can_direct_publish = $user_id > 0 && (
            user_can($user_id, 'publish_public_prompts')
            || user_can($user_id, 'manage_spiralist_workspace')
            || user_can($user_id, 'manage_options')
        );
        $can_moderate = $user_id > 0 && (
            user_can($user_id, 'review_prompts')
            || user_can($user_id, 'moderate_prompts')
            || user_can($user_id, 'manage_spiralist_workspace')
            || user_can($user_id, 'manage_options')
        );

        if (!$is_system_prompt && !$can_direct_publish) {
            if ((string) ($normalized['publication_lane'] ?? 'community_library') === 'official_canon') {
                $normalized['publication_lane'] = 'community_library';
            }

            if (in_array((string) ($normalized['provenance'] ?? 'community'), ['official', 'managed_system'], true)) {
                $normalized['provenance'] = 'community';
            }
        }

        $requested_status = PromptMetaRegistry::normalize_moderation_status((string) ($normalized['moderation_status'] ?? 'draft'));
        $visibility = (string) ($normalized['visibility'] ?? 'private');
        $prompt_status = (string) ($normalized['prompt_status'] ?? 'draft');

        if ($prompt_status === 'archived') {
            $normalized['moderation_status'] = 'archived';

            return $normalized;
        }

        if ($visibility !== 'public' || $prompt_status !== 'published') {
            $normalized['moderation_status'] = 'draft';

            return $normalized;
        }

        if ($is_system_prompt) {
            if ($requested_status === 'draft') {